t 检验通常来说检验两组数据间的差异,但如果是三组或以上的数据呢?两两间做比较?会不会太麻烦了呢。

    我们可以尝试使用但因素方差分析。需要注意,方差分析需要数据独立、正态、等方差。

    举个栗子,比如施肥数量对产量的影响,对照、组一、组二、组三:

    1. > head(df)
    2. CK Treat1 Treat2 Treat3
    3. 1 582.6225 612.4301 643.4223 628.6420
    4. 2 555.8181 581.8122 655.3533 604.2212
    5. 3 596.1499 587.4256 677.5473 599.7916
    6. 4 579.3415 652.1744 652.7263 624.5615
    7. 5 617.4248 593.1566 642.3227 620.9059
    8. 6 579.2657 615.7837 625.4459 590.7656

    像上面这种数据属于“宽数据”,而anova单因素分析需要的是“窄数据”,像下面这种:

      variable    value
    1       CK 582.6225
    2       CK 555.8181
    3       CK 596.1499
    4       CK 579.3415
    5       CK 617.4248
    6       CK 579.2657
    

    我们可以通过reshape2 包的melt 方法及tidyverse 的gather:

    > df2 = gather(df)
    > head(df2)
      key    value
    1  CK 582.6225
    2  CK 555.8181
    3  CK 596.1499
    4  CK 579.3415
    5  CK 617.4248
    6  CK 579.2657
    

    接着就可以做分析啦,格式为aov(value~group, data=df)

    > one_way = aov(value~key, data = df2)
    
    > summary(one_way)
                Df Sum Sq Mean Sq F value  Pr(>F)    
    key          3  26786    8929   23.41 1.4e-08 ***
    Residuals   36  13731     381                    
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    

    summary 可以返回整个比较的综合报告,可以看出样本是存在差异的,三颗星呢~

    如果我们想要知道具体是哪两个样本存在差异,可以使用TukeyHSD(aov),获得两两比较的结果:

    > TukeyHSD(one_way)
      Tukey multiple comparisons of means
        95% family-wise confidence level
    
    Fit: aov(formula = value ~ key, data = df2)
    
    $key
                        diff        lwr       upr     p adj
    Treat1-CK      15.613505  -7.909153  39.13616 0.2957186
    Treat2-CK      69.007701  45.485042  92.53036 0.0000000
    Treat3-CK      19.289158  -4.233500  42.81182 0.1402546
    Treat2-Treat1  53.394195  29.871537  76.91685 0.0000029
    Treat3-Treat1   3.675653 -19.847005  27.19831 0.9745543
    Treat3-Treat2 -49.718542 -73.241200 -26.19588 0.0000104