我对下面的代码有疑问,我正在努力理解:
x = rnorm(50)
y = 3 * x +rnorm(50)
df_eq <- data.frame(x, y)
model1 <- lm(y ~ x - 1)
model2 <- lm(df_eq[,2] ~ df_eq[,1] - 1)
xpred <- data.frame(x = seq(from = -2, to = 2, length = 5))
ypred <- predict(object = model1, newdata = xpred)
ypred2 <- predict(object = model2, newdata = xpred)
在上面的代码中,我期望ypred和ypred2都能产生相同的结果。我得到了ypred的预期答案(5个预测的“yhat”值),但是ypred2有错误,并且没有产生预期的结果。
任何人都可以解释为什么,在下面的代码中,ypred2产生错误(至少在R 2.15.2中)?
我认为代码中唯一的关键区别来自于“model1”和“model2”的生成方式。
我的理解是,在预测函数中,newdata生成一组新的观察结果,我们希望根据存储在model1和model2对象中的模型预测“yhat”值。
的根本不同之处
model1&lt; - lm(y~x - 1)
和
model2&lt; - lm(df_eq [,2] ~df_eq [,1] - 1)?
更重要的是,如果答案很简单,有人可以解释他们是如何找出R的“引擎盖下”的差异吗?很高兴知道将来如何理解这类问题。我已经尝试在上面的代码中查看对象的结构,但我没有接近答案。
提前谢谢。
答案 0 :(得分:6)
从R的角度来看,你手predict.lm
对象model2
。它说,&#34;好的,我在这里有lm
个对象。什么是变量名?&#34;
> formula(model2)
df_eq[, 2] ~ df_eq[, 1] - 1
确定。响应变量称为 df_eq[, 2]
,预测变量称为 df_eq[, 1]
。现在,R认为:&#34;我应该在xpred
&#34;中找到那些变量(或至少是预测变量)。
Hmmmm。那个名字里面没有任何东西。
我相信,在尝试构建合适的模型框架时,model.frame.default
会抛出实际警告,并且在此过程中会回退到用于拟合模型的原始数据值。
通常(lm
或其他)拟合模型的正确习惯用语如下:
lm(y ~ x, data = df_eq)
不要依赖R在您的全球环境中获取对象的名称。使用relavent列指定数据框,并在公式中使用使用那些列名!