【问题标题】:Correct use of sapply with Anova on multiple subsets in R在 R 中的多个子集上正确使用 sapply 和 Anova
【发布时间】:2014-05-30 19:16:51
【问题描述】:

我正在尝试在数据帧的多个子集上运行双向 ANOVA,而不必实际对数据进行子集化,因为这效率低下

示例数据:

DF<-structure(list(Sample = c(666L, 676L, 686L, 667L, 677L, 687L, 
822L, 832L, 842L, 824L, 834L, 844L), Time = c(300L, 300L, 300L, 
300L, 300L, 300L, 400L, 400L, 400L, 400L, 400L, 400L), Ploidy = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("2n", 
"3n"), class = "factor"), Tissue = c("muscle", "muscle", "muscle", 
"liver", "liver", "liver", "intestine", "intestine", "intestine", 
"gill", "gill", "gill"), X.lipid = c(1.1, 0.8, 1.3, 3.7, 3.9, 
3.8, 5.2, 3.4, 6, 7.6, 10.4, 6.7), l.dec = c(0.011, 0.008, 0.013, 
0.037, 0.039, 0.038, 0.052, 0.034, 0.06, 0.076, 0.104, 0.067), 
l.arc = c(0.105074124512229, 0.0895624074394449, 0.114266036973812, 
0.193560218793138, 0.19879088899975, 0.196192082631721, 0.230059118691331, 
0.185452088760136, 0.247467063170448, 0.279298057669285, 
0.328359182374352, 0.261824790465914)), .Names = c("Sample", 
"Time", "Ploidy", "Tissue", "X.lipid", "l.dec", "l.arc"), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 69L, 70L, 71L, 72L, 73L, 74L), class = "data.frame")

遇到类似的例子:Anova, for loop to apply functionANOVA on multiple responses, by multiple groups NOT part of formula

我可以接近,但我不认为这是正确的,因为它使用 aov,而不是 anova

x<- unique(DF$Tissue)

sapply(x, function(my) {
f <- as.formula(paste("l.dec~Time*Ploidy"))
aov(f, data=DF)
}, simplify=FALSE)

如果我将 aov 切换为 anova,它会返回错误消息:

 Error in UseMethod("anova") : 
 no applicable method for 'anova' applied to an object of class "formula" 

漫长但正确的方法如下:

#Subset by each Tissue type (just one here for e.g.)
muscle<- subset (DF, Tissue == "muscle")
#Perform Anova
anova(lm(l.dec ~ Ploidy * Time, data = muscle))

但是,在主数据框中,我有许多组织类型,并且希望避免执行此子集。

我相信应用公式已经接近,但在最后阶段需要帮助。

【问题讨论】:

  • sapply(x, function(my) { anova(lm(l.arc~Time*Ploidy, data=DF, Tissue==my)), simplify=FALSE)。这使用了lm 的子集功能
  • anova 从拟合的线性模型生成方差分析表(它不适合模型本身;这就是 lmaov 所做的)。您必须使用 anova(lm(...))anova(aov(...)) 来获取 ANOVA 表,就像您在独立示例中所做的那样。 aovlm 的包装器,它以更“传统”的 ANOVA 形式打印其结果(请参阅 aov 的帮助:?aov
  • 感谢您的指点:再过几个星期就可以了:sapply(x, function(my) { anova(lm(l.arc~Ploidy*Time, data=DF, Tissue==my) ) }, 简化=FALSE)

标签: r apply anova sapply


【解决方案1】:

在@user20650 和上面我的cmets 的基础上,我建议首先使用sapplylm 来生成您的模型列表,然后在该列表上再次使用sapply 来生成您的ANOVA 表。这样您就可以使用模型列表,以便您获得系数、拟合值、残差等。

x <- unique(DF$Tissue)

models <- sapply(x, function(my) {
  lm(l.dec ~ Time * Ploidy, data=DF, Tissue==my)
}, simplify=FALSE)

ANOVA.tables <- sapply(models, anova, simplify=FALSE)

【讨论】:

  • 让它同时工作。 ANOVA.tables 的不错的额外部分!
  • 谢谢。这正是我正在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多