2017-01-15 3 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 

루프 외부에서 다음 명령을 실행하면 작동합니다. 그것의 model.orders[.,]와 루프가 실패하면

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

는 어떤 도움을 주시면 감사하겠습니다.

답변

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") 
    })