t 检验通常来说检验两组数据间的差异,但如果是三组或以上的数据呢?两两间做比较?会不会太麻烦了呢。
我们可以尝试使用但因素方差分析。需要注意,方差分析需要数据独立、正态、等方差。
举个栗子,比如施肥数量对产量的影响,对照、组一、组二、组三:
> head(df)
CK Treat1 Treat2 Treat3
1 582.6225 612.4301 643.4223 628.6420
2 555.8181 581.8122 655.3533 604.2212
3 596.1499 587.4256 677.5473 599.7916
4 579.3415 652.1744 652.7263 624.5615
5 617.4248 593.1566 642.3227 620.9059
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