接收"可变长度不同"预测错误

时间:2015-04-03 20:34:13

标签: r

我在尝试测试模型的准确性时收到了上述消息。计划是预测最后15个时间点并将它们与错误值的实际数据进行比较,但出于某种原因,我得到了“可变长度差异”错误消息。

这是使用astsa包中的johnson和johnson数据(data(jj))。这是代码和相关错误 -

> ##set up JJ data and time because its quarterly data
> X.all<-jj[1:84]
> t<-time(jj)
> 
> values<-length(t)-15
> ts<-t[1:values]
> tsq<-ts^2/factorial(2)
> X<-X.all[1:values]
> year.first<-values+1
> year.last<-length(t)
> ##setting t for 15 values using quarterly idea
> new<-data.frame(ts=t[year.first:year.last])
> X.true<-X.all[(values+1):length(t)]
> fit1<-lm(X~ts+tsq)
> Xhat<-predict(fit1,new,se.fit=TRUE)
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
  variable lengths differ (found for 'tsq')
In addition: Warning message:
'newdata' had 15 rows but variables found have 69 rows 

> X.hat<-round(Xhat$fit,2)
> error<-X.true-X.hat

1 个答案:

答案 0 :(得分:2)

问题在于您尝试使用predict参数调用newdata,该参数不包含模型中使用的所有变量。 new仅包含ts,而不是tsq。您可以通过以下方式解决此问题:

  1. 创建包含newts,或
  2. 的data.frame tsq
  3. 更好的解决方案是在模型规范中使用tsq表示法定义I(),例如:lm(X ~ ts + I(ts^2/factorial(2)))I()表示法会自动生成转换,因此您无需手动创建权限术语等,只需将其包含在lm规范中即可。
  4. 例如,您可以使用iris数据集进行尝试,看看它如何比您当前的方法更好地工作:

    fit1 <- lm(Sepal.Length ~ Sepal.Width + I(Sepal.Width^2/factorial(2)), data = iris)
    new <- data.frame(Sepal.Width = seq(1,5,by = 0.25))
    predict(fit1, new)
    

    我们可以将此与您的方法进行比较,并观察您遇到的错误:

    s2 <- I(iris$Sepal.Width^2/factorial(2))
    fit1 <- lm(Sepal.Length ~ Sepal.Width + s2, data = iris)
    new <- data.frame(Sepal.Width = seq(1,5,by = 0.25))
    predict(fit1, new)
    # Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
    #   variable lengths differ (found for 's2')
    # In addition: Warning message:
    # 'newdata' had 17 rows but variables found have 150 rows