对数据框的每一列运行ANOVA(cols表示mRNA/蛋白质)

xqkwcwgp  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(120)

在一个特征数据框(例如蛋白质或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?

示例数据

  1. # gene df and list
  2. genes <- paste("gene",1:1000,sep="")
  3. x <- list(
  4. A = sample(genes,300),
  5. B = sample(genes,525),
  6. C = sample(genes,440),
  7. D = sample(genes,350)
  8. )
  9. # expression dataframe
  10. crete_exp_df <- function(gene_nr, sample_nr){
  11. df <- replicate(sample_nr, rnorm(gene_nr))
  12. rownames(df) <- paste("Gene", c(1:nrow(df)))
  13. colnames(df) <- paste("Sample", c(1:ncol(df)))
  14. return(df)
  15. }
  16. df1 <- crete_exp_df(50, 20)
  17. df1 <- as.data.frame(df1)
  18. df1$fid <- rownames(df1)
  19. # creator for ANOVA
  20. df4ANOVA <- df1 %>% pivot_longer(-fid) %>%
  21. pivot_wider(names_from="fid", values_from="value") %>%
  22. rename(id=name)
  23. df4ANOVA$group <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5)

溶液(不工作)

  1. library(tidyverse)
  2. library(broom)
  3. df4ANOVA$group <- as.factor(df4ANOVA$group )
  4. df4ANOVA$id <- NULL
  5. # ANOVA
  6. baseformula <- " ~ group"
  7. ANOVA_group <- for (i in 2:ncol(exp4anov)) {
  8. formula <- paste(colnames(exp4anov)[i], baseformula, sep="")
  9. p <- summary(aov(as.formula(formula), data=exp4anov))[[1]][["Pr(>F)"]][1]
  10. print(paste(formula, ": p=", p, sep=""))

}

r3i60tvu

r3i60tvu1#

一种可能性是ffmanova包:

  1. library(ffmanova)
  2. res <- ffmanova(as.matrix((df4ANOVA[1:50]))~ df4ANOVA$group)

你会发现经典的单向p值是res$pRaw的第二行,也就是res$pRaw[2, ]
例如,通过将nSim = 9999添加到ffmanova调用,也可以使用pRaw的调整后的替代方案(res$pAdjustedres$pAdjFDR)。

jckbn6z7

jckbn6z72#

您可以使用lapply循环df4ANOVA Dataframe ,使用grep仅标识具有Gene的列:

  1. aov_list <- lapply(df4ANOVA[grep("Gene", colnames(df4ANOVA))],
  2. function(x) aov(df4ANOVA$group ~ x))

这将产生一个长度为50的列表,每个列表包含该列的aov的完整结果。
如果你想要一个包含p值和基因名称的最终 Dataframe ,你可以首先调整lapply语句,只提取p值,然后调整do.call,把它们放在一起:

  1. aov_plist <- lapply(df4ANOVA[grep("Gene", colnames(df4ANOVA))],
  2. function(x) summary(aov(df4ANOVA$group ~ x))[[1]][5][1,])
  3. finaldat <- data.frame(pval = do.call(rbind, aov_plist))
  4. finaldat$gene <- rownames(finaldat)

输出:

  1. # pval gene
  2. # Gene 1 0.551729974 Gene 1
  3. # Gene 2 0.725349369 Gene 2
  4. # Gene 3 0.983277774 Gene 3
  5. # Gene 4 0.811234760 Gene 4
  6. # Gene 5 0.765013222 Gene 5
  7. # Gene 6 0.144887277 Gene 6
  8. # ...

一个更“干净”的方法可能是使用dplyr::bind_rowstibble::rownames_to_column

  1. data.frame(t(bind_rows(aov_plist))) %>%
  2. tibble::rownames_to_column("Gene")

这两种方法在功能上都可以得到相同的结果 Dataframe 。

展开查看全部

相关问题