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)

我收到这个错误:

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

4 回答 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)
于 2012-08-03T21:25:29.180 回答
1

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

当你把你的data.frame a名字命名为那个专栏时Date,你很高兴:

a <- data.frame(Date=a)

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

每条评论:

将您的呼叫编辑lm为:

lm(Val ~ Date, data=x)
于 2012-08-03T21:01:25.090 回答
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 等...

于 2015-04-22T09:41:16.653 回答
0

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

于 2017-07-14T09:25:04.277 回答