使用装有 poly(..., 2) 的 nlme::gls 二次模型进行预测的问题
Issues predicting with `nlme::gls`quadratic model fitted with `poly(..., 2)`
我已经拟合了一个具有方差结构的二次模型,该结构允许每个因子水平有不同的方差水平,但我在预测只有 2 个条目的新数据集时遇到了问题。这是一个可重现的例子:
library(nlme)
set.seed(101)
mtcars$amf <- factor(mtcars$am)
modGLS <- gls(mpg ~ amf*poly(hp, 2),
weights = varIdent(form = ~ 1|amf), data = mtcars)
minhp <- min(mtcars$hp); maxhp <- max(mtcars$hp)
newdata <- data.frame(amf = as.factor(c(0, 1)),
hp = round(runif(2, min = minhp, max = maxhp)))
newdata2 <- data.frame(amf = as.factor(c(0, 0, 1)),
hp = round(runif(3, min = minhp, max = maxhp)))
predict(modGLS, newdata = newdata)
# Error in poly(hp, 2) : 'degree' must be less than number of unique points
predict(modGLS, newdata = newdata2)
## [1] 5.973306 13.758955 44.037921
## attr(,"label")
## [1] "Predicted values"
但是,预测在 lm
框架上运行良好:
modLM <- lm(mpg ~ amf*poly(hp, 2), mtcars)
predict(modLM, newdata = newdata)
## 1 2
## 25.22253 16.83943
为什么会这样? emmeans
的包维护者之一似乎认为这可能与 attr(, “predvars”)
上缺少信息有关
(请在此处查看我们的讨论 https://github.com/rvlenth/emmeans/issues/133)
我已将此事报告给 Bates 博士(nlme
联系人),但我想我也会联系更广泛的社区。
提前致谢
感谢@BenBolker 和@russ-lenth 确认问题与 GLS 对象中缺少的 terms
属性 "predvars"
有关,它提供了 [=13= 的拟合系数].请注意这是如何在 LM 框架(原始 post)中工作的,并且属性在那里(另请参见 ?makepredictcall
)。请注意,这可能对预测有潜在影响。
## e.g. this fails
poly(newdata$hp, 2)
## but this is okay, because the polynomial has been estimated
polyFit <- poly(mtcars$hp, 2)
predict(polyFit, newdata = newdata$hp)
attr(terms(modLM), "predvars")
## list(mpg, amf, poly(hp, 2, coefs = list(alpha = c(146.6875, 198.071514938048), norm2 = c(1, 32, 145726.875, 977168457.086594))))
attr(terms(modGLS), "predvars")
## NULL
我已经拟合了一个具有方差结构的二次模型,该结构允许每个因子水平有不同的方差水平,但我在预测只有 2 个条目的新数据集时遇到了问题。这是一个可重现的例子:
library(nlme)
set.seed(101)
mtcars$amf <- factor(mtcars$am)
modGLS <- gls(mpg ~ amf*poly(hp, 2),
weights = varIdent(form = ~ 1|amf), data = mtcars)
minhp <- min(mtcars$hp); maxhp <- max(mtcars$hp)
newdata <- data.frame(amf = as.factor(c(0, 1)),
hp = round(runif(2, min = minhp, max = maxhp)))
newdata2 <- data.frame(amf = as.factor(c(0, 0, 1)),
hp = round(runif(3, min = minhp, max = maxhp)))
predict(modGLS, newdata = newdata)
# Error in poly(hp, 2) : 'degree' must be less than number of unique points
predict(modGLS, newdata = newdata2)
## [1] 5.973306 13.758955 44.037921
## attr(,"label")
## [1] "Predicted values"
但是,预测在 lm
框架上运行良好:
modLM <- lm(mpg ~ amf*poly(hp, 2), mtcars)
predict(modLM, newdata = newdata)
## 1 2
## 25.22253 16.83943
为什么会这样? emmeans
的包维护者之一似乎认为这可能与 attr(, “predvars”)
上缺少信息有关
(请在此处查看我们的讨论 https://github.com/rvlenth/emmeans/issues/133)
我已将此事报告给 Bates 博士(nlme
联系人),但我想我也会联系更广泛的社区。
提前致谢
感谢@BenBolker 和@russ-lenth 确认问题与 GLS 对象中缺少的 terms
属性 "predvars"
有关,它提供了 [=13= 的拟合系数].请注意这是如何在 LM 框架(原始 post)中工作的,并且属性在那里(另请参见 ?makepredictcall
)。请注意,这可能对预测有潜在影响。
## e.g. this fails
poly(newdata$hp, 2)
## but this is okay, because the polynomial has been estimated
polyFit <- poly(mtcars$hp, 2)
predict(polyFit, newdata = newdata$hp)
attr(terms(modLM), "predvars")
## list(mpg, amf, poly(hp, 2, coefs = list(alpha = c(146.6875, 198.071514938048), norm2 = c(1, 32, 145726.875, 977168457.086594))))
attr(terms(modGLS), "predvars")
## NULL