2014-03-12 60 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) 

代替。