2017-01-15 10 views
0

次のコードがあります。 ARMAモデルAR(1)、MA(0)、AR(1)MA(2)などのさまざまな組み合わせをループするだけで非常に簡単です。magrittrフォワードパイプを使用してARMAモデルを使用してループすることができません

load.or.install <- function(package.names) { 
    is.installed <- function(mypkg) is.element(mypkg, installed.packages()[, 1]) 

    for (package.name in package.names) { 
     if (!is.installed(package.name)) { 
      install.packages(package.name) 
     } 
     library(package.name, character.only = TRUE, quietly = TRUE, verbose = FALSE) 
    } 
} 

load.or.install(c("tseries", "forecast", "ggplot2", "dplyr", "magrittr", "rdatamarket")) 

max.p <- 8 # maximum number of AR terms 
max.q <- 7 # maximum number of MA terms 
    #import data 
ausgdp <- as.ts(dmseries("http://data.is/1jDQwpr")[, 1]) %>% log() %>% diff(difference = 1) 


model.orders <- as.matrix(expand.grid(AR = 0:max.p, DIF = 0, MA = 0:max.q)) 
models <- list() 
1:nrow(model.orders) %>% { 
    models[[.]] <- Arima(ausgdp, order = model.orders[.,], include.constant = T, method = "ML") 
} 

ただし、次のエラーメッセージが表示されます。

Error in stats::arima(x = x, order = order, seasonal = seasonal, xreg = xreg, : 
    'order' must be a non-negative numeric vector of length 3 

ループ外で次のコマンドを実行すると動作します。

Arima(ausgdp, order = model.orders[1,], include.constant = T, method = "ML") 

そのmodel.orders[.,]とループ内では 任意の助けをいただければ幸い失敗したら。

答えて

2

メモ次の操作を実行するとどうなりますか。

1:nrow(model.orders) %>% {length(.)}

あなたは実際には1つずつ、一度1:nrow(model.orders)内のすべての要素を渡していません。

model.ordersを一度に1行ずつサブセット化し、それをorderに渡す代わりに、すべての行が1つになり、エラーが表示されます。

パイプの後にlapplyを使用して、目的の結果を得ることができます。

models <- 1:nrow(model.orders) %>% 
    lapply(., function(row_n){ 
    Arima(ausgdp, 
      order = as.vector(model.orders[row_n, ]), 
      include.constant = T, 
      method = "ML") 
    }) 
関連する問題