计算预测值时出现警告提示

7

使用数据框架

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)

I am getting this erro:

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")

1
你第一行的 z 应该是一个 x 吗?否则我们不知道 z 是什么。你没有收到错误,而是收到了一个警告。另外,你展示给我们的数据没有29行,所以我们无法重复你的问题。请使用 dput 函数向我们展示你的实际数据。 - Justin
抱歉,是的,它是x。我刚刚更新了它。 - user1471980
4个回答

10

你在 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)

1
或者 x.lm <- lm(Val~Date,data=x); predict(x.lm, newdata=data.frame(Date=a)) - Ben Bolker
@BenBolker,你是对的,with(x, ...) 在这里可能有点过头了。我已经相应地更改了我的答案。谢谢。 - MvG
顺便问一下,有没有什么方法可以查看R参数传递的工作方式,而不会让你的大脑受伤? - Florian Mayer
@FlorianMayer:你读过语言参考手册的4.3节吗? - MvG

1

您的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
@MvG 是的,你说得对,我在摆弄时改变了 OP 的代码,然后忘记了。 - Justin

0
如果你无法让 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,....)

使用新值,您可以计算残差、均方误差等等...

0

不要使用 x.lm <- lm(x$Val ~ x$Date,data = x),而是使用 x.lm <- lm(Val ~ Date,data = x)。在 lm 函数中移除变量名前的数据集名称可以帮助提高效果。


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