在 R 中对 ARIMA AIC 进行排序
Posted
技术标签:
【中文标题】在 R 中对 ARIMA AIC 进行排序【英文标题】:Sorting ARIMA AIC in R 【发布时间】:2016-10-26 04:38:06 【问题描述】:我有以下代码返回具有最低 AIC 的模型,但我希望所有模型的 AIC 按升序或降序排列,而不使用 R 中的内置排序函数
sp <- rnorm(100) ## just some toy data to make code work!
spfinal.aic <- Inf
spfinal.order <- c(0,0,0)
for (p in 1:4) for (d in 0:1) for (q in 1:4)
spcurrent.aic <- AIC(arima(sp, order=c(p, d, q)))
if (spcurrent.aic < spfinal.aic)
spfinal.aic <- spcurrent.aic
spfinal.order <- c(p, d, q)
spfinal.arima <- arima(sp, order=spfinal.order)
我希望spfinal.order<-c(p,d,p)
成为 AIC 升序或降序的所有模型的列表。我该怎么做?
【问题讨论】:
您能解释一下为什么要避免使用sort
吗?
使用order()
或sort()
之类的函数会导致多余的计算。
【参考方案1】:
下面的代码可以满足您的需求。由于您想要记录所有已尝试的模型,因此不会在循环内进行比较。向量 aic.vec
将保存所有模型的 AIC 值,而矩阵 order.matrix
将逐列保存 ARIMA 规范。最后,我们按 AIC 值升序对两者进行排序,以便您知道最好的模型是第一个。
sp <- rnorm(100) ## just some toy data to make code work!
order.matrix <- matrix(0, nrow = 3, ncol = 4 * 2 * 4)
aic.vec <- numeric(4 * 2 * 4)
k <- 1
for (p in 1:4) for (d in 0:1) for (q in 1:4)
order.matrix[, k] <- c(p,d,q)
aic.vec[k] <- AIC(arima(sp, order=c(p, d, q)))
k <- k+1
ind <- order(aic.vec, decreasing = FALSE)
aic.vec <- aic.vec[ind]
order.matrix <- order.matrix[, ind]
我没有使用列表来存储 ARIMA 规范,因为我认为矩阵更好。目前,矩阵是宽格式,即 3 行多列。您可以将其转置以获得更好的打印效果:
order.matrix <- t(order.matrix)
也许您还想将order.matrix
和aic.vec
绑定在一起以便更好地展示?这样做:
result <- cbind(order.matrix, aic.vec)
colnames(result) <- c("p", "d", "q", "AIC")
我认为这使您更容易检查。示例输出(前 5 行):
> result
p d q AIC
[1,] 2 0 2 305.5698
[2,] 3 0 3 305.8882
[3,] 1 0 3 307.8365
[4,] 2 1 3 307.9137
[5,] 1 1 2 307.9952
【讨论】:
以上是关于在 R 中对 ARIMA AIC 进行排序的主要内容,如果未能解决你的问题,请参考以下文章