计算预测值时发出警告

时间:2012-08-03 20:37:07

标签: r lm predict

使用数据框

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

4 个答案:

答案 0 :(得分: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 :(得分:1)

您的data.frame a有一个名为a的列。您使用名为ValDate的列创建了模型,这就是它所寻找的。

当您将data.frame a名称列为Date列时,您就可以了:

a <- data.frame(Date=a)

然后它在没有警告的情况下运行。

每条评论:

将您的lm电话编辑为:

lm(Val ~ Date, data=x)

答案 2 :(得分: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,....)

使用新值,您可以计算残差,MSE等......

答案 3 :(得分:0)

而不是x.lm&lt; -lm(x $ Val~x $ Date,data = x)使用x.lm&lt; -lm(Val~Date,data = x)。在lm函数中删除变量名之前的数据集名称应该有帮助。