2014-03-12 139 views
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并冒犯$ OBP,它们看起来是一样的。

回答

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)创建新数据时,对第一个模型没有意义,所以新数据将被忽略,并且您只能使用训练数据获得预测值。当您使用时,该公式在每边只有两个向量,没有与data.frame关联的名称。

做到这一点的最好办法是:

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

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

+0

谢谢。真棒回答。我不知道,数据=犯罪公式。 –

1

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

但是,一些编程风格比其他编程风格更好 - 附加是要避免,因为是更详细的第一种形式。

大多数有经验的用户做

lm(R ~ OBP, offense) 

代替。