我在尝试测试模型的准确性时收到了上述消息。计划是预测最后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
答案 0 :(得分:2)
问题在于您尝试使用predict
参数调用newdata
,该参数不包含模型中使用的所有变量。 new
仅包含ts
,而不是tsq
。您可以通过以下方式解决此问题:
new
和ts
,或tsq
tsq
表示法定义I()
,例如:lm(X ~ ts + I(ts^2/factorial(2)))
。 I()
表示法会自动生成转换,因此您无需手动创建权限术语等,只需将其包含在lm
规范中即可。例如,您可以使用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