我认为在为使用
lm()
制作的模型绘制诊断图时遇到了错误,其中包括使用 poly()
的 ggResidPanel::resid_panel()
术语。
df <- data.frame(x=rnorm(100),
y=rnorm(100))
limo <- lm(y~poly(x, degree=2, raw=T), data=df)
summary(limo)
resid_panel(limo) ### this is where the error is
Error in [<-.data.frame`(`*tmp*`, , i, value = c("poly(x, degree = 2): 0.95", :
replacement has 200 rows, data has 100
我最初认为这可能与 Poly 函数的规范有关,例如线性项和多项式项的正交化,但已用尽
poly()
函数中的所有设置。
我不知道
poly()
函数如何“命名”这些术语,但我现在认为存在一些错误,这就是为什么错误认为 x 有 200 行,而实际上应该只有 100 行。
任何指针、poly() 的替代方案或对 poly 的更正将受到高度赞赏。
此错误是由于 poly 函数返回矩阵造成的。并且当结合到模型中时,矩阵被认为是一列。往下看:
limo <- lm(y~poly(x, degree=2, raw=T), data=df)
head(model.frame(limo)) # head(limo$model)
y poly(x, degree = 2, raw = T).1 poly(x, degree = 2, raw = T).2
1 2.0079704 0.19350954 0.03744594
2 0.9932644 -0.21109075 0.04455930
3 0.4524215 0.45671674 0.20859018
4 -1.1717744 -1.01049661 1.02110340
5 -1.3694232 -1.12266529 1.26037736
6 1.2252210 -1.27126749 1.61612102
虽然上面看起来是一个 3 列的数据框,但事实并非如此。它有 2 列。
ncol(limo$model)
[1] 2
第二列是一个有 2 列的矩阵:
ncol(limo$model[[2]])
[1] 2
矩阵只是一个具有维数属性的向量。它的长度是nrow*ncol
这就是问题所在。当数据传递到 resid_panel 函数时,您最终得到的矩阵长度就是您的
x
,因此与 y
的长度不同。
卡维埃:
一个小解决方法是将模型框架更改为数据框架:
limo$model <- do.call(cbind.data.frame, limo$model)
summary(limo)
resid_panel(limo)