尝试使用 lm 中的多项式生成残差面板图时出错

问题描述 投票:0回答:1

我认为在为使用

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 的更正将受到高度赞赏。

r ggplot2 lm poly
1个回答
0
投票

此错误是由于 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)
© www.soinside.com 2019 - 2024. All rights reserved.