如何解决如何从R中的Forecast :: auto.arima获取前x个模型的所有详细信息? 有区别没有区别
我的目标是从R中的auto.arima
函数精确地重新创建说出最多的3个模型。我的示例使用以下系列:
> data <- c(79,73,102,158,235,326,216,153,82,87,94,163,119,81,143,179,182,247,248,105,64,45,122,95,47,117,345,454,596,440,207,100,187,106,98,66,178,196,279,128,80,112,175,91,52,35,14,20,332,386,121,167,53,224,76,68,42,61,125,273,431,1901,86,65,120,227,131,84,48,157)
> time_series <- ts(data,freq=12,start=c(2013,10))
我使用下面显示的auto.arima
函数捕获最佳模型的模型信息,并在文本中查看顶级模型。
> library(forecast)
> auto_mod <- auto.arima(time_series,trace=TRUE)
ARIMA(2,2)(1,1)[12] with non-zero mean : 1067.045
ARIMA(0,0) with non-zero mean : 1057.566
ARIMA(1,0)(1,0)[12] with non-zero mean : 1057.504
ARIMA(0,1)(0,1)[12] with non-zero mean : 1057.727
ARIMA(0,0) with zero mean : 1092.138
ARIMA(1,0) with non-zero mean : 1055.976
ARIMA(1,0)(0,1)[12] with non-zero mean : 1057.629
ARIMA(1,1)[12] with non-zero mean : 1058.261
ARIMA(2,0) with non-zero mean : 1058.174
ARIMA(1,1) with non-zero mean : 1058.187
ARIMA(0,1) with non-zero mean : 1056.126
ARIMA(2,1) with non-zero mean : Inf
ARIMA(1,0) with zero mean : 1070.847
Best model: ARIMA(1,0) with non-zero mean
> summary(auto_mod)
Series: time_series
ARIMA(1,0) with non-zero mean
Coefficients:
ar1 mean
0.2170 176.2688
s.e. 0.1105 32.0040
sigma^2 estimated as 49991: log likelihood=-524.82
AIC=1055.65 AICc=1055.98 BIC=1062.68
Training set error measures:
ME RMSE MAE MPE MAPE MASE
Training set 0.3042569 220.664 104.5716 -76.32587 96.76548 1.051865
ACF1
Training set 0.006605514
我以为我可以使用文本输出来准确地重新创建除前1个模型之外的其他模型,但是我已经意识到文本输出中的模型描述很接近,但是似乎不能准确地确定每个模型独特地我认为它可以提供有关是否存在拦截或漂移的信息,但不能同时提供这两种信息。我在下面找到了一个这样的示例,其中两个不同的模型,一个带有截距,一个没有截距,具有相同的标签。
> mod1 <- Arima(time_series,order=c(1,0),seasonal=c(1,include.drift=TRUE,+ include.mean=TRUE)
> summary(mod1)
Series: time_series
ARIMA(1,0)[12] with drift
Coefficients:
ar1 sar1 intercept drift
0.1722 0.1976 132.4150 1.2188
s.e. 0.1175 0.2059 68.9234 1.5233
sigma^2 estimated as 50174: log likelihood=-524.15
AIC=1058.31 AICc=1059.15 BIC=1070.03
Training set error measures:
ME RMSE MAE MPE MAPE MASE
Training set -0.05272209 218.099 99.62455 -76.12583 94.97947 1.002104
ACF1
Training set 0.004756765
> mod2 <- Arima(time_series,+ include.mean=FALSE)
> summary(mod2)
Series: time_series
ARIMA(1,0)[12] with drift
Coefficients:
ar1 sar1 drift
0.2014 0.2862 3.6940
s.e. 0.1205 0.1960 0.9009
sigma^2 estimated as 51238: log likelihood=-525.77
AIC=1059.53 AICc=1060.09 BIC=1068.91
Training set error measures:
ME RMSE MAE MPE MAPE MASE
Training set 19.14777 221.9052 107.1779 -57.65942 96.53528 1.078082
ACF1
Training set -0.01092874
因此,总而言之,我的问题是:有没有一种方法可以在R中使用自动拟合过程来获得顶级的x arima模型?我愿意接受任何解决方案,但我对解决方案的优先顺序为:
- 一种从
auto.arima
中抽取前x个模型的模型对象的方法 - 一种在文本中获取顶部x模型信息或更好地理解trace参数以便自己创建模型的方法。
- 其他一些软件包或功能
在此先感谢您能提供的任何帮助!
解决方法
来自forecast::auto.arima
跟踪的信息唯一地确定了模型。
让我们为第三个模型明确验证这一点(使用您的示例数据):
ARIMA(1,0)(1,0)[12] with non-zero mean : 1057.504
我们使用基数R的arima
来手动拟合同一模型
fit3 <- arima(
time_series,order = c(1,0),seasonal = list(order = c(1,period = 12L),include.mean = TRUE)
使用ML估计模型参数时,arima
返回AIC值;另一方面,forecast::auto.arima
的轨迹将返回校正后的(对于小样本量)AIC。感谢this post on Cross Validated,我们可以编写一个自定义函数,该函数根据模型参数计算AICc。
get_AICc <- function(fit) {
npar <- length(fit$coef) + 1
nstar <- length(fit$residuals) - fit$arma[6] - fit$arma[7] * fit$arma[5]
fit$aic + 2 * npar * (nstar/(nstar - npar - 1) - 1)
}
我们确认更正后的AIC与forecast::auto.arima
跟踪中报告的AIC相同:
get_AICc(fit3)
#[1] 1057.504
forecast::Arima
自动返回AIC和AICc值,并且拟合结果与arima
中的结果一致(毫不奇怪,forecast::Arima
内部调用arima
)和{{1} }:
forecast::auto.arima
与基数R的
Arima(
time_series,seasonal = c(1,include.mean = TRUE)
)
#Series: time_series
#ARIMA(1,0)[12] with non-zero mean
#
#Coefficients:
# ar1 sar1 mean
#0.1849 0.1780 179.5156
#s.e. 0.1168 0.2077 36.2321
#
#sigma^2 estimated as 49966: log likelihood=-524.47
#AIC=1056.95 AICc=1057.5 BIC=1066.32
相比,arima
允许更灵活地包含常量:而forecast::Arima
允许通过arima
,{{1 }}还允许使用随时间变化(确定性)的漂移参数。有关更多详细信息,请参见Constants and ARIMA models in R。
我不知道已经可以从include.mean
获取前n个模型拟合列表的方法。跟踪仅将在参数空间中搜索到的中间结果打印到控制台。过去,我定义并编写了自己的SARIMA模型参数的参数网格搜索,以根据一种信息标准确定最佳拟合模型;但是,forecast::Arima
更为复杂,并且也考虑(即不包括)模型拟合的单位根靠近单位圆。最好的选择是定义自己的网格搜索,并使其返回前n个模型的列表。或修改forecast::auto.arima
的代码以返回这样的列表;或者(可能是最不优雅的解决方案)捕获并解析forecast::auto.arima
的输出以提取模型参数并使用forecast::auto.arima
或auto.arima(... trace = TRUE)
重新拟合。
更新1
我确实说过,捕获arima
的输出可能是最不优雅的方法,但是我最终还是这样做了。也许这对您有所帮助:
让我们定义一个函数,该函数解析从forecast::Arima
生成的ARIMA模型字符串。
auto.arima
然后我们可以使用auto.arima
捕获parse_SARIMA_string <- function(x) {
include.mean <- str_detect(x,"with non-zero mean")
x %>%
str_remove_all(":.+$") %>%
str_replace_all("\\D"," ") %>%
trimws() %>%
enframe() %>%
separate(
value,c("p","d","q","P","D","Q","period"),sep = "\\s+",fill = "right") %>%
mutate(include.mean = include.mean)
}
的踪迹并解析模型字符串
capture.output
现在您有了一个带有模型参数的forecast::auto.arima
/ library(tidyverse)
capture.output(auto.arima(time_series,trace = TRUE)) %>%
str_subset("^ ARIMA") %>%
parse_SARIMA_string()
## A tibble: 13 x 9
# name p d q P D Q period include.mean
# <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <lgl>
# 1 1 2 0 2 1 0 1 12 TRUE
# 2 2 0 0 0 NA NA NA NA TRUE
# 3 3 1 0 0 1 0 0 12 TRUE
# 4 4 0 0 1 0 0 1 12 TRUE
# 5 5 0 0 0 NA NA NA NA FALSE
# 6 6 1 0 0 NA NA NA NA TRUE
# 7 7 1 0 0 0 0 1 12 TRUE
# 8 8 1 0 0 1 0 1 12 TRUE
# 9 9 2 0 0 NA NA NA NA TRUE
#10 10 1 0 1 NA NA NA NA TRUE
#11 11 0 0 1 NA NA NA NA TRUE
#12 12 2 0 1 NA NA NA NA TRUE
#13 13 1 0 0 NA NA NA NA FALSE
,可以在data.frame
或tibble
中直接使用它们。
更新2
关于基于arima
模型字符串的SARIMA模型的可识别性,让我们看一些特定的模型。
有区别
-
模型1是具有常数的ARMA模型
-
模型2是具有漂移的ARIMA模型
我们可以扩展模型以获得
-
模型3是具有漂移和常数的ARIMA模型
当我们扩展模型3时,我们注意到常数项由于微分而抵消,并且最终得到相同的模型2。
因此,具有漂移和漂移+常数的forecast::Arima
模型描述了相同的过程。在这种情况下,将模型报告为“具有漂移的ARIMA(1,1,0)”指的是与“具有漂移且非零均值的ARIMA(1,0)”相同的模型。
没有区别
对于auto.arima
,默认情况下使用d=1
会产生漂移和恒定偏移量参数,请参见Constants and ARIMA models in R。如果指定d=0
,然后手动强制include.drift = TRUE
,则会得到不同的模型(如在include.drift = TRUE
和include.mean = FALSE
中所示)。据我了解,mod1
永远不会发生这种情况,其中mod2
隐含始终具有forecast::auto.arima
。因此,来自include.drift = TRUE
的SARIMA字符串include.mean = TRUE
将转换为具有偏移和偏移量的SARIMA(1,0)(1,0)[12]模型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。