【问题标题】:auto arima: r and python suggest different arima models for same data, why?auto arima:r 和 python 为相同的数据建议不同的 arima 模型,为什么?
【发布时间】:2019-11-10 04:19:35
【问题描述】:

我曾尝试在python 中同时使用auto arimaR 以获得相同的数据,但得到不同的ARIMA 模型选择是具有不同AIC 的最佳模型。你能告诉我为什么我会得到来自两种语言的不同AIC 的不同最佳模型吗?

R 的数据和代码

wineind <- c(15136., 16733., 20016., 17708., 18019., 19227., 22893., 23739.,
         21133., 22591., 26786., 29740., 15028., 17977., 20008., 21354.,
         19498., 22125., 25817., 28779., 20960., 22254., 27392., 29945.,
         16933., 17892., 20533., 23569., 22417., 22084., 26580., 27454.,
         24081., 23451., 28991., 31386., 16896., 20045., 23471., 21747.,
         25621., 23859., 25500., 30998., 24475., 23145., 29701., 34365.,
         17556., 22077., 25702., 22214., 26886., 23191., 27831., 35406.,
         23195., 25110., 30009., 36242., 18450., 21845., 26488., 22394.,
         28057., 25451., 24872., 33424., 24052., 28449., 33533., 37351.,
         19969., 21701., 26249., 24493., 24603., 26485., 30723., 34569.,
         26689., 26157., 32064., 38870., 21337., 19419., 23166., 28286.,
         24570., 24001., 33151., 24878., 26804., 28967., 33311., 40226.,
         20504., 23060., 23562., 27562., 23940., 24584., 34303., 25517.,
         23494., 29095., 32903., 34379., 16991., 21109., 23740., 25552.,
         21752., 20294., 29009., 25500., 24166., 26960., 31222., 38641.,
         14672., 17543., 25453., 32683., 22449., 22316., 27595., 25451.,
         25421., 25288., 32568., 35110., 16052., 22146., 21198., 19543.,
         22084., 23816., 29961., 26773., 26635., 26972., 30207., 38687.,
         16974., 21697., 24179., 23757., 25013., 24019., 30345., 24488.,
         25156., 25650., 30923., 37240., 17466., 19463., 24352., 26805.,
         25236., 24735., 29356., 31234., 22724., 28496., 32857., 37198.,
         13652., 22784., 23565., 26323., 23779., 27549., 29660., 23356.)
tswineind<-ts(wineind, start=c(1985,1), frequency=12)
library(forecast)
tswineindbest<-auto.arima(tswineind,approximation = FALSE)
tswineindbest

R 的结果

ARIMA(0,1,3)(0,1,1)[12]

Python 的数据和代码

import numpy as np
import pmdarima as pm
from pmdarima.datasets import load_wineind

# this is a dataset from R
wineind = load_wineind().astype(np.float64)

# fit stepwise auto-ARIMA
stepwise_fit = pm.auto_arima(wineind, start_p=1, start_q=1,
                             max_p=3, max_q=3, m=12,
                             start_P=0, seasonal=True,
                             d=1, D=1, trace=True,
                             error_action='ignore',  # don't want to know if an order does not work
                             suppress_warnings=True,  # don't want convergence warnings
                             stepwise=True)  # set to stepwise
stepwise_fit.summary()

Python 的结果

    SARIMAX(1, 1, 2)x(0, 1, 1, 12)  AIC 3066.742

我希望 RPython 使用相同的最佳模型和相同的 AIC

【问题讨论】:

  • 我希望 R 和 Python 使用相同的最佳模型和相同的 AIC。 您确定在两种情况下都使用相同的算法吗?这可能很有趣:stackoverflow.com/questions/22770352/…
  • 我看到了一个大问题——你没有使用相同的数据。从pmdarima 包加载的wineind 数据集与您为R 粘贴的数据不同...
  • 感谢我编辑帖子的观察。

标签: r python-3.x arima


【解决方案1】:

我在网上转了一圈,发现这个 python 代码非常有用

# import package
import itertools

# Define the p, d and q parameters to take any value between 0 and 2
p = d = q = range(0, 3)

# Generate all different combinations of p, q and q triplets
pdq = list(itertools.product(p, d, q))

# Generate all different combinations of seasonal p, q and q 
triplets
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in 
list(itertools.product(p, d, q))]

print('Examples of parameter combinations for Seasonal ARIMA...')
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))

warnings.filterwarnings("ignore") # specify to ignore warning messages

for param in pdq:
    for param_seasonal in seasonal_pdq:
        try:
            mod = sm.tsa.statespace.SARIMAX(ts,
                                     order=param,
                                     seasonal_order=param_seasonal,
                                     enforce_stationarity=False,
                                     enforce_invertibility=False)

            results = mod.fit()

            print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
        except:
            continue

这里的变量 tp imput 是我在 python 代码中用ts表示的单一时间序列数据。结果与R中的auto.arima相同。

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2015-07-31
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多