我正在尝试使用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,它们看起来一样。
答案 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)
代替。