** Header ****; proc format; invalue sexo 'M' =1 'F' =2 ; value sexf 1=' Male' 2=' Female' ; invalue raceo 'AMERICAN INDIAN OR ALASKA NATIVE' =1 'ASIAN' =2 'BLACK OR AFRICAN AMERICAN' =3 'NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER' =4 'WHITE' =5 'NOT REPORTED','UNKNOWN' =6 'OTHER' =7 ; value racef 1=' American Indian or Alaska Native' 2=' Asian' 3=' Black or African American' 4=' Native Hawaiian or Other Pacific Islander' 5=' White' 6=' Not Reported or Unknown' 7=' Other' ; invalue ethnico 'HISPANIC OR LATINO'=1 'NOT HISPANIC OR LATINO'=2 ; value ethnicf 1=' Hispanic or Latino' 2=' Not Hispanic or Latino' ; value htpctf 1 =' <=3' 2 =' 4 - 49' 3 =' 50 - 97' ; value bmpctf 1 =' <5' 2 =' 5 - 84' 3 =' 85 - 94' 4 =' >=95' ; value smnrf 1=' SMN1 Gene Therapy' 2=' SMN2 Upregulator Therapy' ; value smndurf 1=' < 6' 2=' >= 6' ; invalue regiono 'Europe' =1 'North America' =2 ; value regionf 1=' Europe' 2=' North America' ; run; data adsl_0; set adam.adsl; if randfl='Y'; sexn=input(sex, sexo.); racen=input(race, raceo.); ethnicn=input(ethnic, ethnico.); regionn=input(region1, regiono.); trtn=trt01an; trt=trt01a; output; trtn=9; trt='Total'; output; run; proc sort data=adsl_0; by trtn trt usubjid; run; **** get denom *******; proc freq data=adsl_0 noprint; table trtn*trt / out=denom(rename=(count=bign) drop=percent); run; data denom2; set denom; length str1 lbl $40; str1=strip(put(bign, best.)); if trtn=1 then lbl='0.75 mg/kg~(N='||strip(str1)||')'; else if trtn=2 then lbl='7.5 mg/kg~(N='||strip(str1)||')'; else if trtn=9 then lbl='Total~(N='||strip(str1)||')'; run; proc transpose data=denom2 out=allcols(drop=_:) prefix=col; var str1; id trtn; idl lbl; run; %macro calc_mean(din=adsl_0, var=, dec=1, ord1=, rowlbl=); %let dsnout=summ%sysfunc(putn(&ord1, z2.)); proc means data=&din noprint ; var &var; by trtn; output out=mn0_&ord1. n=n mean=mean std=std min=min max=max median=median p25=p25_ p75=p75_; run; data mn1_&ord1.; set mn0_&ord1.; length nstr mnstr medstr mmstr qrtstr $200; nstr=strip(put(n,best.)); if n>0 then do; mnstr=strip(put(mean,8.&dec.))||' ('||strip(put(std,8.%eval(&dec.+1)))||')'; if index(mnstr, '()') then mnstr=tranwrd(mnstr, '()', '(---)'); medstr=strip(put(median,8.&dec.)); mmstr=strip(put(min,8.%eval(&dec.-1)))||', '||strip(put(max,8.%eval(&dec.-1))); qrtstr=strip(put(p25_,8.&dec.))||', '||strip(put(p75_,8.&dec.)); end; run; proc transpose data=mn1_&ord1. out=mnt_&ord1. prefix=col; id trtn; var nstr mnstr medstr mmstr; * qrtstr; run; data &dsnout; set mnt_&ord1.; length subtxt rowlbl $200; ord1=&ord1; rowlbl="&rowlbl"; if upcase(_name_)='NSTR' then do; ord2=1; subtxt=' n'; end; else if upcase(_name_)='MNSTR' then do; ord2=2; subtxt=' Mean (SD)'; end; else if upcase(_name_)='MEDSTR' then do; ord2=3; subtxt=' Median'; end; else if upcase(_name_)='MMSTR' then do; ord2=4; subtxt=' Min, Max'; end; run; %mend calc_mean; %macro calc_freq(din=adsl_0, var=, rowlbl=, fmt=, rows=, denomdsn=denom, ord1=, whr= ); %let dsnout=summ%sysfunc(putn(&ord1, z2.)); proc freq data=&din noprint; tables %sysfunc(tranwrd(&var, %str( ), %str(*))) / out=fq&ord1; by trtn trt; &whr; run; data pct&ord1; merge &denomdsn.(in=a) fq&ord1.(in=b); by trtn trt; if a and b; length str1 $20; pct=(count/bign)*100; if pct=100 then str1=strip(put(count, best.))||' (100)'; else if nmiss(bign, count)=0 then str1=strip(put(count, best.))||' ('||strip(put(pct, 8.1))||')'; else str1='0'; run; proc sort data=pct&ord1; by &var trtn trt; run; proc transpose data=pct&ord1 out=pct&ord1.t(drop=_:) prefix=col; var str1; by &var; id trtn; run; %if &rows ne %then %do; data allrows; do &var=&rows; output; end; run; data pct&ord1.t; merge pct&ord1.t(in=a) allrows(in=b); by &var; if b; run; %end; data &dsnout; set allcols(obs=0) pct&ord1.t; length rowlbl subtxt $100; ord1=&ord1; ord2=&var; rowlbl="&rowlbl"; subtxt=put(&var, &fmt..); array allcols{*} col:; do i=1 to dim(allcols); if allcols{i}='' then allcols{i}='0'; end; drop i; run; %mend calc_freq; ******* Age ************; %calc_mean(var=age, ord1=1, rowlbl=%str(Age at Screening (months))); ******* Sex ************; %calc_freq(var=sexn, ord1=2, fmt=sexf, rowlbl=%str(Sex, n (%%))); ******* Race ************; %calc_freq(var=racen, ord1=3, fmt=racef, rows=%str(1, 2, 3, 4, 5, 6, 7), rowlbl=%str(Race, n (%%) [a])); ******* Ethnic ************; %calc_freq(var=ethnicn, ord1=4, fmt=ethnicf, rowlbl=%str(Ethnicity, n (%%))); ******* Gestational Age ************; %calc_mean(var=gestage, ord1=5, rowlbl=%str(Gestational Age at Birth (weeks))); ******* Gestational Weight ************; %calc_mean(var=gestwt, ord1=6, rowlbl=%str(Gestational Weight at Birth (kg))); ******* Baseline Height ************; %calc_mean(var=heightbl, ord1=7, rowlbl=%str(Baseline Height (cm) [b])); ******* Baseline Height Percentile ************; %calc_freq(var=hpbgr1n, ord1=8, fmt=htpctf, rowlbl=%str(Baseline Height Percentile, n)); ******* Baseline Weight ************; %calc_mean(var=weightbl, ord1=9, rowlbl=%str(Baseline Weight (kg))); ******* Baseline Weight Percentile ************; %calc_freq(var=wpbgr1n, ord1=10, fmt=htpctf, rowlbl=%str(Baseline Weight Percentile, n)); ******* Baseline BMI ************; %calc_mean(var=bmibl, ord1=11, rowlbl=%str(Baseline BMI (kg/m2))); ******* Baseline BMI Percentile ************; %calc_freq(var=bmpbgr1n, ord1=12, fmt=bmpctf, rowlbl=%str(Baseline BMI Percentile, n)); ******* SMN Therapy at Randomization ************; %calc_freq(var=strat1rn, ord1=13, fmt=smnrf, rowlbl=%str(SMN Therapy at Randomization, n (%%))); ******* Treatment Duration of SMN Therapy ************; %calc_freq(var=strat2rn, ord1=14, fmt=smndurf, whr=%str(where strat2rn ne .), rowlbl=%str(Treatment Duration of SMN Therapy (months))); ******* Region ************; %calc_freq(var=regionn, ord1=15, fmt=regionf, whr=%str(where regionn ne .), rowlbl=%str(Region, n (%%))); data allsumm; set summ:; run; data fin0; set allsumm; cat=ord1; if ord1=4 then subcat=99; else subcat=ord2; if 1<=cat<5 then pg=1; else if 5<=cat<9 then pg=2; else if 9<=cat<13 then pg=3; else if 13<=cat then pg=4; keep pg cat subcat rowlbl subtxt col:; rename rowlbl=txt; run; proc sort data=fin0 out=qcout.&dsname.; by cat subcat; run; **** compare with prod *****; %let proddsn=%sysfunc(substr(&dsname.,4)); title "QC of &proddsn"; %qccompare(ds=qcdata.&proddsn, qcds=qcout.&dsname, idvars=%str(cat subcat subtxt), crit=);