Python Statsmodel ARIMA start [стационарность]

Я только начал работать над анализом временных рядов с помощью statsmodels. У меня есть набор данных с датами и значений (около 3 месяцев). Я сталкиваюсь с некоторыми проблемами с обеспечением правильного порядка модели ARIMA. Я ищу, чтобы скорректировать тенденции и сезонность, а затем вычислить выбросы.

мои "значения" не являются стационарными, и statsmodel говорит, что я должен либо индуцировать стационарность, либо обеспечить некоторое различие, чтобы заставить его работать. Я играл с другим порядком (без глубокое понимание последствий изменения p, q и d).

когда я представляю 1 для дифференцирования, я получаю эту ошибку:

ValueError: The start index -1 of the original series has been differenced away

когда я удаляю различие, имея мой заказ как (скажем) order = (2,0,1), Я получаю эту ошибку:

    raise ValueError("The computed initial AR coefficients are not "
ValueError: The computed initial AR coefficients are not stationary
You should induce stationarity, choose a different model order, or you can
pass your own start_params.
>>> 

любая помощь о том, как вызвать стационарность (или ссылку на хороший учебник) было бы полезно. И, кроме того, тесты стационарности (например,http://www.maths.bris.ac.uk / ~guy/Research/LSTS/TOS.html) будет быть полезным.

Update: я читаю через тест ADF:

http://statsmodels.sourceforge.net/stable/generated/statsmodels.tsa.stattools.adfuller.html

спасибо! ПАЛЛАДИЙ.

2 ответов


чтобы вызвать стационарности:

  1. de-seasonalize (удалить сезонность)
  2. de-trend (удалить тренд)

существует несколько способов достижения стационарности временного ряда - семейства преобразований бокса-Кокса, дифференцирования и т. д. Выбор метода зависит от данных. Ниже приведены часто используемые тесты на стационарность.

тесты на стационарность: 1. Дополненный Dickey-более полный тест 2. Kpss-теста КПСС в Python код


вы можете использовать скрипт R вместо statmodels. R является более мощным для статистической оценки.

Если вы хотите использовать python, вы можете запустить R-скрипт с python через интерфейс ОС:

например, сценарий R для оценки arima " arimaestimation.r":

library(rjson)

args <- commandArgs(trailingOnly=TRUE)

jsonstring = ''

for(i in seq(0, length(args))) {
    if ( length(args[i]) && args[i]=='--jsondata' ) {
        jsonstring = args[i+1]
    }
}

jsonobject = fromJSON(jsonstring)
data = as.numeric(unlist(jsonobject['data']))
p = as.numeric(unlist(jsonobject['p']))
d = as.numeric(unlist(jsonobject['d']))
q = as.numeric(unlist(jsonobject['q']))

estimate = arima(data, order=c(p, d, q))

phi = c()
if (p>0) {
    for (i in seq(1, p)) {
        phi = c(phi, as.numeric(unlist(estimate$coef[i])))
    }
}
theta = c()
if (p+1 <= p+q) {
    for (i in seq(p+1, p+q)) {
        theta = c(theta, as.numeric(unlist(estimate$coef[i])))
    }
}
if (d==0) {
    intercept = as.numeric(unlist(estimate$coef[p+q+1]))
} else {
    intercept = 0.0
}

if (length(phi)) {
    if (length(phi)==1) {
        phi = list(phi)
    }
} else {
    phi = list()
}

if (length(theta)) {
    if (length(theta)==1) {
        theta = list(-1 * theta)
    } else {
        theta = -1 * theta
    }
} else {
    theta = list()
}

arimapredict = predict(estimate, n.ahead = 12)
prediction = as.numeric(unlist(arimapredict$pred))
predictionse = as.numeric(unlist(arimapredict$se))

response = list(phi=phi,
                theta=theta,
                intercept=intercept,
                sigma2=estimate$sigma2,
                aic=estimate$aic,
                prediction=prediction,
                predictionse=predictionse)

cat(toJSON(response))

и позвоните ему с python через интерфейс json:

Rscript arima/arimaestimate.r --jsondata '{"q": 2, "p": 2, "data": [247.0, 249.0, 213.0, 154.0, 122.0, 164.0, 141.0, 174.0, 281.0, 141.0, 159.0, 168.0, 243.0, 261.0, 211.0, 303.0, 308.0, 239.0, 237.0, 185.0], "d": 1}'

и вы получите ответ:

{
    "phi": [],
    "theta": [
        0.407851844478153
    ],
    "intercept": 0,
    "sigma2": 3068.29837379914,
    "aic": 210.650287294343,
    "prediction": [
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721,
        210.184175597721
    ]
}