无法使用 magrittr 前向管道循环使用 ARMA 模型
Unable to loop using over ARMA models using magrittr forward pipe
我有以下一段代码。
看起来很简单,它只是循环遍历 ARMA 模型 AR(1)、MA(0) 然后 AR(1) MA(2) 等的各种组合。
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[.,]
循环,它就会失败
任何帮助将不胜感激。
请注意当您 运行 以下内容时会发生什么。
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")
})
我有以下一段代码。 看起来很简单,它只是循环遍历 ARMA 模型 AR(1)、MA(0) 然后 AR(1) MA(2) 等的各种组合。
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[.,]
循环,它就会失败
任何帮助将不胜感激。
请注意当您 运行 以下内容时会发生什么。
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")
})