%macro globss(lambda,corr,power,alpha); /* Implements sample size calculations in studies with two arms based on the O'Brien OLS and GLS tests. Written by Alex Dmitrienko. Inputs: LAMBDA = Data set with effect sizes for each variable CORR = Data set with the correlation matrix POWER = Power ALPHA = One-sided Type I error rate */ proc iml; use λ read all into lambda; * Effect sizes; use &corr; read all into r; * Correlation matrix; m=nrow(lambda); * Number of endpoints; j=j(m,1,1); * Vector of ones; * Operational effect size for OLS test; ols=t(j)*lambda/sqrt(t(j)*r*j); * Operational effect size for GLS test; gls=t(j)*inv(r)*lambda/sqrt(t(j)*inv(r)*j); print "Operational effect size for OLS test: " ols [format=6.2]; print "Operational effect size for GLS test: " gls [format=6.2]; z_alpha=probit(1-&alpha); z_beta=probit(&power); nols=ceil(2*(z_alpha+z_beta)*(z_alpha+z_beta)/(ols*ols)); ngls=ceil(2*(z_alpha+z_beta)*(z_alpha+z_beta)/(gls*gls)); print "Sample size per arm for OLS test: " nols [format=4.0]; print "Sample size per arm for GLS test: " ngls [format=4.0]; quit; %mend globss; * Example: Osteoarthritis trial; * Effect sizes (treatment and control); data lambda; input lambda; datalines; 0.25 0.33 ; * Correlation matrix; data corr; input var1 var2; datalines; 1 0.36 0.36 1 ; %globss(lambda=lambda,corr=corr,power=0.8,alpha=0.025);