我試圖使用循環創建所有組合的模型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)
'expand.grid'可以讓你成爲一個矩陣,每行對應一組獨特的參數。然後使用'apply'(或alply)將每行提供給Arima。 –
@RichardTelford謝謝expand.grid非常方便!我發現將apply和Arima結合起來傳遞來自我用擴展網格製作的矩陣的每一行都有點棘手。你對這部分有小費嗎?或者你知道一個類似的例子嗎?我從我的嘗試中添加了更新的代碼,以及我收到的錯誤。 – user3476463