按行进行单因素方差分析
Posted
技术标签:
【中文标题】按行进行单因素方差分析【英文标题】:One-way ANOVA analysis by row 【发布时间】:2022-01-19 23:01:59 【问题描述】:我想进行 ANOVA 分析以比较 4 组 (ABCD) 之间的差异。每组在不同的列中包含奇数个重复,每一行代表我要测试的一个单独的项目。您可以将每一列视为复制,并且不同行之间没有关系。最终,我希望弄清楚 4 组之间哪些项目(行)显示出显着差异。
请参阅下面的示例数据结构。实际上,所有数据都已标准化。
A1 | A2 | A3 | B1 | B2 | C1 | C2 | D1 | D2 | D3 | |
---|---|---|---|---|---|---|---|---|---|---|
protein1 | 15 | 30 | 28 | 6 | 7 | 9 | 30 | 45 | 66 | 43 |
protein2 | 2 | 4 | 3 | 56 | 54 | 23 | 25 | 12 | 13 | 5 |
protein3 | 2 | 4 | 3 | 56 | 54 | 23 | 25 | 12 | 13 | 5 |
protein4 | 2 | 4 | 3 | 56 | 54 | 23 | 25 | 12 | 13 | 5 |
【问题讨论】:
执行此操作的标准方法是将每个观察值作为一行,将每个变量作为一列。您对重新格式化数据有什么反对意见? 我不反对重新格式化这些数据,只是不知道如何在 R 中以“标准方式”处理这个问题。 【参考方案1】:一种方法:
首先将数据重塑为模型可以处理的格式。这使用了 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
【讨论】:
非常感谢您向我展示! @wanying1107 这能回答你的问题吗? 谢谢,效果很好。我无法弄清楚的最后一步是将每种蛋白质的 p 值打印成一行。我使用 summary(anovas$protein2)[[1]][1,5] 打印一种蛋白质的值,但无法弄清楚如何将它们一起打印成一行。你能告诉我怎么做吗?非常感谢!以上是关于按行进行单因素方差分析的主要内容,如果未能解决你的问题,请参考以下文章