2015-04-03 57 views
2

我在嘗試測試模型的準確性時收到了上述消息。計劃是預測最後15個時間點,並將它們與實際的誤差值進行比較,但出於某種原因,我得到了「可變長度差異」錯誤消息。在預測中收到「可變長度差異」錯誤

這是使用來自astsa包的johnson和johnson數據(數據(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 

回答

2

的問題是,你想叫predictnewdata的論點,即不包含所有在模型中使用的變量。 new只包含ts,而不包含tsq。你可以解決這個問題的:

  1. 創建包含兩種tstsq,或
  2. 更好的解決方案是使用你的型號規格I()符號,就像定義tsq一data.frame newlm(X ~ ts + I(ts^2/factorial(2)))I()表示法會自動生成轉換,因此您不必手動創建功率術語等,只需將它們包含在您的規範中即可。

舉個例子,你可以嘗試這一點與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 
+0

非常感謝你 - 你是一個拯救生命的人! – MattLH 2015-04-03 21:40:47

+0

@MattLH你能把這個標記爲答案嗎?這可能對一羣民衆有用。 – Navneet 2015-08-11 16:28:46