现在的位置: 首页 > 综合 > 正文

临床试验的统计报表问题:四格表指标统计分析报表的sas宏程序

2018年10月24日 ⁄ 综合 ⁄ 共 3547字 ⁄ 字号 评论关闭

声明:本文摘自http://www.mysas.net/forum/viewtopic.php?f=4&t=1896

一般而言,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中。

举例:四格表指标统计分析报表的sas宏程序

%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 and 1 = 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=性别)

抱歉!评论已关闭.