我想做一个方差分析来比较4组之间的差异(ABCD(。每个组在不同的列中包含不均匀数量的重复,每行代表我想要测试的一个单独项目。您可以将每一列视为一个复制,并且不同行之间没有关系。最后,我希望弄清楚哪一项(行(在4组之间显示出显著差异。
请参阅下面的数据结构示例。事实上,所有数据都已经标准化了。
A1 | B1 | B2<1>C1 | <2>D1 | >2 | D3 | ||||
---|---|---|---|---|---|---|---|---|---|
蛋白1 | 15 | 30 | >28 | 6 | 7 | 9>30 | >45 | >66 | 43 | //tr>
蛋白2 | 2 | 4 | 3>56 | 54 | 23 | 25>12 | >13 | >5 | |
蛋白3 | 2 | >4 | 3 | 56 | >54 | <23>>25 | <12>>13 | 15||
蛋白4 | 2 | >4 | 3 | 56 | 54 | >23 | 25<12><13>5
一种方法:
首先,将数据重塑为模型可以处理的格式。这使用了tidyverse包。
df_long <- df %>%
pivot_longer(cols = 2:ncol(.)) %>%
pivot_wider(names_from = prot, values_from = value) %>%
separate(name, into = c("trt"), sep = "\d")
看起来像:
trt protein1 protein2 protein3 protein4
<chr> <dbl> <dbl> <dbl> <dbl>
1 A 15 2 2 2
2 A 30 4 4 4
3 A 28 3 3 3
4 B 6 56 56 56
5 B 7 54 54 54
6 C 9 23 23 23
7 C 30 25 25 25
8 D 45 12 12 12
9 D 66 13 13 13
10 D 43 5 5 5
然后你可以很容易地使用你想应用的任何模型/统计测试。例如,要为每列生成ANOVA,可以定义一个辅助函数,然后映射到列上:
fit_aov <- function(col) {
aov(col ~ trt, data = df_long)
}
anovas <- map(df_long[, 2:ncol(df_long)], fit_aov)
summary(anovas$protein2)
Df Sum Sq Mean Sq F value Pr(>F)
trt 3 3648 1216.0 165.8 3.69e-06 ***
Residuals 6 44 7.3
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1