森林图(Forest plot)是以统计指标和统计分析方法为基础,用数值运算结果绘制出的图型。它在平面直角坐标系中,以一条垂直的无效线(横坐标刻度为1或0)为中心,用平行于横轴的多条线段描述了每个被纳入研究的效应量和可信区间(confidence interval,CI)。森林图是Meta分析中最常用的结果表达形式,当然类似的结果也可以用森林图来展示,比如上图即展示了两处理组在各个亚组因素的反应率的差异的95%可信区间。
假设统计分析的结果如下:
在画图之前我们要构造一个变量,即图中的变量ORD2,以保证数据集中的记录在图中能按顺序来显示,如本例中可以通过以下程序来得到变量ORD2,其中的ORD1的值是根据分组因素顺序定义的:
ORD2=36-_N_-(ORD1-1);
开始画图:
/*字体*/
%let ftext ='Albany AMT/roman/medium';
/*编译宏*/
%annomac;
data anno1;
length TEXT $200.;
%system(3, 3);
%label(52, 97, 'Treatment Difference', black, 0, 0, 1.2, &ftext., 5)
%label(1, 92, 'Subgroup', black, 0, 0, 1.1, &ftext.,6);
%label(63, 92, 'Difference(95%CI)', black, 0, 0, 1.1, &ftext.,6);
%label(81, 95, 'Response Rates(%)', black, 0, 0, 1.2, &ftext., 6) ;
%label(82, 92, 'TRTA', black, 0, 0, 1.1, &ftext., 6);
%label(92, 92, 'TRTB', black, 0, 0, 1.1, &ftext., 6);
%label(32, 6, 'Favors TRTA', black, 0, 0, 1.1, &ftext., 4);
%label(56, 6, 'Favors TRTB', black, 0, 0, 1.1, &ftext., 6);
%label(25.5, 4, '-70', black, 0, 0, 1.0, &ftext., 6);
%label(60, 4, '70', black, 0, 0, 1.0, &ftext., 6);
%label(44.0, 5, '0', black, 0, 0, 1.0, &ftext., 6);
/*X轴*/
%system(2, 2);
%line(-70, 0, 70, 0, black, 1, 1);
run;
data anno2;
set demo;
length TEXT $200.;
%system(3, 2);
%label(2, ORD2, ITEM, black, 0, 0, 1, &ftext., 6);
%label(63, ORD2, DIFLU, black, 0, 0, 1, &ftext., 6);
%label(82.5, ORD2, RATE1, black, 0, 0, 1, &ftext., 6);
%label(92.5, ORD2, RATE2, black, 0, 0, 1, &ftext., 6);
drop ORD: ITEM DIFF LOW UP DIFLU RATE1 RATE2;
run;
data anno3;
set demo;
%system(2, 2);
%line(LOW, ORD2, UP, ORD2, black, 1, 1);
drop ORD: ITEM DIFF LOW UP DIFLU RATE1 RATE2;
run;
data anno4;
%system(2, 2);
%line(0, 0, 0, 36, black, 2, 1);
run;
data anno;
set anno1-anno4;
run;
/*图形属性*/
symbol1 i=none v=p c=black f=marker h=1;
/*坐标轴*/
axis1 minor=none major=none order=(0 to 36 by 1) label=none value=none offset=(0, 5) origin=(0, 4) c=white;
axis2 minor=none order=(-70 to 70 by 70) label=none offset=(27, 40) origin=(0, 4) style=0 value=none;
goptions ftext=&ftext htext=8pt hsize=50cm vsize=16cm noborder;
/*画图*/
ods listing close;
proc gplot data=demo;
plot ORD*DIFF/haxis=axis2
vaxis=axis1
anno=anno
nolegend
noframe;
run ;
quit;
ods rtf close;
ods listing;