"lm(offense$R ~ offense$OBP)" 和 "lm(R ~ OBP)" 有什么区别?这涉及到IT技术。

6

我正在尝试使用R语言创建一个线性模型,并使用它来预测一些值。主题是关于棒球统计数据的。如果我这样做:

obp <- lm(offense$R ~ offense$OBP)
predict(obp, newdata=data.frame(OBP=0.5), interval="predict")

我收到了错误信息:警告信息:“newdata”只有1行,但发现有20行变量。

然而,如果我这样做:

attach(offense)
obp <- lm(R ~ OBP)
predict(obp, newdata=data.frame(OBP=0.5), interval="predict")

它按预期工作,我得到了一个结果。这两者之间有什么区别?如果我只打印OBP和offense$OBP,它们看起来是一样的。

2个回答

7
在第一个情况下,如果您打印模型,则会得到以下结果:
Call:
lm(formula = offense$R ~ offense$OBP)

Coefficients:
(Intercept)  offense$OBP  
    -0.1102       0.5276 

但是在第二个,您会得到这个:
Call:
lm(formula = R ~ OBP)

Coefficients:
(Intercept)          OBP  
    -0.1102       0.5276  

请看系数的名称。当您使用newdata=data.frame(OBP=0.5)创建您的新数据时,这对于第一个模型来说并没有太多意义,因此忽略了新数据,您只能使用训练数据获取预测值。当您使用offense$R ~ offense$OBP时,该公式只有每侧两个向量,没有与data.frame相关联的名称。

最好的方法是:

obp = lm(R ~ OBP, data=offense)
predict(obp, newdata=data.frame(OBP=0.5), interval="predict")

你将会得到正确的结果,即OBP=0.5的预测。


谢谢。非常棒的答案。我之前不知道有"data=offense"这个表述。 - Steve Rowe

1

没有区别——你会得到相同的系数。

但是有些编程风格比其他更好——应该避免使用“attach”,以及较为冗长的第一种形式。

大多数有经验的用户都这样做。

 lm(R ~ OBP, offense)

代替。

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