【问题标题】: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。我刚刚更新了它

标签: r lm predict


【解决方案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 &lt;- 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 的列。您使用名为 ValDate 的列创建了模型,这就是它要查找的内容。

      当您将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 的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 2021-03-29
      • 2019-05-28
      • 2018-05-13
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多