3

我对下面的代码有疑问,我试图理解:

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”的生成方式。

我的理解是,在 predict 函数中,newdata 根据存储在 model1 和 model2 对象中的模型生成我们想要预测“yhat”值的新观察集。

有什么根本不同

模型1 <- lm(y ~ x - 1)

模型2 <- lm(df_eq[,2] ~ df_eq[,1] - 1) ?

更重要的是,如果答案是直截了当的,有人可以解释他们是如何找出与 R 的“幕后”不同的吗?很高兴知道我将来如何理解这种问题。我试过查看上面代码中对象的结构,但离答案还很近。

先感谢您。

4

1 回答 1

6

从 R 的角度来看,您predict.lm将对象递给model2。它说:“好的,我lm这里有一个对象。变量名是什么?”

> formula(model2)
df_eq[, 2] ~ df_eq[, 1] - 1

行。调用响应变量,调用 df_eq[, 2]预测变量。现在,R 认为:“我应该在”中找到那些变量(或至少是预测变量)。 df_eq[, 1]xpred

嗯。里面没有那个名字。

我相信,实际警告是model.frame.default在尝试构建适当的模型框架时引发的,并在此过程中回退到用于拟合模型的原始数据值。

通常(或以其他方式)拟合模型的正确习惯用法lm如下:

lm(y ~ x, data = df_eq)

不要依赖 R 获取全局环境中对象的名称。指定具有相关列的数据框并在公式中使用这些列名

于 2013-04-08T19:26:40.753 回答