2017-01-15 1 views
0

У меня есть следующий фрагмент кода. Кажется очень простым, он просто перебирает различные комбинации ARMA-моделей AR (1), MA (0), затем AR (1) MA (2) и т. Д.Невозможно выполнить цикл с использованием моделей ARMA с использованием прямой трубы magrittr

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:nrow(model.orders) сразу, а не по одному.

Вместо подмножества model.orders по одной строке за один раз, а затем передавая ее order, вы получаете все строки за один раз, вызывая ошибку.

Вы можете достичь желаемого результата, используя lapply после трубы.

models <- 1:nrow(model.orders) %>% 
    lapply(., function(row_n){ 
    Arima(ausgdp, 
      order = as.vector(model.orders[row_n, ]), 
      include.constant = T, 
      method = "ML") 
    }) 
Смежные вопросы