医学统计学常用的单因素统计学方法及SAS代码实现
今天介绍一下初学医学统计学常见的单因素方法以及应用条件,在医学统计学中,常见的两种设计是完全随机设计和配对设计,研究目的往往包括两种,样本均数的比较和样本率的比较。
样本均数的比较即结局变量为连续变量;样本率的比较即结局变量为分类变量;
目录
医学统计学常用的单因素统计学方法及SAS代码实现
1.样本均数比较的统计学方法概况
2、配对t检验
3、Wilcoxon秩和检验:
4、Wilcoxon配对秩和检验
5、方差分析:完全随机设计,多组正态、方差齐数据比较
6、Kruskal-wallis秩和检验
7、 随机区组方差分析:配对设计,多组正态资料比较
8、 Friedman秩和检验:配对设计,多组非正态资料比较
9、卡方检验:
10、配对卡方检验
11、计数资料的配对秩和检验
1.样本均数比较的统计学方法概况
2样本率比较的统计学方法概况
下面一一介绍每种方法的SAS实现及结果解读:
1、t检验和t’检验:完全随机设计,两组正态分布,样本均数比较
目的:比较甲乙两班的平均成绩,其中1代表甲班;2代表乙班
其中分组变量:class 分析变量:score
/*首先是录入数据*/
data ex1;
do class=1 to 2;
input score@@;
output;
end;
cards;
76 72
90 78
62 59
76 72
65 85
65 71
77 69
83 70
83 60
75 81
;
proc print;
run;
/*下面是正态性检验*/
proc univariate normal;
class class;/*放分组变量*/
var score;/*放分析变量*/
run;
/*正态性检验结果解读:找到下面这个表,分别给出了class=1和class=2的正态性检验结果*/
这里是给出了四种方法,感兴趣的可以自己搜索。
这里主要看后面的P值,p>0.05,表示符合正态性,否则不满足;
/*下面是t检验和t’检验的程序*/
proc ttest;
class class;/*放分组变量*/
var score;/*放分析变量*/
run;
/*结果给出以下内容*/
2、配对t检验
配对设计,正态数据
案例情况:某班连续进行了两次考试,每个同学有两次成绩,现比较两次成绩之间的差异,这属于配对设计,采用配对t检验
/*录入数据*/
data ex2;
input score1 score2;
d=score1-score2;/*此处生成一个两次考试成绩的差值*/
cards;
78 71
63 44
72 61
89 84
91 74
49 51
68 55
76 60
85 77
55 39
;
run;
/*正态性检验:也可以给出配对t检验的结果*/
proc univariate normal;
var d;
run;
/*配对t检验程序*/
proc ttest;
paired score1*score2;/*两个配对变量用*连接 */
run;
就看到这里就行了,后面是一些图,感兴趣自己可以研究。
3、Wilcoxon秩和检验:
应用条条件:
本例目的仍是比较甲(class=1)乙(class=2)两班的成绩。
整理假设两班的分数不符合正态分布。
/*首先是录入数据*/
data ex1;
do class=1 to 2;
input score@@;
output;
end;
cards;
76 72
90 78
62 59
76 72
65 85
65 71
77 69
83 70
83 60
75 81
;
proc print;
run;
/*SAS结果*/
这里可以先算算一下两组的中位数
proc means data=ex1 median;
CLASS class;/*放分组变量*/
VAR score; /*放分析变量*/
RUN;
/******再看秩和检验的结果******/
PROC NPAR1WAY wilcoxon;
CLASS class;/*放分组变量*/
VAR score; /*放分析变量*/
RUN;
结果解读:z检验的p=0.3840;近似t检验的p=0.3948;均小于0.05,说明两班的成绩存在差异。
4、Wilcoxon配对秩和检验
又叫Wilcoxon符号秩和检验:配对设计,两组非正态数据比较。
案例情况:某班连续进行了两次考试,每个同学有两次成绩,现比较两次成绩之间的差异,这属于配对设计,现假设两组差值不符合正态分布,因此采用Wilcoxon配对秩和检验
/*录入数据*/
data ex2;
input score1 score2;
d=score1-score2;/*此处生成一个两次考试成绩的差值*/
cards;
78 71
63 44
72 61
89 84
91 74
49 51
68 55
76 60
85 77
55 39
;
run;
/*Wilcoxon配对秩和检验程序*/
proc univariate;
var d;/*差值变量*/
run;
结果解读:Wilcoxon配对秩和检验p=0.0039<0.05,说明两次成绩存在差异。
5、方差分析:完全随机设计,多组正态、方差齐数据比较
案例分析:(完全随机设计)把15名癌症患者随机分为3组,分别给予A(1组)、B(2组)、C(3组)药物,用药数周后,观察结局指标x的差异,并进一步进行两两比较*/
/*录入数据*/
data test1;
input group x;
cards;
1 229
1 274
1 310
1 300
1 230
2 210
2 285
2 117
2 178
2 134
3 279
3 334
3 303
3 338
3 198
;
proc print;
run;
/* 对资料进行正态性检验 */;
proc univariate normal ;
class group;
var x;
run;
这里就不一一解释了,正态性的表和前面两组的一样
/*方差分析程序,并两两比较*/
proc glm;
class group;/*分组变量*/
model x=group;/*分析变量=分组变量 应该这样建立模型*/
means group/hovtest=bartlett lsd snk dunnett('3') ;
/* hovtest指定方差齐性检验方法,默认为levene's方法
bartlett:多样本,符合正态分布
snk:对变量g的各水平组进行两两比较(探索性的)
dunnett:(k-1)个实验组与一个对照组均数有无差别的多重比较(证实性)
lsd:适用于一对或几对在专业上有特殊意义的样本均数间的比较 (证实性)*/
run;
/*方差分析总体的结果*/
结果解释:p=0.02<0.05,因此,三组之间存在着差异,但具体是哪两组有差异,需要进一步看两两比较的结果。
/*下面这幅图是方差齐性检验结果*/
/*两两比较结果:我们的模型用了三种办法:lsd snk dunnett('3')*/
上述三种方法,大家选择一种就行,这里我建议直接用snk法,因为可以给出两两比较的结果。
6、Kruskal-wallis秩和检验
应用条件:
案例:某医生将72名癌症病人随机分为三组,并分别给予A、B、C三种药物,治疗一疗程后,测定了这些病人胃部的ki-67水平,用以比较三种药物的疗效。
数据收据情况如下图所示:
/*首先是数据导入*/
data result;
do group=1 to 3;
input x@@;
output;
end;
cards;
0.14 0.484 0.138
0.116 0.152 0.218
0.162 0.34 0.148
0.144 0.31 0.191
0.406 0.284 0.146
0.152 0.272 0.104
0.154 0.764 0.252
0.176 0.15 0.204
0.136 0.236 0.09
0.248 0.156 0.054
0.216 0.814 0.232
0.104 0.148 0.06
0.31 0.538 0.14
0.252 0.414 0.042
0.132 0.154 0.228
0.126 0.134 0.254
0.222 0.42 0.366
0.35 0.31 0.282
0.186 0.096 0.18
0.386 0.142 0.202
0.206 0.672 0.234
0.392 0.16 0.192
0.102 0.28 0.044
0.236 0.202 0.1
;
proc print;
run;
表示数据写入成功
/*Kruskal-wallis秩和检验程序:有两种方法*/
/*方法1*/
PROC NPAR1WAY wilcoxon data=result;
CLASS group;/*放分组变量*/
VAR x;/*放分析变量*/
RUN;
/*方法2*/
proc freq data=result;
tables group*x/ scores = rank cmh2 noprint;
/*group*x即:分组变量*分析变量;
后面的“scores = rank cmh2 noprint”不用管 */
run;
方法1结果
结果解读:P=0.0139<0.05,说明三组药物效果不同,但具体哪两组存在差异,需要进一步两两比较。
说起两两比较,可能需要先说明一下原理,再说程序可能更容易懂一些。
/***两两比较***/
由于秩和检验比较的秩次,因此这里的两两比较
/*计算个案秩次*/
proc rank data =result out = a;/*out = a:表示计算秩次数据集为a*/
var x;/*放分析变量*/
ranks r;/*r是自己命名:代表秩次变量*/
quit;
可以看到a数据集计算出了秩次,变量名为r
/*两两比较的程序*/
proc anova data=a;
class group ;
model r = group ;/*模型建立写:秩次变量=分组变量*/
means group/ lsd snk ;/*means后面写分组变量*/
quit;
proc glm data=a;
class group ;
model r = group ;/*模型建立写:秩次变量=分组变量*/
means group/ lsd snk ;/*means后面写分组变量*/
quit;
上面两个程序的结果一样的,下面仅展示其中一种程序的结果
结果解读:LSD和SNK法结果一样,大家选择其中一种就行;
结果表名,1组和2组,1组和3组无差异;2组和3组有差异。
参考来源:多个样本的非参数检验的两两比较 [SAS] (douban.com)
随机区组设计(randomized block design)是将受试对象按自然属性(如实验动物的窝别、体重,病人的性别、年龄及病情等)相同或相近者组成区组,然后把每个区组中的受试对象随机地分配给不同处理。设计中有两个因素,一个是处理因素,另一个是按自然属性形成的区组。区组的选择原则是“区组间差别越大越好,区组内差别越小越好”。
案例:
为了研究注射不同剂量雌激素对大白鼠子宫重量的影响,某实验工作人员取4窝不同品种的大白鼠,
每窝3只,将每窝大白鼠随机地分配到3个组,分别接受不同剂量的雌激素注射,然后测定其子宫重量。
目的:注射不同剂量的雌激素对大白鼠子宫重量是否存在差异?
分析:此研究属于随机区组设计,其中
分组因素:注射不同剂量雌激素,总共3组
区组因素:窝别,共4窝
/*首先是写入数据*/
data s;
do block=1 to 4;/*区组*/
do treat=1 to 3; /*处理因素*/
input x @@;
output;
end;end;
cards;
108 112 142
46 64 116
70 96 134
43 65 98
;
proc print;
run;
/*====正态性检验,随机区组设计只需要做不同分组的正态性检验,区组可以不做====*/;
proc univariate normal;
var x;/*结局变量*/
class treat;/*分组变量:3组*/
run;
可以看到,三组P均>0.05,说明符合正态分布。
/*随机区组方差分析程序*/
proc glm data=s;
class block treat;/*加入区组变量和分组变量*/
model x=treat block ;/*模型设定:结局变量=分组变量 区组变量*/
means treat/snk ;/*====进行多重比较,若不加选择项,则给出按自变量
分组后因变量的均值和标准差====*/
/*====多重比较的方法lsd dunnett(1) tukey=====*/
run;
/*结果表*/
/*解读*/
III型平方和的结果是我们主要关心的结果,这个表相当于校正了区组和分组变量,然后看不同变量的p值。
比如,本例主要关心不同分组是否存在差异,即看treat,其p值校正了block,p=0.0002<0.05,因此,三组不同剂量注射雌激素对大白鼠的体重影响不同。
但具体哪两组不同呢?需要进一步两两比较。
上述程序其实已经给出了结果,下面解读:
/*解读*/
组1、组2、组3分别对应C、B、A,字母不同,因此
组1/组2、组1/组3、组2/组3都不同。
案例:
某科研人员为探讨三种新型试验法对胃癌的血清内 (ESM‐1)的变化 ,将12窝小白鼠(每窝3只)做成胃癌模型,然后把每窝3只小白鼠随机分配到3个不同的实验组 ,采静脉血 4ml ,分离血清 ,成批检测 ESM‐1(ng/ml)
结果见表。 问(ESM‐1)有无差别 ,如果有差别 ,作两两比较 。
区组 编号 A B C
1 0.03 0.08 0.16
2 0.06 0.07 0.19
3 2.26 2.98 3.21
4 0.03 0.03 0.74
5 0.02 0.1 0.24
6 0.03 0.08 0.16
7 3.17 3.58 3.75
8 0.05 0.09 0.28
9 0.02 0.06 0.29
10 0.04 0.06 0.18
11 6.53 7.18 8.09
12 0.05 0.09 0.17
在此研究中,属于随机区组设计,有两个因素,一是区组因素(窝别:共12组);分组因素(实验方法:共3种)
/*首先写入数据*/
data test2;
do block=1 to 12;
do group=1 to 3;
input x@@;
output; end; end;
cards;
0.03 0.08 0.16
0.06 0.07 0.19
2.26 2.98 3.21
0.03 0.03 0.74
0.02 0.1 0.24
0.03 0.08 0.16
3.17 3.58 3.75
0.05 0.09 0.28
0.02 0.06 0.29
0.04 0.06 0.18
6.53 7.18 8.09
0.05 0.09 0.17
;
proc print;
run;
/*正态性检验*/
proc univariate normal data=test2;/*正态性检验*/
class group;/*放置分组变量*/
var x;/*放结局变量*/
run;
其实这里建议,正态性建议可以相对主观一些,即查看正态分布图,而不是单纯以统计学检验的P值作为标准;因为,可以这样说,在真实世界研究中,即便数据看起来正态,但是统计学检验往往还是非正态。
/*friedman秩和检验程序*/
proc freq data=test2;
table block*group*x/noprint scores=rank cmh2;
/*scores=rank执行非参数检验,cmh2输出行平均得分差值*/
/* block*group*x:区组变量*分组变量*结局变量 */
RUN;
结果解读:P<0.0001,说明三种方法的效果不同,但具体哪两种,需要进一步两两比较。
/*两两比较程序*/
/*需要说明的是:两两比较的思想是先算出每个区组里面个案的秩次,然后采用proc glm里面的lsmeans进行两两比较*/
/*按照区组排序*/
proc sort data=test2 out=a;
by block ;
run;
/*算出每个区组个案的秩次*/
proc rank data=a out=b;
var x;/*放结局变量秩次*/
by block;/*放区组变量*/
ranks r ;/*秩次变量:新生成的,自己命名*/
run;
/*利用秩次进行两两比较*/
proc glm data=b ;
class group block ;
model r = group block/ ss3 ;
/*秩次=分组变量 区组变量*/
lsmeans group/ stderr pdiff ;
quit;
参考来源:多个样本的非参数检验的两两比较 [SAS] (douban.com)
9、卡方检验:
应用条件:
案例:
/*比较3组人群的基因型分布是否有差异?
cc ct tt
胃癌 60 121 69
慢性胃癌 71 135 77
对照 87 149 64 */
/*录入数据*/
data example;
do group=1 to 3;
do gene=1 to 3;
input x@@;
output;end;end;
cards;
60 121 69
71 135 77
87 149 64
;
run;
/*卡方检验程序*/
proc freq data=example;
table group*gene/expected chisq fisher;
/*group*gene:代表分组变量*分析变量*/
weight x;/*由于是汇总数据,因此这是对个案加权,与spss个案加权选项一致;如果你的数据是原始数据,就不用加权了*/
run;
结果解释:p=0.3525>0.05,因此,3组人群的基因型分布无差异。
另外,需要注意的是,分类变量的两两比较是将原始数据进行分割,比如分组变量为1、2、3组,在做两两比较的时候,分别拿出1/2、1/3、2/3的数据进行比较,但需要进行Bonferroni校正,
即显著性的p进行重新调整,显著性的p值=0.05/比较的次数。
10、配对卡方检验
应用条件:配对设计,二分类或无序多分类结局
案例:某科研工作者为研究某种新型消毒液的金葡菌的消毒效果,招募了数名受试者,首先要求参与者左右手相搓,使得两手的细菌菌落数基本均匀。首先采样左手细菌,接着向右手喷洒消毒液,三分钟后,采样右手细菌,然后分别测定左手和右手金葡菌数,研究要求,金葡菌数在100各以下即达标。
研究目的:该种消毒液对细菌消毒达标的效果如何。
该研究属于配对设计,左手为对照组/右手为实验组;结局指标为消毒是否达标
数据收集的汇总情况如下:
右手
左手 达标 未达标
达标 90 10
未达标 70 30
/*配对卡方检验*/
proc freq data=mydata;
weight f;/*个案加权,和spss的个案加权一样*/
tables left*right/ agree;
exact mcnem;/*展示精确慨率法*/
run;
/*选择分析方法:
当b+c≥40时,选择McNemar检验(2×2配对χ2检验);*/
/*当20≤b+c<40时,选择校正McNemar检验;*/
/*当b+c<20时,选择确切概率法*/
以上是教材书的建议选中,由于校正McNemar检验需要自己另外编公式,这里建议大家b+c<40时,直接选中确切概率法
结果解释:p<0.05,说明改消毒液可以提高金葡菌消毒的达标率。
11、计数资料的配对秩和检验
应用条件:配对设计,计数资料,有序多分类结局。
分组为两组:
案例:某研究者了解某高血压药物对高血压的治疗效果
表格如下:
/*录入数据*/
DATA example;
DO group=1 TO 2; /*定义行变量,表明group有2行*/
DO effect=1 TO 4; /*定义列变量,表明effect有4列*/
INPUT f@@;
OUTPUT;
END;
END;
CARDS;
33 24 1 2
18 31 9 2
;
proc print;quit;
/*配对秩和检验*/
PROC NPAR1WAY wilcoxon data=example;
CLASS group;/*指明分组变量*/
VAR effect; /*指明分析变量*/
FREQ f;
RUN;
结果解释:p=0.0023,因此两种药物效果存在差异。
另外,当结果变量为多组时,两两比较可以挑出两组数据,重复上述过程即可。