plot.lm错误:$运算符对原子向量无效

时间:2016-11-13 08:52:20

标签: r plot regression linear-regression lm

我有以下带有转换的回归模型:

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都能正常运作。

1 个答案:

答案 0 :(得分:4)

这实际上是一个非常有趣的观察。实际上,在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属性( read ?is.object;它是检查对象是否具有类属性的非常有效的方法) 。什么课?

class(int)
# [1] AsIs

class(slope)
# [1] AsIs

这是使用I()的结果。确切地说,它们从rs继承了这样的类,并且从响应变量继承。也就是说,如果我们在响应中使用I(),模型公式的RHS,我们会得到这种行为。

你可以在这里做一些实验:

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可以接受带有&#34; lm&#34;的线性模型对象。类。在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(),但不能在响应中使用lmplot.lm和大多数通用函数在处理此问题时都遇到了问题,但{{1}}会。{/ p>