2014-06-19 14 views
9

Właśnie rozpocząłem pracę nad analizą szeregów czasowych za pomocą statsmodeli. Mam zestaw danych z datami i wartościami (przez około 3 miesiące). Mam pewne problemy z zapewnieniem właściwej kolejności dla modelu ARIMA. Staram się dostosować do trendów i sezonowości, a następnie wyliczyć wartości odstające.Python Statsmodel ARIMA start [stacjonarność]

Moje "wartości" nie są stacjonarne, a statsmodel mówi, że muszę albo wywołać niestałość, albo wprowadzić pewne różnice, aby to zadziałało. Grałem z różnymi porządkami (bez głębokiego zrozumienia konsekwencji zmiany p, q i d).

Kiedy wprowadzić 1 do różnicowania, otrzymuję ten błąd:

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

Kiedy usunąć różnicowanie poprzez moje zamówienie jak (powiedzmy) = (2,0,1 kolejności), uzyskać to błąd:

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. 
>>> 

Pomocna będzie jak uzyskać ulotność (lub link do miłego samouczka). A także użyteczne byłyby testy stacjonarności (takie jak, http://www.maths.bris.ac.uk/~guy/Research/LSTS/TOS.html).

Aktualizacja: Czytam poprzez testu ADF:

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

Dzięki! PD.

Odpowiedz

1

Aby wywołać stacjonarności:

  1. de seasonalize (remove sezonowości)
  2. de trendu (remove trendu)

Istnieje kilka sposobów, aby osiągnąć stacjonarności szeregu czasowego - Box -Cox rodziny transformacji, różnicowania itp., Wybór metody zależy od danych. Poniżej przedstawiono powszechnie stosowane testy stacjonarności.

Testy stacjonarności: testowe 1. Augmented Dickey-Fullera Test 2. KPSS KPSS python code

-3

Możesz użyć skryptu R zamiast statmodeli. R ma większą moc do estymacji statystycznej.

Jeśli chcesz używać Pythona, można uruchomić R-skrypt z pytona poprzez interfejs OS:

na przykład skryptu R dla estymacji 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)) 

I nazywają go z pytona poprzez interfejs 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}' 

i masz odpowiedź:

{ 
    "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 
    ] 
} 
+4

doradzanie OP używać zupełnie inny język nie jest pomocnym rozwiązaniem. – ChrisArmstrong