为什么R在lm.predict函数中表现奇怪,在下面的代码中?

时间:2013-04-08 19:19:00

标签: r linear-regression

我对下面的代码有疑问,我正在努力理解:

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的“引擎盖下”的差异吗?很高兴知道将来如何理解这类问题。我已经尝试在上面的代码中查看对象的结构,但我没有接近答案。

提前谢谢。

1 个答案:

答案 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列指定数据框,并在公式中使用使用那些列名