lm(进攻$ R~进攻$ OBP)和lm(R~OBP)有什么区别?

时间:2014-03-12 21:40:41

标签: r dataframe prediction lm predict

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

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

我收到错误消息:警告消息:&#39; newdata&#39;有一行,但找到的变量有20行。

但是,如果我这样做:

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

它按预期工作,我得到一个结果。两者有什么区别?如果我只打印OBP并攻击$ OBP,它们看起来一样。

2 个答案:

答案 0 :(得分: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的预测。

答案 1 :(得分:1)

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

但是有些编程风格比其他编程风格更好 - 并且应该避免附加,就像更详细的第一种形式一样。

大多数有经验的用户

 lm(R ~ OBP, offense)

代替。