计算预测值时发出警告
Posted
技术标签:
【中文标题】计算预测值时发出警告【英文标题】:warning when calculating predicted values 【发布时间】:2012-08-01 22:16:57 【问题描述】:使用数据框
x
Date Val
1/1/2012 7
2/1/2012 9
3/1/2012 20
4/1/2012 24
5/1/2012 50
a <- seq(as.Date(tail(x, 1)$Date), by="month", length=5)
a <- data.frame(a)
x.lm <- lm(x$Val ~ x$Date)
x.pre<-predict(x.lm, newdata=a)
我收到了这个错误:
Warning message:
'newdata' had 5 rows but variable(s) found have 29 rows
我做错了什么?
这里是 dput 输出:
dput(x)
structure(list(Date = structure(c(14610, 14641, 14669, 14700,
14730, 14761, 14791, 14822, 14853, 14883, 14914, 14944, 14975,
15006, 15034, 15065, 15095, 15126, 15156, 15187, 15218, 15248,
15279, 15309, 15340, 15371, 15400, 15431, 15461), class = "Date"),
Val = c(45, 51, 56, 56, 59, 60, 60, 60, 64, 65, 75, 73, 74,
80, 87, 91, 92, 96, 109, 108, 123, 129, 133, 143, 127, 127,
123, 121, 130)), .Names = c("Date", "Val"), row.names = c(NA,
29L), class = "data.frame")
【问题讨论】:
第一行中的z
是否应该是x
?否则我们不知道z
是什么。您没有收到错误,而是收到警告。此外,您向我们展示的任何内容都没有 29 行,因此我们不能重复此操作。使用dput
向我们展示您的实际数据。
对不起,是 x。我刚刚更新了它
【参考方案1】:
使用 x.lm
【讨论】:
【参考方案2】:如果您无法使predict.lm()
工作,那么您应该尝试使用function()
编写自己的函数:
yourown_function<- function(predictor1, predictor2,...)intercept+b1*predictor1+b2*predictor2+...
使用 yourown_function
从任何新数据帧进行预测:
newvalues<- yourown_function(predictor1=data.frame$predictor1, predictor2=data.frame$predictor2,....)
使用新值,您可以计算残差、MSE 等...
【讨论】:
【参考方案3】:存储在x.lm
模型中的变量名称参考x
数据框。 a
中没有同名变量,因此它将再次使用来自 x
的 29 个变量,这可能不是您想要的,因此是警告。您可以执行以下操作以始终在模型中使用名为 Date
的非限定变量:
a <- seq(as.Date(tail(x, 1)$Date), by="month", length=5)
a <- data.frame(Date = a)
x.lm <- lm(Val ~ Date, data=x)
x.pre<-predict(x.lm, newdata=a)
【讨论】:
或x.lm <- lm(Val~Date,data=x); predict(x.lm, newdata=data.frame(Date=a))
@BenBolker,你说得对,with(x,…)
在这里可能有点矫枉过正。相应地改变了我的答案。谢谢。
顺便说一句,有没有什么方法可以查看 R 参数传递的工作原理并且不会伤到你的大脑?
@FlorianMayer:你读过section 4.3 of the language reference吗?【参考方案4】:
您的data.frame a
有一个名为a
的列。您使用名为 Val
和 Date
的列创建了模型,这就是它要查找的内容。
当您将data.frame a
命名为Date
列时,您就可以开始了:
a <- data.frame(Date=a)
然后它在没有警告的情况下运行。
每条评论:
将您的 lm
呼叫编辑为:
lm(Val ~ Date, data=x)
【讨论】:
仍然给我警告,因为变量在这里被称为x$Date
。即使实际上在数据框中调用它"x$Date"
似乎也不够。您是否像 OP 写的那样测试了它?如果是这样,您的 R 版本和我的 2.15.1 版本之间可能存在差异。
@MvG 是的,你说得对,我在摆弄和忘记的时候更改了 OP 的代码。以上是关于计算预测值时发出警告的主要内容,如果未能解决你的问题,请参考以下文章
predict.lm() 循环。警告:来自秩不足拟合的预测可能具有误导性
警告:精度和 F 分数定义不明确,在没有预测样本的标签中设置为 0.0。使用 `zero_division` 参数