统计方法的选择(2)--参数检验

写在前面的话,好久没有写统计方法的选择(1)的后续了,思路都有些打断了,所以上文所讲的当时写完觉得分分钟可以把后面的写完,结果还有些乱了。所以一鼓作气很重要,不能拖沓,逼迫自己将想法和思维定期更新并形成产品(作品),好了继续开始统计学学习。

对数据的分布有了了解,那么下一步就要选择什么样的方法了。这次先学习一下符合正态分布,并且方差齐性的数据如何检验。

其实对于统计方法的选择,在《白话统计》这本书的过程中,给了我对统计学方法豁然开朗的认识。一般线性模型的构建,可以视为方差分析和线性回归的统一,对于这二者的深入分析,可以在后续中详细说明。

2. 参数检验方法

参数方法就是针对数据分布符合正态分布,并且是方差齐性的数据的检验的。

2.1 两组数据比较

对于两组数据的比较,那就引出了耳熟能详的检验,对于很多临床医师或者医学生,对于两组之间的比较,没有分清楚是不是正态是不是方差齐性,就用t检验,不管对错与否,可以说明t检验的知名度还是很高的,那么t检验可以针对哪些数据进行检验呢。

  • 首先,t检验是用于两组比较,多组比较之后的两两比较就不能使用t检验,这样会增加犯Ⅰ类错误的风险
  • 数据如果严重的偏态分布,就不不能使用t检验,这是和我们最开始的流程呼应的。那这里提出来,我们就要解答一个问题,为什么严重的偏态分布就不能使用t检验呢?最重要的是,当数据严重偏态分布时,均值已经不能反应数据的真实情况,如果仍然使用t检验,则会导致结果的偏倚。而偏态分布的数据,就是我们后面会讲到的非参数检验方法。

需要说明的一点就是,也不能狭隘的认为t检验只是使用于两组比较,在线性回归中,也会出现t检验,这个时候的t检验实质上是检验回归系数是否为0,如果回归系数为0,就说明自变量对因变量毫无影响。因此,在线性回归中看到t检验时,要明白t检验是一种检验的方式或思路。

谈起t检验,其实最初是由数学家戈塞特(Gosset)在Guiness啤酒厂(是的你没有看错,就是那个现在还存在的健力士牌黑啤酒)工作,为了检测啤酒质量而发明了t分布。可是,公司不允许员工公开发表研究成果,于是戈塞特才被迫用笔名发表了文章。「学生」是发现这个分布的数学家戈塞特(Gosset)的笔名,他于1908年在一个叫Biometrika的杂志上,发表了关于t分布的文章,当时就是用的这个笔名。其实,戈塞特可不是什么「诺贝尔哥」之类的民科,他在发表这篇关于t检验的文章之前,曾在现代统计学的开山鼻祖之一皮尔逊(KarlPearson)的实验室访问过一两年。因此他很好地把基础研究和实际应用结合了起来,在统计学的历史上留下了自己光辉的一页。

2.1.1 两组均数的检验

两组均数的比较又称为是成组t及检验,最主要的思想就是两组均数所代表的两总体均数是否不等。
前面谈到t检验的理论,这里我们直接使用例子来理解t检验在R中的操作。

有两组雌鼠,分别以高蛋白和低蛋白为饲料,8周后记录各鼠的体重增加量(克),问两组动物增重的均数差别是否显著。
高蛋白组 134 146 104 119 124 161 107 83 113 129 97 123
低蛋白组 70 118 101 85 107 132 94

使用R对其进行检验

#读入数据
a <- c(134, 146, 104, 119, 124, 161, 107,  83, 113, 129,  97, 123)
b <- c( 70, 118, 101,  85, 107, 132,  94)
#方差齐性检验
var.test(a,b)
#t检验
t.test(a,b,var.equal = T)

查看结果

> var.test(a,b)

    F test to compare two variances

data:  a and b
F = 1.0755, num df = 11, denom df = 6,
p-value = 0.9788
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.198811 4.173718
sample estimates:
ratio of variances 
           1.07552 

方差齐性检验的结果 p-value = 0.9788,大于0.05,两组方差齐性。当然方差齐性检验也可以使用之前统计方法选择1所写的方法检验。var.test()函数进行方差检验适合于两个分组,如果分组大于两组,就要使用bartlett.test()或者leveneTest()函数进行检验。结果不仅给出了p值,而且给出了置信区间。
再查看t检验的结果

> t.test(a,b,var.equal = T)

    Two Sample t-test

data:  a and b
t = 1.8914, df = 17, p-value = 0.07573
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.193679 40.193679
sample estimates:
mean of x mean of y 
      120       101 

t检验的p-value = 0.07573,p值大于0.05,因此不能拒绝,两组均值之间没有统计学差异,不能认为两组之间体重增加有差异。t检验的结果不仅给出了置信区间,而且计算了两者的均值。好了有了检验结果,那就可视化检验结果。
进行可视化,使用到的packages主要是

library(ggpubr)

因为使用的packages是基于ggplot2,所以要将数据转换为长数据,并将其命名为example,如下

group   x
1      1 134
2      1 146
3      1 104
4      1 119
5      1 124
6      1 161
7      1 107
8      1  83
9      1 113
10     1 129
11     1  97
12     1 123
13     2  70
14     2 118
15     2 101
16     2  85
17     2 107
18     2 132
19     2  94

接下来进行作图

p <- ggboxplot(example, x="group", y="x", color = "group", 
               palette ="jco", #用jco配图,也可以改为“lancet”,柳叶刀
               add = "jitter")
p
p+stat_compare_means(method = 't.test')

上述的比较函数中method = 't.test',默认函数是method = 'wilcoxon',默认方法是wilcoxon秩和检验,也就是非参数检验,代码如下,只是把method去掉,

p <- ggboxplot(example7_10, x="group", y="x", color = "group", 
               palette ="jco", #用jco配图,也可以改为“lancet”,柳叶刀
               add = "jitter")
p
p+stat_compare_means()

做出结果如下



从两幅图看到,t检验和wilcoxon检验得到的p值是不同的,使用ggpubr package做的图形,t检验得到的p值和使用t.test()函数得到的结果接近,但是不是完全一样,这一点我也稍微有点疑惑,要弄清究竟,需要查看函数的源代码,暂且搁置,至少现在两者都能用。

2.2 多组数据之间的比较

多组数据之间的比较可以直接使用ANOVA方法。

什么是ANOVA?
ANOVA即就是方差分析,analysis of variance。

2.2.1 ANOVA

方差分析的最基本思想是什么呢,为什么能比较两组或者多组数据之间的差异呢?

方差分析的基本思想就是根据研究目的和设计,将总变异中的离均差平方和及其自由度分解为相应的若干部分,然后求解相应部分的变异,再用各部分的变异与组内变异进行比较,得出统计量F,最后根据F值来计算出p值,做出统计推断。

完全随机设计中的方差分词就是将总变异分解为组间变异和组合两部分。

还是直接用实例说明问题,并加入操作

为了解烫伤后不同时期切痂对肝脏ATP含量的的影响,将30大鼠随机分为3组,每组10只,A组为对照组,B组为烫伤后24小时切痂,C组为96小时切痂,全部动物再烫伤后168小时处死并测量肝脏中ATP含量。

数据如下



要进行数据分析需要将以上数据宽数据转换为长数据,具体转换方式可见R 数据长宽转换,得到的数据为如下形式

group   atp
1     1  7.76
2     2 11.14
3     3 10.85
4     1  7.71
5     2 11.60
6     3  8.58

转换之后的数据为example
进行如下分析

attach(example)
fit <- aov(atp~group)
summary(fit)

结果如下

> fit <- aov(atp~group)
> summary(fit)
            Df Sum Sq Mean Sq F value   Pr(>F)    
group        2  119.8   59.92   14.32 5.76e-05 ***
Residuals   27  113.0    4.18                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

p值小于0.05 , 拒绝,所以认为三组之间有差异。
然后进行可视化

library(ggpubr)
ggboxplot(Example, x="group", y="atp", color = "group", 
          palette = "lancet",
          add = "jitter")+
  stat_compare_means(method = "anova") #设置method为anova

好的,和之前结果一致,那么下一步要知道那两组有差异

2.2.2 查看组间比较

采用ANOVA统计检验后,发现具有统计学差异,那么具体那两组之间的差异是怎么样的,可以采用以下的函数进行查看

> compare_means(atp~group, data=Example8_1) 
# A tibble: 3 x 8
  .y.   group1 group2       p  p.adj p.format p.signif method  
                       
1 atp   1      2      0.00150 0.0045 0.0015   **       Wilcoxon
2 atp   1      3      0.0524  0.052  0.0524   ns       Wilcoxon
3 atp   2      3      0.00209 0.0045 0.0021   **       Wilcoxon

根据上面的结果,可以看出组间比较,默认方法是Wilcoxon,可以看到第2组和第1组有统计学差异,第2组和第3组比较有统计学差异,接下来进行组间比较的可视化作图

#先用非参方法试试
my_comparisons <- list(c("2", "1"), c("1", "3"), c("3", "2"))

ggboxplot(Example8_1, x="group", y="atp", color = "group",palette = "lancet")+
  #ylim(0,25)+
  # Add pairwise comparisons p-value 即是各组两两比较的P值,默认wilcox.test
  stat_compare_means(comparisons=my_comparisons)+   
  # Add global p-value 即是全局比较,这里是3组比较的p值,默认Kruskal-Wallis
  stat_compare_means(label.y = 22) 
全局比较采用Kruskal-Wallis,组间比较采用默认wilcox.test

默认的方法中全局检验使用的是Kruskal-Wallis方法,组间比较默认使用的是wilcox.test方法,这些都是可以通过改变参数实现的。
首先查看组间比较的结果

> compare_means(atp~group, data=Example8_1,method = 't.test') 
# A tibble: 3 x 8
  .y.   group1 group2        p   p.adj p.format p.signif method
                       
1 atp   1      2      0.000411 0.00120 0.00041  ***      T-test
2 atp   1      3      0.100    0.1     0.10010  ns       T-test
3 atp   2      3      0.00325  0.0065  0.00325  **       T-test

并进行可视化,全局比较使用ANOVA方法,组间比较使用t检验

ggboxplot(Example8_1, x="group", y="atp", color = "group",palette = "lancet")+
  #ylim(0,25)+
  # Add pairwise comparisons p-value 即是各组两两比较的P值
  stat_compare_means(comparisons=my_comparisons, method = 't.test')+   
  # Add global p-value 即是全局比较,这里是3组比较的p值
  stat_compare_means(label.y = 22,method = 'anova') 
全局比较采用ANOVA,组间比较采用t检验

注意:这里使用了t检验进行组间比较,只是为了说明代码的作用,以及如何调整代码。正如前面提到的组与组之间在全局比较之后,仍然使用t检验进行两两比较,实际上Ⅰ类错误的概率会增大。就是统计方法的选择(1)第一幅图涉及到的事后比较。

  • 以某一组为基点,进行组间比较,并可视化
compare_means(atp~group, data=Example8_1, ref.group = "1",  #以1组为参考组 
              method = "t.test" ) 采用t检验的方法

结果如下

# A tibble: 2 x 8
  .y.   group1 group2        p   p.adj p.format p.signif method
                       
1 atp   1      2      0.000411 0.00082 0.00041  ***      T-test
2 atp   1      3      0.100    0.1     0.10010  ns       T-test

作图展示

#可视化
ggboxplot(Example8_1, x="group", y="atp", color = "group", palette = "lancet",
          add = 'jitter')+ 
  
  # Add global p-value,全局比较,设定比较方法为anova,这个数据应用anova
  stat_compare_means(method = "anova", label.y = 30)+
  
  # Pairwise comparison against reference,增加两两比较的,这个数据应用t.test
  stat_compare_means(label = "p.signif", method = "t.test", ref.group = "1",label.y = 23) 

作图展示中需要注意的是基点的调节使用的ref.group这个参数,也就是reference group。label = "p.signif"参数设置主要就是选择差异结果的展示。


以第1组为基点进行比较
  • 参考组也可以设置为.all.,即所有的平均值
    代码如下
## 参考组也可以设置为.all.即所有的平均值
compare_means(atp~group, data=Example8_1, ref.group = ".all.", method = "t.test")
#可视化
ggboxplot(Example8_1, x="group", y="atp", color = "group", palette = "lancet")+
  
  # Add global p-value,全局比较,设定比较方法为anova,这个数据应用anova
  stat_compare_means(method = "anova", 
                     label.y = 25
                     )+
  
  #Pairwise comparison against all,这个数据应用t.test
  stat_compare_means(label = "p.signif", method = "t.test", 
                     ref.group = ".all.",label.y = 18)
参考组为全组平均值

注意:这个例子采用全组平均值,实际上意义不大,只是为了展示这种方法。如果是多组,并且看基因的表达情况,还是有意义的。

2.2.3 组间比较和事后比较概念了解

compare_means()的帮助文档中有这么一句话:

If the grouping variable contains more than two levels, then a pairwise comparison is performed.

什么意思,就是说使用这个函数,不论多组比较之后,函数都会自动进行两两比较,通过上面的示例,大概也看出,函数自动两两比较,参数方法为t检验,非参数检验是wilcox.test,默认的方法是wilcox.test,我们可以根据数据的分布状况更换检验方法。但这个与这幅图后面的方法是一样吗,显然是不一样的。


统计方法的选择(2)--参数检验_第1张图片

事后比较或者事后两两比较是指检验得知多组比较后,各组均数不全相等,然后采取相应的方法进行两两比较。而以上我们使用的方法其实是不论多组比较之后,函数都会自动进行两两比较。一定程度也是可以的。

在接下来的分析中,参数检验和非参数检验的事后比较可以一起学习

参考书籍及文章

R语言统计分析与应用-汪海波
白话统计-冯国双
一张图说明统计方法的选择
R语言中方差齐性检验丨数析学院
方差分析与R实现
统计方法如何选以及全代码作图实现
想玩转t检验?你得从这一篇看起

你可能感兴趣的:(统计方法的选择(2)--参数检验)