SAS中文论坛

标题: 临床试验的SAS统计报表问题 [打印本页]

作者: shiyiming    时间: 2005-7-12 10:44
标题: 临床试验的SAS统计报表问题
[color=red:f7563][b:f7563][size=150:f7563]临床试验的SAS统计报表问题
collen[/size:f7563][/b:f7563][/color:f7563]

一般而言,SAS的输出结果要经过编辑才能成为符合统计学要求的统计图表,而制作统计报告的工作量极大,编辑过程也很易出错。如何利用SAS直接产生用户要求格式的统计报告,是值得研究的问题。

为规范临床试验数据管理 ,简化程序并减少数据统计分析过程中的错误来源 ,有必要研究 SAS中的宏问题,来很好地解决这个问题。

以下参考文献是统计学家的一些探索:

定性指标的sas统计分析报表―sas软件在新药临床试验统计分析中的应用(一)
童新元 . 张高魁 . 姚晨.  中国卫生统计    2003年01期   


正态分布定量指标统计分析报表的sas宏程序
邹建东. 熊宁宁. 卜擎燕. 蒋萌. 刘芳.  中国临床药理学与治疗学    2004年07期   


新药临床试验中协方差分析的sas统计报表
童新元. 张高魁. 姚晨.  中国临床药理学与治疗学    2004年08期   


新药临床试验中定量指标的sas统计报表
童新元. 张高魁. 姚晨.  军医进修学院学报    2005年01期   


应用sas软件的动态数据交换技术自动生成统计报告
田晓燕. 金丕焕. 张文彤.  中华预防医学杂志    2005年01期   


四格表指标统计分析报表的sas宏程序
邹建东. 熊宁宁. 卜擎燕. 蒋萌. 刘芳.  中国临床药理学与治疗学    2005年03期  


SAS统计报表制作的一般过程

1、先设计好你的报表格式,比如
________________________________________________
指标              试验组     对照组  统计量  P值
________________________________________________
年龄   

例数(缺失)
均值(方差)
中位数
最小值~最大值
95%置信限
________________________________________________



当然这些不用你在word中手工绘制好,就是在报表之前应该清楚大致的形式。



2、用SAS过程先初步得到这些结果

比如可以用means过程、univariate过程得到一些描述统计量;


可以用means过程后面加选项t来做t成组检验,可以用ttest过程来做成组或配对t检验。


而t检验的前途条件要求数据服从正态分布,如果不服从正态分布可以用非参数检验。


3、利用SAS的ODS中ods select选择你所需要的结果

可以先用ods trace来看一下输出的结果都有哪些,然后用ods select选择结果到相应的数据集中。


4、为了直接输出得到上面的表格,可以有两种方法来做。

一种是ODS;一种是利用put在结果输出窗口得到它,再粘贴到word中。


[b:f7563]举例:四格表指标统计分析报表的sas宏程序[/b:f7563]

[code:f7563]
%macro chisq (database= ,var= ,varfmt=,index=) ;

/* 利用freq 程序输出描述性结果到TabFreq 数据集*/
proc freq data = &database. noprint ;
tables &var. * group /out = TabFreq ;
run ;

/* 将两对比组的缺失例数分别输出到独立的数据集ma 和mb 中*/
data ma ( where = (group ="A") ) mb ( where= (group ="B") ) ;
set TabFreq (keep = &var. group COUNT) ;
where &var. = . ;
run ;

/* 利用ODS 输出描述性结果到CrossTabFreqs数据集,
对比统计的结果到数据集chisq,FishersExact */
ods listing close ;
ods output CrossTabFreqs = CrossTabFreqs chisq = chisq FishersExact=FishersExact ;
proc freq data = &database. ;
tables &var. * group /chisq exact expected nopercent norow ;
run ;
ods listing ;

/* 自CrossTabFreqs 数据集中生成理论频数的数据集,并将其排序 */
proc sort out = EXPECTED(keep = EXPECTED)
data = CrossTabFreqs ( where = ( EXPECTED not=. ) ) ;
by Expected ;
run ;

/* 自理论频数数据集中取出最大理论频数值,输出到数据集T中 */
data T(keep = T) ;
set EXPECTED ;
if n = 1 then T = EXPECTED ;
if T = . then delete ;
run ;

/* 自CrossTabFreqs 数据集中生成例数的数据集,并将其排序 */
proc sort out = Frequency ( keep = Frequency)
data = CrossTabFreqs ;
by descending Frequency ;
run ;

/* 自例数数据集中取出例数,输出到数据集n中 */
data n (keep = n) ;
set Frequency ;
if n = 1 then n = Frequency ;
if n = . then delete ;run ;
run ;

/* 自chisq 数据集中生成普通卡方检验的统计量和P值的数据库 */
data chisq1 (keep =value1 Prob1 ) ;
set chisq ( rename = (value = value1 Prob =Prob1) ) ;
where (Statistic = ('Chi-Square') | Statistic = ('卡方') ) ;
run ;

/* 自chisq 数据集中生成连续校正卡方检验的统计量和P值的数据库 */
data chisq2 (keep =value2 Prob2 ) ;
set chisq ( rename = (value = value2 Prob =Prob2) ) ;
where ( Statistic = ( 'Continuity Adj. Chi-Square') | Statistic = ('连续校正卡方') ) ;
run ;

/* 自Fishersexact 数据集中生成精确概率法P值的数据库 */
data Fishersexact (keep = cvalue1) ;
set Fishersexact ;
where (Name1 = ('XP2_FISH') ) ;
run ;

/* 合并结果,并定义统计量格式 */
data st (keep = ma mb n T value1 Prob1 value2 Prob2 cvalue1 &var. c) ;
merge ma ( rename = (COUNT = ma) ) mb ( rename = (COUNT = mb) ) n T chisq1 chisq2 Fishersexact ;
&var. = - 99 ;
if ma = . then ma = 0 ;
if mb = . then mb = 0 ;
format value1 6.2 value2 6.2 ;
run ;

data outa ( where = ( group ="A") ) outb (where = (group ="B") ) ;
set CrossTabFreqs ;
format ColPercent 6.2 ;
run ;

data outt (drop = table group _TYPE_ _TABLE_ Expected Missing) ;
merge outa (rename = ( Frequency = A ColPercent = percentA) )
outb ( rename = ( Frequency = B ColPercent =percentB) ) ;
if &var. = . then &var. = - 99 ;
run ;

proc sort ;by &var. ;run ;

data _null_ ;
file print notitle ;
merge outt st ;
if &var. = - 99 then do ;
if n < 40 or T < 1 or 0.0450 < Prob1 < 0.0550 then do ;
put @3 "&index." @70 '精确概率法' @83 'P= ' cvalue1 ;
end ;
else if n > = 40 and 1 < = T < = 5 then do ;
put @3 "&index. " @70 '校正chisq = 'value2  @83 'P= 'Prob2 ;
end ;
else if n > = 40 and T > = 5 then do ;
put @3"&index. " @70 'chisq = 'value1  @83 'P= 'Prob1 ;
end ;
put @5 "例数(缺失) " @22 A  '(' MA ') ' @47 B  '(' MB ') ';
end ;
else do ;
put @5 &var. '(%) ' @22 A  '(' PercentA ') '@47 B '('PercentB ') ';
format &var. &varfmt..;
end ;
run ;

proc datasets;
delete chisq chisq1 chisq2 Crosstabfreqs Expected Fishersexact
Frequency Ma Mb N Outa Outb Outt st stt t Tabfreq ; quit ;

%mend chisq ;

data jixian;
input id   group$    SEX;
datalines;
1    A     1
2    A     2
3    A     2
4    A     2
5    B     1
6    B     2
7    B     1
8    B     2
;
run;

proc format;
value sexfmt 1='男性' 2='女性';
run;

%chisq (database=jixian ,var=sex ,varfmt=sexfmt,index=性别) [/code:f7563]
作者: shiyiming    时间: 2005-8-1 09:42
标题: 大侠
非常钦佩你
能否底下交流?
作者: shiyiming    时间: 2005-8-1 10:13
标题: @
公开也无妨,这些东西没有什么秘密和价值.

我们论坛马上计划成立相应的板块,到时候欢迎你多多发言讨论.
作者: shiyiming    时间: 2005-8-7 11:45
标题: 期盼
期盼这一天的到来
作者: shiyiming    时间: 2005-10-1 09:55
标题: 佩服
[color=red:49424]太佩服了,thank you very much![/color:49424]
作者: shiyiming    时间: 2006-2-22 20:11
标题: R
我在SAS9.0中运行没有通过
作者: shiyiming    时间: 2006-8-27 18:00
标题: 回复
我在SAS9.0中运行通过,是不错的一个例子,值得好好研究。能否将计量资料的报表格式也贴上来,非常感谢
作者: shiyiming    时间: 2006-9-18 18:10
标题: 回复
在下非常钦佩Collen,能否请教将临床试验中ITT集和PP集作于同一张表格的宏程序(定量指标)也贴上来,我研究了好长时间,由于水平有限,未能完成。能得到Collen的帮助我非常荣幸。
作者: shiyiming    时间: 2006-9-19 09:22
标题: to fxf258
本论坛中此前曾有人给出过不同研究中心的宏程序,只需要正确的将PP集ITT集即可。本人正在研究这段程序,成功后将和大家分享。
作者: shiyiming    时间: 2006-9-19 09:26
标题: to collen
利用上述宏程序自然可以生成我们需要的表格,但并非是真正的表格形式,其实质仍然是文本形式,这样在后期的排版、编辑过程中将会非常麻烦,不知哪位高人可以对其加以优化?(我知道用矩阵完全可以实现同样的效果,而且是真正的表格形式,但我未能研究成功)
作者: shiyiming    时间: 2006-9-22 12:03
标题: 回复wmqy2004
感谢wmqy2004的回复,期待您早日将此宏程序研究成功。我还没有看到非文本格式输出的报道,排版虽然麻烦点,但起码能减少数据出差错的几率,目前也只能这样,我真诚希望您在这方面的突破,给大家做出的巨大贡献,大家是不会忘记的,在下先谢谢您了。
作者: shiyiming    时间: 2007-5-9 16:34
标题: 小的尝试
本人尝试用ods+dde,先输出到excel,然后再用dde将excel的数据输出到word。这样就可以得到统计表格。
只是中间过程有点麻烦。
有没有更好的方法,能在word文档直接进行表格的绘制?
作者: shiyiming    时间: 2007-5-18 15:00
标题: 真正找到我所需要的资料了,
以后多支持工作,先谢谢。
作者: shiyiming    时间: 2007-6-10 20:52
标题: to All
怎么这么长时间过去了,都没有人给予回复?难道是我的这个问题太简单了以致于众家高手不屑一顾吗?
作者: shiyiming    时间: 2007-6-10 21:24
标题: to fxf258
谢谢fxf258的鼓励,经过一段时间的摸索,可以得出表格形式的结果,但仍有不尽如人意的地方(不能生成多个变量在一起的大表格),现将程序列出,诚心向各位高手请教,以便共同提高。

[code:2b1dd]%macro clianova(data,group=,var=,prnopt=0,where=);
%if &prnopt=0 %then %do;ods select none;%end;
options nodate nonumber;title '';
proc means n mean std median min max lclm uclm nmiss noprint data=&data;var &var;class &group;
%if &where ne %then %do; where &where; %end;
output out=tmp1 n=n mean=mean median=median std=std min=min max=max nmiss=nmiss q1=q1 q3=q3;
run;

proc glm data=&data;class &group;model &var=&group;
ods output diff=tmpf;
lsmeans &group/tdiff pdiff;run;
data t12(keep=t12 p12);set tmpf;if _n_=1;rename _2=t12 p2=p12;run;
data t13(keep=t13 p13);set tmpf;if _n_=1;rename _3=t13 p3=p13;run;
data t23(keep=t23 p23);set tmpf;if _n_=2;rename _3=t23 p3=p23;run;
data t12;set t12 t12 t12 t12 t12;run;
data t13;set t13 t13 t13 t13 t13;run;
data t23;set t23 t23 t23 t23 t23;run;
data tmp;merge t12 t13 t23;format t12 t13 t23 6.2 p12 p13 p23 6.3;run;

data tmp2;set tmp1;
nnm=put(n,6.) ||'('||trim(left(put(nmiss,6.)))||')';
ms=put(mean,6.1) ||'±'||left(put(std,6.1));
lu=put(lclm,6.1) ||'~'||left(put(uclm,6.1));
mm=put(min,6.1) ||'~'||left(put(max,6.1));
format median 6.1;
label nnm='N(Miss)' ms='Mean±SD' lu='95%CI(L~U)' mm='Min~Max' median='Median';
drop mean std min max n nmiss lclm uclm;run;
proc anova data=&data;ods output modelANOVA=anova(rename=(fvalue=F probf=P));class &group;model &var=&group;
%if &where ne %then %do; where &where; %end;run;
proc transpose data=tmp2 out=tmp3;var nnm ms q13 mm median;run;
data tmp3(drop=_name_ col1 F t12 p12 t13 p13 t23 p23);merge tmp3 anova(keep=F P) tmp;
format f 6.2 p 6.3;rename _label_=&var col2=A col3=B col4=C;
if _n_=2 then do;F=t12;P=p12;end;if _n_=3 then do;F=t13;P=p13;end;
if _n_=4 then do;F=t23;P=p23;end;run;
ods select all;ods listing;proc print data=tmp3 noobs;run;
%mend clianova;

ods listing close;ods rtf file='d:\tmp\tmp.rtf' style=sasdocprinter startpage=no;
%clianova(data=tmp,var=age,group=group,where=sex=1);
ods rtf close;ods listing;[/code:2b1dd]
作者: shiyiming    时间: 2007-7-31 15:43
标题: to wmqy2004
您的努力,已经取得了不少的成绩,谢谢您!好久没上论坛了,看到您的回帖很高兴。
我根据您的程序运行,但报告有错误,您调试运行良好吗?得到满意的表格了吗?




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2