在R中使用lapply和anova时的行为不一致

时间:2016-08-26 17:15:39

标签: r anova

函数anova.lm的文档提供了一个示例,其中设置了五个不同的线性模型,并通过函数anova进行了比较。

data(LifeCycleSavings)
fit0 <- lm(sr ~ 1, data = LifeCycleSavings)
fit1 <- update(fit0, . ~ . + pop15)
fit2 <- update(fit1, . ~ . + pop75)
fit3 <- update(fit2, . ~ . + dpi)
fit4 <- update(fit3, . ~ . + ddpi)
anova(fit0, fit1, fit2, fit3, fit4, test = "F")

你也可以使用lapply连续对模型执行函数anova

fit_L = list(fit0, fit1, fit2, fit3, fit4)
lapply(fit_L, anova)

类似地,包diversitree的函数find.mle的文档提供了一个示例,其中设置了两个模型并通过函数anova进行了比较。

library(diversitree)
#
pars <- c(0.1, 0.2, 0.03, 0.03, 0.01, 0.01)
phy <- tree.bisse(pars, max.t=60, x0=0)
lik <- make.bisse(phy, phy$tip.state)
fit <- find.mle(lik, pars)
lik.l <- constrain(lik, lambda0 ~ lambda1)
fit.l <- find.mle(lik.l, pars[-2])
anova(fit, equal.lambda=fit.l)

但是,我不能使用lapply在两个模型上执行函数anova

fit_L = list(fit, fit.l)
lapply(fit_L, anova)
# Error in anova.fit.mle(X[[i]], ...) : Need to specify more than one model

有人可以考虑使用lapply(或类似函数)来处理包diversitree中的示例吗?

编辑1:

澄清我的问题:我的帖子的基本想法是使lapply独立于要测试的模型的精确数量。对于某些分析,我不知道有多少模型将被测试 a priori ,因此lapply anova会很好,但很多模型恰好在列表中{ {1}}。

1 个答案:

答案 0 :(得分:2)

lapply迭代列表的元素并将函数应用于它们。这不是你想要的。您希望将所有列表元素作为参数传递给函数,这是do.call的作用:

do.call(anova, c(fit_L, test = "F"))

如果您使用anova.lm查看示例,则会看到使用lapply时输出不同。来自文档:

  

指定单个对象可提供方差的顺序分析   适合的表格。 [...]如果指定了多个对象,则   表格中有一行剩余自由度和平方和   对于每个型号。对于除第一个模型之外的所有模型,度数的变化   自由和平方和也给出了。 ...

lapply将单个对象传递给anova.lm。这对您的mle拟合不起作用,因为相应的anova方法仅进行模型比较。