/*normaliz macro is designed to calculate several different */ /*normalization schemes for the signal intensities of */ /*microarray analyses. */ /* The following normalizations are performed: */ /* natural log of the signal intensity */ /* log base 10 of the signal intensity */ /* divided by the median within the specified class(es) */ /* natural log and divided by the median normalized */ /* square root of the signal intensity */ /* rank normalized */ /* standardized */ /* quartile normalized */ %macro normaliz(infile,signal,factor1,factor2,factor3,suffix); data add_log; set &infile; log_&signal=log(&signal); run; proc means data=&infile median noprint; class &factor1 &factor2; var &signal log_&signal; output out=&factor1&factor2&factor3.med median(&signal)=median q1(&signal)=q1 q3(&signal)=q3 min(&signal)=min max(&signal)=max p95(&signal)=p95 p99(&signal)=p99 mean(log_&signal)=mean_log std(log_&signal)=std_log; run; data &factor1&factor2&factor3.med1; set &factor1&factor2&factor3.med; where _type_=3; run; proc sort data=&infile; by &factor1 &factor2 &factor3; run; data med_merge; merge &factor1&factor2&factor3.med1 &infile; by &factor1 &factor2 &factor3; run; data quartiles; set med_merge; if &signal < q1 then &signal._quartile=1; if &signal ge q1 and &signal < median then &signal._quartile=2; if &signal ge median and &signal < q3 then &signal._quartile=3; if &signal ge q3 then &signal._quartile=4; sqrt_&signal=sqrt(&signal); log10_&signal=log10(&signal); &signal._med&suffix=&signal/median; log_&signal._med&suffix=log(&signal._med&suffix); std_&signal=(log_&signal-mean_log)/std_log; drop _type_ _freq_ mean_log std_log; run; proc rank data=quartiles out=anova_&signal._norm; by &factor1 &factor2 &factor3; var &signal; ranks &signal._rank; run; %mend normaliz;