我有以下带有转换的回归模型:
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
关于我做错了什么的想法?
注意:summary
,predict
和residuals
都能正常运作。
答案 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
即,int
和slope
都有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()
,但不能在响应中使用lm
。 plot.lm
和大多数通用函数在处理此问题时都遇到了问题,但{{1}}会。{/ p>