|
|
楼主

楼主 |
发表于 2010-11-7 00:18:59
|
只看该作者
转载:临床试验的SAS统计报表问题
From crackman's blog on Baidu
<p>一般而言,SAS的输出结果要经过编辑才能成为符合统计学要求的统计图表,而制作统计报告的工作量极大,编辑过程也很易出错。如何利用SAS直接产生用户要求格式的统计报告,是值得研究的问题。 <br>
<br>
为规范临床试验数据管理 ,简化程序并减少数据统计分析过程中的错误来源 ,有必要研究 SAS中的宏问题,来很好地解决这个问题。 <br>
<br>
以下参考文献是统计学家的一些探索: <br>
<br>
定性指标的sas统计分析报表—sas软件在新药临床试验统计分析中的应用(一) <br>
童新元 . 张高魁 . 姚晨. 中国卫生统计 2003年01期 <br>
<br>
<br>
正态分布定量指标统计分析报表的sas宏程序 <br>
邹建东. 熊宁宁. 卜擎燕. 蒋萌. 刘芳. 中国临床药理学与治疗学 2004年07期 <br>
<br>
<br>
新药临床试验中协方差分析的sas统计报表 <br>
童新元. 张高魁. 姚晨. 中国临床药理学与治疗学 2004年08期 <br>
<br>
<br>
新药临床试验中定量指标的sas统计报表 <br>
童新元. 张高魁. 姚晨. 军医进修学院学报 2005年01期 <br>
<br>
<br>
应用sas软件的动态数据交换技术自动生成统计报告 <br>
田晓燕. 金丕焕. 张文彤. 中华预防医学杂志 2005年01期 <br>
<br>
<br>
四格表指标统计分析报表的sas宏程序 <br>
邹建东. 熊宁宁. 卜擎燕. 蒋萌. 刘芳. 中国临床药理学与治疗学 2005年03期 <br>
<br>
<br>
SAS统计报表制作的一般过程 <br>
<br>
1、先设计好你的报表格式,比如 <br>
________________________________________________ <br>
指标 试验组 对照组 统计量 P值 <br>
________________________________________________ <br>
年龄 <br>
<br>
例数(缺失) <br>
均值(方差) <br>
中位数 <br>
最小值~最大值 <br>
95%置信限 <br>
________________________________________________ <br>
<br>
<br>
<br>
当然这些不用你在word中手工绘制好,就是在报表之前应该清楚大致的形式。 <br>
<br>
<br>
<br>
2、用SAS过程先初步得到这些结果 <br>
<br>
比如可以用means过程、univariate过程得到一些描述统计量; <br>
<br>
<br>
可以用means过程后面加选项t来做t成组检验,可以用ttest过程来做成组或配对t检验。 <br>
<br>
<br>
而t检验的前途条件要求数据服从正态分布,如果不服从正态分布可以用非参数检验。 <br>
<br>
<br>
3、利用SAS的ODS中ods select选择你所需要的结果 <br>
<br>
可以先用ods trace来看一下输出的结果都有哪些,然后用ods select选择结果到相应的数据集中。 <br>
<br>
<br>
4、为了直接输出得到上面的表格,可以有两种方法来做。 <br>
<br>
一种是ODS;一种是利用put在结果输出窗口得到它,再粘贴到word中。 <br>
<br>
<br>
举例:四格表指标统计分析报表的sas宏程序 <br>
<br>
代码: <br>
<br>
%macro chisq (database= ,var= ,varfmt=,index=) ; <br>
<br>
/* 利用freq 程序输出描述性结果到TabFreq 数据集*/ <br>
proc freq data = &database. noprint ; <br>
tables &var. * group /out = TabFreq ; <br>
run ; <br>
<br>
/* 将两对比组的缺失例数分别输出到独立的数据集ma 和mb 中*/ <br>
data ma ( where = (group ="A") ) mb ( where= (group ="B") ) ; <br>
set TabFreq (keep = &var. group COUNT) ; <br>
where &var. = . ; <br>
run ; <br>
<br>
/* 利用ODS 输出描述性结果到CrossTabFreqs数据集, <br>
对比统计的结果到数据集chisq,FishersExact */ <br>
ods listing close ; <br>
ods output CrossTabFreqs = CrossTabFreqs chisq = chisq FishersExact=FishersExact ; <br>
proc freq data = &database. ; <br>
tables &var. * group /chisq exact expected nopercent norow ; <br>
run ; <br>
ods listing ; <br>
<br>
/* 自CrossTabFreqs 数据集中生成理论频数的数据集,并将其排序 */ <br>
proc sort out = EXPECTED(keep = EXPECTED) <br>
data = CrossTabFreqs ( where = ( EXPECTED not=. ) ) ; <br>
by Expected ; <br>
run ; <br>
<br>
/* 自理论频数数据集中取出最大理论频数值,输出到数据集T中 */ <br>
data T(keep = T) ; <br>
set EXPECTED ; <br>
if n = 1 then T = EXPECTED ; <br>
if T = . then delete ; <br>
run ; <br>
<br>
/* 自CrossTabFreqs 数据集中生成例数的数据集,并将其排序 */ <br>
proc sort out = Frequency ( keep = Frequency) <br>
data = CrossTabFreqs ; <br>
by descending Frequency ; <br>
run ; <br>
<br>
/* 自例数数据集中取出例数,输出到数据集n中 */ <br>
data n (keep = n) ; <br>
set Frequency ; <br>
if n = 1 then n = Frequency ; <br>
if n = . then delete ;run ; <br>
run ; <br>
<br>
/* 自chisq 数据集中生成普通卡方检验的统计量和P值的数据库 */ <br>
data chisq1 (keep =value1 Prob1 ) ; <br>
set chisq ( rename = (value = value1 Prob =Prob1) ) ; <br>
where (Statistic = ('Chi-Square') | Statistic = ('卡方') ) ; <br>
run ; <br>
<br>
/* 自chisq 数据集中生成连续校正卡方检验的统计量和P值的数据库 */ <br>
data chisq2 (keep =value2 Prob2 ) ; <br>
set chisq ( rename = (value = value2 Prob =Prob2) ) ; <br>
where ( Statistic = ( 'Continuity Adj. Chi-Square') | Statistic = ('连续校正卡方') ) ; <br>
run ; <br>
<br>
/* 自Fishersexact 数据集中生成精确概率法P值的数据库 */ <br>
data Fishersexact (keep = cvalue1) ; <br>
set Fishersexact ; <br>
where (Name1 = ('XP2_FISH') ) ; <br>
run ; <br>
<br>
/* 合并结果,并定义统计量格式 */ <br>
data st (keep = ma mb n T value1 Prob1 value2 Prob2 cvalue1 &var. c) ; <br>
merge ma ( rename = (COUNT = ma) ) mb ( rename = (COUNT = mb) ) n T chisq1 chisq2 Fishersexact ; <br>
&var. = - 99 ; <br>
if ma = . then ma = 0 ; <br>
if mb = . then mb = 0 ; <br>
format value1 6.2 value2 6.2 ; <br>
run ; <br>
<br>
data outa ( where = ( group ="A") ) outb (where = (group ="B") ) ; <br>
set CrossTabFreqs ;</p>
<p>format ColPercent 6.2 ; <br>
run ; <br>
<br>
data outt (drop = table group _TYPE_ _TABLE_ Expected Missing) ; <br>
merge outa (rename = ( Frequency = A ColPercent = percentA) ) <br>
outb ( rename = ( Frequency = B ColPercent =percentB) ) ; <br>
if &var. = . then &var. = - 99 ; <br>
run ; <br>
<br>
proc sort ;by &var. ;run ; <br>
<br>
data _null_ ; <br>
file print notitle ; <br>
merge outt st ; <br>
if &var. = - 99 then do ; <br>
if n = 40 and 1 = 40 and T > = 5 then do ; <br>
put @3"&index. " @70 'chisq = 'value1 @83 'P= 'Prob1 ; <br>
end ; <br>
put @5 "例数(缺失) " @22 A '(' MA ') ' @47 B '(' MB ') '; <br>
end ; <br>
else do ; <br>
put @5 &var. '(%) ' @22 A '(' PercentA ') '@47 B '('PercentB ') '; <br>
format &var. &varfmt..; <br>
end ; <br>
run ; <br>
<br>
proc datasets; <br>
delete chisq chisq1 chisq2 Crosstabfreqs Expected Fishersexact <br>
Frequency Ma Mb N Outa Outb Outt st stt t Tabfreq ; quit ; <br>
<br>
%mend chisq ; <br>
<br>
data jixian; <br>
input id group$ SEX; <br>
datalines; <br>
1 A 1 <br>
2 A 2 <br>
3 A 2 <br>
4 A 2 <br>
5 B 1 <br>
6 B 2 <br>
7 B 1 <br>
8 B 2 <br>
; <br>
run; <br>
<br>
proc format; <br>
value sexfmt 1='男性' 2='女性'; <br>
run; <br>
<br>
%chisq (database=jixian ,var=sex ,varfmt=sexfmt,index=性别)</p> <a href="http://hi.baidu.com/crack%5Fman/blog/item/1e0dde2e11a33c3dd62af167.html">阅读全文</a>
<br/><b>类别:</b><a href="http://hi.baidu.com/crack%5Fman/blog/category/%D7%AA%D4%D8%CE%C4%D5%C2sas">转载文章sas</a> <a href="http://hi.baidu.com/crack%5Fman/blog/item/1e0dde2e11a33c3dd62af167.html#comment">查看评论</a> |
|