2016-12-20 2 views
1

J'ai 100 valeurs de données d'entraînement d'une série temporelle et j'utilise auto.arima pour trouver l'ordre du modèle et les coefficients de la même .un pas en avant, sur une prévision d'échantillon à partir d'une seule valeur reçue à la fois, en R

Je reçois des valeurs de streaming à partir d'un capteur, une à la fois. A la réception d'une valeur, j'ai besoin de prévoir/prédire la valeur suivante (un seul pas en avant/valeur unique seulement), à partir de l'objet-modèle obtenu à partir de auto.arima. Je mets à jour les coefficients du modèle sur certains événements, mais pour l'instant il n'est pas nécessaire de les mentionner. Les prédictions en avance sont faites jusqu'à ce que le capteur fonctionne.

Ce sont ma formation d'échantillons et des données de test: https://drive.google.com/open?id=0B3UpwQBKryLleXdtMkQyOXVDcW8

Ceci est mon code. Il existe certaines contraintes sur le modèle, qui sont définies en conséquence.

data<-read.csv('stackoverflow_data.csv',header=TRUE, sep=","); 
data1<-data[[1]]; # first 100 points of data - training data 
mdl<-auto.arima(data1,max.p=3, max.q=3,max.d=1, stepwise=FALSE, approximation = FALSE,allowdrift=TRUE, allowmean=TRUE); 
summary(mdl); 

Series: data1 
ARIMA(1,0,1) with non-zero mean 

Coefficients: 
     ar1  ma1 intercept 
     0.7456 0.2775 767.7463 
s.e. 0.0804 0.1197  0.1072 

sigma^2 estimated as 0.04944: log likelihood=9.34 
AIC=-10.69 AICc=-10.27 BIC=-0.27 

Training set error measures: 
         ME  RMSE  MAE   MPE  MAPE 
Training set -0.004354719 0.2189945 0.1706344 -0.0005753987 0.02222701 
        MASE  ACF1 
Training set 0.9063639 -0.01022176 

Pour dans l'échantillon de données, une étape d'avance des prédictions ont été produites manuellement (courbe rouge) ainsi que l'utilisation intégrée (MDL) dans (courbe verte). Ci-dessous est représenté l'intrigue combinée d'entre eux avec les données d'entraînement d'origine (tracé noir).

Ceci est le code pour la prévision manuelle en une étape.

res_1 = 0; 
res_2 = 0; 
constant_1 = mdl$coef [["intercept"]] * (1 - mdl$coef [["ar1"]]); 
fc = 0; 
for (i in 1:length(data1)){ 
    fc[i] <-constant_1 +(mdl$coef [["ar1"]]*(data1[i])) + (mdl$coef [["ma1"]]*(res_1)); # one-step ahead forecast for in-sample data 
res_2[i] = data1[i] - fc[i]; 
res_1 = data1[i] - fc[i]; 
} 

one step ahead forecast : in-sample data plot

Ce sont mes questions:

(1) En observant l'intrigue (j'ai partagé lien d'image ci-dessus, je ne peux pas poster des images en raison de score de réputation), il semble que les prévisions ajustées (mdl) sont éteintes d'une unité de temps. Comment cela peut-il être corrigé? (2) Les données de test dans la liaison partagée sont des données futures pour lesquelles une prévision en une étape doit être effectuée. Ces données viennent séquentiellement une valeur à la fois. Comment pouvons-nous prévoir une valeur unique unique à partir de la valeur unique reçue à ce moment-là, jusqu'à ce que l'algorithme conserve ses valeurs?

+0

Est-ce la bonne façon de faire un pas de prédiction avant données2 = données [[2] ] fit2 <- Arima (c (données1, données2 [1]), modèle = mdl) a = (prévision (ajustement2, h = 1) $ ajusté [101]) –

+0

ou je devrais considérer: données2 = données [[2 ]]; fit2 <- Arima (c (données1, données2 [1]), modèle = mdl) a = (prévisions (ajustement2, h = 1) $ moyenne [1]) –

Répondre

2
  1. Vous multipliez le coefficient AR (1) par l'observation actuelle plutôt que par l'observation précédente.

  2. Réajuster le modèle ARIMA aux données de test.

facilement fait en R:

library(forecast) 

data <- read.csv('stackoverflow_data.csv', header=TRUE, sep=",") 
data1 <- ts(data[[1]][1:100]) # first 100 points of data - training data 
mdl <- auto.arima(data1, max.p=3, max.q=3, max.d=1, 
     stepwise=FALSE, approximation=FALSE, allowdrift=TRUE, allowmean=TRUE) 

# One-step forecasts on training data 
plot(data1) 
lines(fitted(mdl), col='red') 

enter image description here

# One-step forecasts on test data 
data2 <- ts(data[[2]], start=length(data1)+1) 
data12 <- ts(c(data1,data2)) 
mdl2 <- Arima(data12, model=mdl) 
plot(data2) 
lines(window(fitted(mdl2), start=101), col='red') 

enter image description here

+0

Merci professeur pour la réponse rapide! Dans un scénario réel, je ne vais pas avoir de données de test sous forme de tableau, je vais avoir une valeur unique (que je considère comme une observation précédente) à la fois pour cela.Mon objectif est de prédire/prévoir la valeur suivante à partir de cette valeur unique, et de trouver la valeur résiduelle lorsque la prochaine valeur réelle apparaît. J'ai essayé for-loop pour cela mais les résultats ne sont pas comme prévu. –

+0

La sortie devrait être comme produite par ce code. https://drive.google.com/open?id=0B3UpwQBKryLlQ2FrQU9yNlF4cVE Mais il ne prévoit pas la dernière valeur. –