nlme函数anova.lme()
和anova.gls()
的文档明确指出:
"当只有一个拟合的模型对象存在时,一个具有平方和的数据框,..."正在退货。
运行以下示例时,不会打印任何平方和:
library(nlme)
fm1 <- lme(distance ~ age, Orthodont, random = ~ 1 | Subject)
anova(fm1)
# numDF denDF F-value p-value
# (Intercept) 1 80 3126.1443 <.0001
# age 1 80 114.8383 <.0001
对我来说这看起来像个错误。我相信它应该在R bugzilla页面上报告,但我似乎无法访问它。
使用aov()
运行相同的模型会产生以下结果:
summary(aov(distance ~ age + Error(Subject), Orthodont))
# Error: Subject
# Df Sum Sq Mean Sq F value Pr(>F)
# Residuals 26 518.4 19.94
# Error: Within
# Df Sum Sq Mean Sq F value Pr(>F)
# age 1 235.4 235.36 114.8 <2e-16 ***
# Residuals 80 164.0 2.05
这是一种解决方法,用于手动计算固定效果和残差的平方和。
基于@Drey的评论,我试图直接从anova.lme()
函数中检索平方和。通过执行anova.lme
可以看到源代码。相关的线条似乎是下面的线条(对于连续和边际的平方和)
for (i in 1:nTerms) {
nDF[i] <- length(assign[[i]])
if (type == "sequential") {
c0i <- c0[assign[[i]]]
}
else {
c0i <- c(qr.qty(qr(vFix[, assign[[i]], drop = FALSE]),
c0))[1:nDF[i]]
}
Fval[i] <- sum(c0i^2)/nDF[i]
Pval[i] <- 1 - pf(Fval[i], nDF[i], dDF[i])
对于上述模型,第一次迭代时c0i
= 55.9,第二次迭代时为10.7。
sum(c0i^2)
= 3126.1(拦截的F值)和第二次迭代的114.8(年龄的F值)。
age 的F值可以通过将年龄均值Sq(235.36)除以残差的均值Sq(2.05)来计算,如{{1}中的表所示}。 aov()
在这里做了不同的事情,但我不知道是什么。有人知道这里发生了什么以及如何使其与anova.lme
实施更加一致吗?