函数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}}。
答案 0 :(得分:2)
lapply
迭代列表的元素并将函数应用于它们。这不是你想要的。您希望将所有列表元素作为参数传递给函数,这是do.call
的作用:
do.call(anova, c(fit_L, test = "F"))
如果您使用anova.lm
查看示例,则会看到使用lapply
时输出不同。来自文档:
指定单个对象可提供方差的顺序分析 适合的表格。 [...]如果指定了多个对象,则 表格中有一行剩余自由度和平方和 对于每个型号。对于除第一个模型之外的所有模型,度数的变化 自由和平方和也给出了。 ...
lapply
将单个对象传递给anova.lm
。这对您的mle
拟合不起作用,因为相应的anova
方法仅进行模型比较。