LM和Predict - 数据框名称的一致性问题

4

在使用R开发回归模型时,我有类似于以下内容:

c_lm = lm(trainingset$dependent ~ trainingset$independent)
c_pred = predict(c_lm,testset$independent))

每次我都会从R中得到一个神秘的错误信息:

Warning message:
'newdata' had 34 rows but variables found have 142 rows 

这基本上意味着R无法找到测试集数据框中的独立列。这是因为lm公式右侧的确切名称必须在predict中存在。为了修复它,我可以这样做:

tempset = trainingset
c_lm = lm(trainingset$dependent ~ tempset$independent)

tempset = testset
c_pred = predict(c_lm,tempset$independent))

或类似变体,但在我看来这样做非常粗糙。

是否有另一种方法可以清理两者之间的翻译,以便独立变量的数据框在预测中不必与lm中的名称完全相同?


newdata 应该是一个数据框,其中仅包含一列,其变量名与原始 lm() 调用中的 x 变量名完全匹配。 尝试使用 predict(c_lm, newdata=testset) - bdemarest
1个回答

4
不不不,如果你想要使用模型公式中的所有其他内容,请不要像你现在这样使用公式接口。你写道:
c_lm = lm(trainingset$dependent ~ trainingset$independent)

您重复使用了trainingset两次,这是浪费时间和精力的冗余操作,还会导致您遇到问题。当您现在调用predict时,它将在testset中寻找一个名为trainingset$independent的变量,但这个变量显然不存在。相反,您可以在调用lm()时使用data参数。例如,以下代码与您的公式拟合同样的模型,且有效且能正常工作与predict()一起使用。
c_lm = lm(dependent ~ independent, data = trainingset)

现在当您调用predict(c_lm, newdata = testset)时,您只需要有一个数据框,其中包含一个名称为independent(或者您在模型公式中使用的任何其他名称)的变量。
按照我展示的方式编写公式的另一个原因是易读性。将对象名称从公式中移出可以更轻松地查看模型。

6
非常好的答案,虽然可以更加有力地表达一些。;-) - Dirk Eddelbuettel
2
谢谢你的回答。等我耳朵不再流血后,我会纠正我的使用错误。此外,我会仔细检查你所说的虚构“文档”。 - KirkD-CO
6
对于粗鲁的行为给予-1评分。这样会使得新加入的Stack Overflow成员感到气馁。 - jlhoward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接