2016-04-24 41 views
0

我試圖使用循環創建所有組合的模型p = 15到1,d = 2到0,q = 15到1,然後使用滾動預測對這些模型進行評估,並挑選出具有最低mape的模型(準確度(fc $ mean,test)[,5])。使用循環創建所有組合的訂單

我不太擅長循環,所以任何提示都非常感謝。我在下面的「代碼之前」示例中工作,並在「代碼之後」顯示我想如何修改它。

代碼之前:

library("fpp") 

h <- 5 
tsTrain <- window(hsales,end=1989.99) 
tsTest <- window(hsales,start=1990) 
n <- length(tsTest) - h + 1 
ModFit <- Arima(tsTrain, order=c(15,2,15) 
fc <- ts(numeric(n), start=1990+(h-1)/12, freq=12) 
for(i in 1:n) 
{ 
    x <- window(hsales, end=1989.99 + (i-1)/12) 
    reModFit <- Arima(x, model=ModFit) 
    fc[i] <- forecast(reModFit, h=h)$mean[h] 
} 

後編碼:

library("fpp") 

h <- 5 
tsTrain <- window(hsales,end=1989.99) 
tsTest <- window(hsales,start=1990) 
n <- length(tsTest) - h + 1 

##Create models for all combinations of p 15 to 0, d 2 to 0, q 15 to 0 

ModFit1 <- Arima(tsTrain, order=c(15,2,15) 
ModFit2 <- Arima(tsTrain, order=c(9,2,15) 
ModFit3 <- Arima(tsTrain, order=c(8,2,15) 
. 
. 
. 
ModFit15 <- Arima(tsTrain, order=c(0,2,15) 
fc1 <- ts(numeric(n), start=1990+(h-1)/12, freq=12) 
fc2 <- ts(numeric(n), start=1990+(h-1)/12, freq=12) 
fc3 <- ts(numeric(n), start=1990+(h-1)/12, freq=12) 
. 
. 
. 
fc15 <- ts(numeric(n), start=1990+(h-1)/12, freq=12) 
for(i in 1:n) 
{ 
    x <- window(hsales, end=1989.99 + (i-1)/12) 
    reModFit1 <- Arima(x, model=ModFit1) 
    reModFit2 <- Arima(x, model=ModFit2) 
    reModFit3 <- Arima(x, model=ModFit3) 
    . 
    . 
    . 
    reModFit15 <- Arima(x, model=ModFit15) 
    fc1[i] <- forecast(reModFit1, h=h)$mean[h] 
    fc2[i] <- forecast(reModFit2, h=h)$mean[h] 
    fc3[i] <- forecast(reModFit3, h=h)$mean[h] 
    . 
    . 
    . 
    fc15[i] <- forecast(reModFit15, h=h)$mean[h] 
} 

##Calculating mape for forecasts 

Accuracy(fc1$mean,tsTest)[,5] 
Accuracy(fc2$mean,tsTest)[,5] 
Accuracy(fc3$mean,tsTest)[,5] 
. 
. 
. 
Accuracy(fc15$mean,tsTest)[,5] 

##Return the order of the Arima model that has the lowest mape 
ModFit5 ARIMA(10,2,15) ##This is just an example, I don't know if this really the one with the lowest mape. 

更新:

pvar<-1:15 
dvar<-1:2 
qvar<-1:15 

OrderGrid<-expand.grid(pvar,dvar,qvar) 


ModFit <-function(a,b,c,dat){ 
      m=Arima(tsTrain, order=c(a,b,c)) 
      return(m) 
          } 


Fits<-apply(OrderGrid,1,ModFit) 

錯誤:

錯誤的Arima(tsTrain,爲了= C(A ,b,c)): 變量 「c」 被缺失,沒有默認值

更新:

ModFit <- function(x, dat){ 
m=Arima(dat, order=c(x[[1]], x[[2]], x[[3]]),method="ML") 
return(m) 
} 

Fits <- plyr::alply(OrderGrid, 1, ModFit, dat = tsTrain) 
+0

'expand.grid'可以讓你成爲一個矩陣,每行對應一組獨特的參數。然後使用'apply'(或alply)將每行提供給Arima。 –

+0

@RichardTelford謝謝expand.grid非常方便!我發現將apply和Arima結合起來傳遞來自我用擴展網格製作的矩陣的每一行都有點棘手。你對這部分有小費嗎?或者你知道一個類似的例子嗎?我從我的嘗試中添加了更新的代碼,以及我收到的錯誤。 – user3476463

回答

0

使用expand.gridalply作爲apply將簡化到馬對象的矩陣,這將是一個痛苦

pvar<-1:15 
dvar<-1:2 
qvar<-1:15 

OrderGrid<-expand.grid(pvar,dvar,qvar) 

ModFit <- function(x, dat){ 
      m=Arima(dat, order=c(x[[1]], x[[2]], x[[3]])) 
      return(m) 
} 

Fits <- plyr::alply(OrderGrid, 1, ModFit, dat = tsTrain) 

Fits將成爲一個列表。

+0

感謝您的代碼示例。當我嘗試運行你的代碼時,我收到以下錯誤。你知道這個問題是什麼嗎?錯誤:順序錯誤[2] +季節性$ order [2]: 二元運算符的非數字參數 – user3476463

+0

修正錯誤 - 需要雙倍[[而不是單個] –

+0

謝謝,添加[[擺脫舊錯誤,然後我從Arima部分獲得了一個新的。我可以通過添加method =「ML」來修復新的錯誤。我已經添加了上面更新的工作代碼。 – user3476463