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

Ste*_*owe 6 r prediction predict dataframe lm

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

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

我收到错误:警告消息:'newdata'有1行,但找到的变量有20行.

但是,如果我这样做:

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

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

Ric*_*mos 7

在第一种情况下,如果您打印模型,则会得到此信息:

Call:
lm(formula = offense$R ~ offense$OBP)

Coefficients:
(Intercept)  offense$OBP  
    -0.1102       0.5276 
Run Code Online (Sandbox Code Playgroud)

但在第二个,你得到这个:

Call:
lm(formula = R ~ OBP)

Coefficients:
(Intercept)          OBP  
    -0.1102       0.5276  
Run Code Online (Sandbox Code Playgroud)

看一下系数的名称.当您创建新数据时newdata=data.frame(OBP=0.5),对第一个模型没有意义,因此忽略newdata并且您只能获得训练数据的预测值.使用时offense$R ~ offense$OBP,公式每侧只有两个向量,没有与a关联的名称data.frame.

最好的方法是:

obp = lm(R ~ OBP, data=offense)
predict(obp, newdata=data.frame(OBP=0.5), interval="predict")
Run Code Online (Sandbox Code Playgroud)

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