Meta-Analysis
Copyright ©The Author(s) 2015.
World J Meta-Anal. Oct 26, 2015; 3(5): 215-224
Published online Oct 26, 2015. doi: 10.13105/wjma.v3.i5.215
Table 2 Example of SAS code to simulate a meta-analysis on 15 datasets with 15 records generated from a Gamma distribution (alpha = 2 and beta = 5 vs alpha = 2 and beta = 7 for the treatment and control groups, respectively)
* q is the assigned library;
**************************************************;
* SIMULATIONS;
**************************************************;
%let s = gamma;
%let ndset = 15;
* Simulation of n = 15 dataset using the Gamma distributions;
%macro simul;
%do q = 1 %to &ndset;
%let seed = %sysevalf(1234567 + &q);
%let num_i = %sysevalf(&ndset);
%let v = %sysevalf(0 + &q);
data s&q;
k = &q;
%do i = 1%to &num_i;
var1 = 5*rangam(&seed,2);
var2 = 7*rangam(&seed,2);
output;
%end;
run;
%end;
* Dataset combining;
data simul_&s;
set
%do w = 1%to &ndset;
s&w
%end;
;
run;
%mend;
%simul;
* Descriptive statistics for each dataset;
ods trace on;
ods output summary = summary_&s;
proc means data = simul_&s mean std median q1 q3;
class k;
var var1 var2;
run;
ods trace off;
data summary_&s;
set summary_&s;
l1 = (var1_Median-var1_Q1)/0.6745;
l2 = (var2_Median-var2_Q1)/0.6745;
u1 = (var1_Q3-var1_Median)/0.6745;
u2 = (var2_Q3-var2_Median)/0.6745;
if l1 > u1 then MeSD_v1_cons=l1; else MeSD_v1_cons=u1;
if l2 > u2 then MeSD_v2_cons=l2; else MeSD_v2_cons=u2;
if l1 > u1 then MeSD_v1_prec=u1; else MeSD_v1_prec=l1;
if l2 > u2 then MeSD_v2_prec=u2; else MeSD_v2_prec=l2;
MeSD_v1_mean=(var1_Q3-var1_Q1)/1.349;
MeSD_v2_mean=(var2_Q3-var2_Q1)/1.349;
* Median difference;
MeD = var1_Median-var2_Median;
*1 conservative estimate of standard deviation;
a1sd = ((MeSD_v1_cons)**2)/NObs;
b1sd = ((MeSD_v2_cons)**2)/NObs;
MeSD_cons=sqrt(a1sd + b1sd);
*2 less conservative estimate of standard deviation;
a2sd = ((MeSD_v1_prec)**2)/NObs;
b2sd = ((MeSD_v2_prec)**2)/NObs;
MeSD_prec = sqrt(a2sd + b2sd);
*3 mean estimate of standard deviation;
a3sd = ((MeSD_v1_mean)**2)/NObs;
b3sd = ((MeSD_v2_mean)**2)/NObs;
MeSD_mean = sqrt(a3sd + b3sd);
*4 Interquartile range;
a4sd = ((var1_Q3-var1_Q1)**2)/NObs;
b4sd = ((var2_Q3-var2_Q1)**2)/NObs;
MeSD_iqr = sqrt(a4sd + b4sd);
* Mean difference and pooled standard deviation;
MD = var1_Mean-var2_Mean;
asd = ((var1_StdDev)**2)/NObs;
bsd = ((var2_StdDev)**2)/NObs;
SD = sqrt(asd + bsd);
drop l1 l2 u1 u2 asd bsd a1sd b1sd a2sd b2sd a3sd b3sd a4sd b4sd;
run;
*************************;
* Meta-analyses;
data sum_&s;
set summary_&s;
keep k NObs MeD MeSD_cons MeSD_prec MeSD_mean MeSD_iqr MD SD qq;
run;
*1 Median and conservative estimate of standard deviation;
data meta_&s.1;
set sum_&s;
model = "Conservative SD";
MDz = MeD;
SDz = MeSD_cons;
w = 1/(SDz**2);
MDw = MDz*w;
keep model k NObs MDz SDz w MDw;
run;
*2 Median and less conservative estimate of standard deviation;
data meta_&s.2;
set sum_&s;
model = "Less Conservative SD";
MDz = MeD;
SDz = MeSD_prec;
w = 1/(SDz**2);
MDw = MDz*w;
keep model k NObs MDz SDz w MDw;
run;
*3 Median and mean estimate of standard deviation;
data meta_&s.3;
set sum_&s;
model = "Mean SD";
MDz = MeD;
SDz = MeSD_mean;
w = 1/(SDz**2);
MDw=MDz*w;
keep model k NObs MDz SDz w MDw;
run;
*4 Median and interquartile range;
data meta_&s.4;
set sum_&s;
model = "IQR";
MDz = MeD;
SDz = MeSD_iqr;
w = 1/(SDz**2);
MDw = MDz*w;
keep model k NObs MDz SDz w MDw;
run;
*Mean and standard deviation (reference);
data meta_&s.5;
set sum_&s;
model = "Reference";
MDz = MD;
SDz = SD;
w = 1/(SDz**2);
MDw = MDz*w;
keep model k NObs MDz SDz w MDw;
run;
proc format;
value model
1 = "conservative SD"
2 = "Less Conservative SD "
3 = "Mean SD "
4 = "IQR"
5 = "Reference"
;
run;
*** Fixed effect model meta-analysis - Inverse of Variance method;
%macro meta_iv;
%do i = 1%to 5;
ods output Summary = somme&i;
proc means data = meta_&s&i sum;
var MDw w;
run;
data somme&i;
set somme&i;
model = &i;
format model model.;
theta = MDw_Sum/w_Sum;
se_theta = 1/(sqrt(w_sum));
lower = theta - (se_theta*1.96);
upper = theta + (se_theta*1.96);
mtheta = sqrt(theta**2);
CV = se_theta/mtheta;
keep model theta se_theta lower upper cv;
run;
%end;
data aaMeta_&s;
set
%do w = 1% to 5;
somme&w
%end;
;
run;
title "distr = &s - k = &ndset";
proc print; run;
%mend;
%meta_iv;