plot.lm 错误:$ 操作符对于原子向量无效

4

我有一个带有转换的回归模型:

fit <- lm( I(NewValue ^ (1 / 3)) ~ I(CurrentValue ^ (1 / 3)) + Age + Type - 1,
           data = dataReg)
plot(fit)                                                                      

但是plot会出现以下错误:

Error: $ operator is invalid for atomic vectors

有什么想法,我做错了什么吗?

注意: summarypredictresiduals 都可以正常工作。


你能发布 summary fit 吗? - Christoph
@Christoph 我本来要发布总结的,但是Zheyuan Li的回答已经很好地补充了我的帖子。 - k88074
1个回答

9

这实际上是一个非常有趣的观察结果。事实上,在plot.lm支持的所有6个图中,只有Q-Q图在这种情况下失败了。考虑以下可复制的示例:

x <- runif(20)
y <- runif(20)
fit <- lm(I(y ^ (1/3)) ~ I(x ^ (1/3)))
## only `which = 2L` (QQ plot) fails; `which = 1, 3, 4, 5, 6` all work
stats:::plot.lm(fit, which = 2L)

plot.lm函数内部,Q-Q图可以简单地通过以下方式生成:

rs <- rstandard(fit)  ## standardised residuals
qqnorm(rs)  ## fine
## inside `qqline(rs)`
yy <- quantile(rs, c(0.25, 0.75))
xx <- qnorm(c(0.25, 0.75))
slope <- diff(yy)/diff(xx)
int <- yy[1L] - slope * xx[1L]
abline(int, slope)  ## this fails!!!

错误:$ 操作符对于原子向量无效

因此,这完全是 abline 函数的问题! 注意:

is.object(int)
# [1] TRUE

is.object(slope)
# [1] TRUE

即,intslope 都有 class 属性(阅读 ?is.object;这是一种非常有效的检查对象是否有 class 属性的方法)。那么它们属于哪个 class?
class(int)
# [1] AsIs

class(slope)
# [1] AsIs

这是使用 I() 的结果。准确地说,它们从 rs 类继承,进一步从响应变量继承。也就是说,如果我们在模型公式的 RHS 上使用 I(),就会得到这种行为。
你可以在这里进行一些实验:
abline(as.numeric(int), as.numeric(slope))  ## OK
abline(as.numeric(int), slope)  ## OK
abline(int, as.numeric(slope))  ## fails!!
abline(int, slope)  ## fails!!

因此,abline(a, b)非常敏感于第一个参数a是否具有类属性。

为什么?因为abline可以接受具有“lm”类的线性模型对象。在abline内部:

if (is.object(a) || is.list(a)) {
    p <- length(coefa <- as.vector(coef(a)))

如果a有一个类,abline将其视为模型对象(无论它是否真的是!!!),然后尝试使用coef来获取系数。这里进行的检查相当不健壮; 我们可以很容易地使abline失败:

plot(0:1, 0:1)
a <- 0  ## plain numeric
abline(a, 1)  ## OK
class(a) <- "whatever"  ## add a class
abline(a, 1)  ## oops, fails!!!

错误:原子向量无效的$操作符

因此,结论是:在模型公式中避免在响应变量上使用I() 在协变量上使用I()是可以的,但在响应变量上使用不行。 lm和大多数通用函数处理这个问题不会有麻烦,但plot.lm会出现问题。


3
残差 - 拟合图已经正确生成,但在绘制Q-Q图时遇到了问题。当我避免使用I()函数时,所有事情都顺利进行。 - k88074

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接