首页 > 解决方案 > 使用线性模型进行预测和 data.frame 的重要性

问题描述

我写信是想问为什么我们应该添加 data.frame() 来使用 lm 进行预测

第一段代码应该是错误的,第二段代码应该是正确的。

dim(iris)
model_1<-lm(Sepal.Length~Sepal.Width, data=iris)
summary(model_1)
print(predict(model_1, Sepal.Width=c(1,3,4,5)))

dim(iris)
model_1<-lm(Sepal.Length~Sepal.Width, data=iris)
summary(model_1)
print(predict(model_1,data.frame(Sepal.Width=c(1,3,4,5))))

标签: rdataframepredictionlm

解决方案


当你调用predict一个lm对象时,调用的函数是predict.lm。当你像这样运行它时:

predict(model_1, Sepal.Width=c(1,3,4,5))

您正在做的是为 提供c(1,3,4,5)一个参数或参数 ,因为此函数不存在此参数Sepal.Width,所以它会忽略。predict.lm

当没有新的输入数据时,您正在运行predict.lm(model_1),并取回拟合值:

table(predict(model_1) == predict(model_1, Sepal.Width=c(1,3,4,5)))

TRUE 
 150

在这种情况下,您为模型拟合了一个公式,该predict.lm函数需要您的数据框来重建独立或外生矩阵,矩阵乘以系数并返回预测值。

这就是predict.lm正在做的事情:

newdata = data.frame(Sepal.Width=c(1,3,4,5))
Terms = delete.response(terms(model_1))
X = model.matrix(Terms,newdata)

X
  (Intercept) Sepal.Width
1           1           1
2           1           3
3           1           4
4           1           5

X %*% coefficients(model_1)
      [,1]
1 6.302861
2 5.856139
3 5.632778
4 5.409417

predict(model_1,newdata)

       1        2        3        4 
6.302861 5.856139 5.632778 5.409417

推荐阅读