在一个特征数据框(例如蛋白质或mRNA转录本)中,我想对每一列(代表表达值)计算一个单因素方差分析。每一行代表属于一个组(示例数据中为5组)的一个样本(id)。
搜索网页和Stackoverflow只给了我非功能性和部分答案,预期的结果将是一个表与方差分析p值的每个功能(例如df与第一个col =功能,第二个col =方差分析p值)。下面的例子数据我张贴一个非工作的解决方案。
对于组间的成对差异表达分析,我使用LIMMA,它提供多重比较校正的p值。如果我理解正确,ANOVA不关心mul.comp.cor,但仅显示5组中任何一组之间存在差异的特征(和后测试,例如LIMMA,显示了哪些组中存在差异)。如果你能证实这种评估我的5组之间差异表达的方法是正确的,那就太好了。
解决方案取自此处:One-way ANOVA for loop: how do I iterate through multiple columns of a dataframe?
示例数据
# gene df and list
genes <- paste("gene",1:1000,sep="")
x <- list(
A = sample(genes,300),
B = sample(genes,525),
C = sample(genes,440),
D = sample(genes,350)
)
# expression dataframe
crete_exp_df <- function(gene_nr, sample_nr){
df <- replicate(sample_nr, rnorm(gene_nr))
rownames(df) <- paste("Gene", c(1:nrow(df)))
colnames(df) <- paste("Sample", c(1:ncol(df)))
return(df)
}
df1 <- crete_exp_df(50, 20)
df1 <- as.data.frame(df1)
df1$fid <- rownames(df1)
# creator for ANOVA
df4ANOVA <- df1 %>% pivot_longer(-fid) %>%
pivot_wider(names_from="fid", values_from="value") %>%
rename(id=name)
df4ANOVA$group <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5)
溶液(不工作)
library(tidyverse)
library(broom)
df4ANOVA$group <- as.factor(df4ANOVA$group )
df4ANOVA$id <- NULL
# ANOVA
baseformula <- " ~ group"
ANOVA_group <- for (i in 2:ncol(exp4anov)) {
formula <- paste(colnames(exp4anov)[i], baseformula, sep="")
p <- summary(aov(as.formula(formula), data=exp4anov))[[1]][["Pr(>F)"]][1]
print(paste(formula, ": p=", p, sep=""))
}
2条答案
按热度按时间r3i60tvu1#
一种可能性是ffmanova包:
你会发现经典的单向p值是
res$pRaw
的第二行,也就是res$pRaw[2, ]
。例如,通过将
nSim = 9999
添加到ffmanova
调用,也可以使用pRaw
的调整后的替代方案(res$pAdjusted
和res$pAdjFDR
)。jckbn6z72#
您可以使用
lapply
循环df4ANOVA
Dataframe ,使用grep
仅标识具有Gene
的列:这将产生一个长度为50的列表,每个列表包含该列的
aov
的完整结果。如果你想要一个包含p值和基因名称的最终 Dataframe ,你可以首先调整
lapply
语句,只提取p值,然后调整do.call
,把它们放在一起:输出:
一个更“干净”的方法可能是使用
dplyr::bind_rows
和tibble::rownames_to_column
:这两种方法在功能上都可以得到相同的结果 Dataframe 。