Come fare previsioni con rilevamento di valori anomali in R? - Procedura e metodo di analisi delle serie storiche


16

Ho dati mensili sulle serie temporali e vorrei fare previsioni con il rilevamento di valori anomali.

Questo è l'esempio del mio set di dati:

       Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
2006  7.55  7.63  7.62  7.50  7.47  7.53  7.55  7.47  7.65  7.72  7.78  7.81
2007  7.71  7.67  7.85  7.82  7.91  7.91  8.00  7.82  7.90  7.93  7.99  7.93
2008  8.46  8.48  9.03  9.43 11.58 12.19 12.23 11.98 12.26 12.31 12.13 11.99
2009 11.51 11.75 11.87 11.91 11.87 11.69 11.66 11.23 11.37 11.71 11.88 11.93
2010 11.99 11.84 12.33 12.55 12.58 12.67 12.57 12.35 12.30 12.67 12.71 12.63
2011 12.60 12.41 12.68 12.48 12.50 12.30 12.39 12.16 12.38 12.36 12.52 12.63

Ho fatto riferimento alla procedura e ai metodi di analisi di Timeseries usando R , per fare una serie di diversi modelli di previsione, tuttavia non sembra essere accurato. Inoltre, non sono sicuro di come incorporare anche i tsoutlier.

Ho anche un altro post sulla mia richiesta di tsoutliers e modellazione e procedura arima anche qui .

Quindi questi sono il mio codice attualmente, che è simile al link n. 1.

Codice:

product<-ts(product, start=c(1993,1),frequency=12)

#Modelling product Retail Price

#Training set
product.mod<-window(product,end=c(2012,12))
#Test set
product.test<-window(product,start=c(2013,1))
#Range of time of test set
period<-(end(product.test)[1]-start(product.test)[1])*12 + #No of month * no. of yr
(end(product.test)[2]-start(product.test)[2]+1) #No of months
#Model using different method
#arima, expo smooth, theta, random walk, structural time series
models<-list(
#arima
product.arima<-forecast(auto.arima(product.mod),h=period),
#exp smoothing
product.ets<-forecast(ets(product.mod),h=period),
#theta
product.tht<-thetaf(product.mod,h=period),
#random walk
product.rwf<-rwf(product.mod,h=period),
#Structts
product.struc<-forecast(StructTS(product.mod),h=period)
)

##Compare the training set forecast with test set
par(mfrow=c(2, 3))
for (f in models){
    plot(f)
    lines(product.test,col='red')
}

##To see its accuracy on its Test set, 
#as training set would be "accurate" in the first place
acc.test<-lapply(models, function(f){
    accuracy(f, product.test)[2,]
})
acc.test <- Reduce(rbind, acc.test)
row.names(acc.test)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.test <- acc.test[order(acc.test[,'MASE']),]

##Look at training set to see if there are overfitting of the forecasting
##on training set
acc.train<-lapply(models, function(f){
    accuracy(f, product.test)[1,]
})
acc.train <- Reduce(rbind, acc.train)
row.names(acc.train)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.train <- acc.train[order(acc.train[,'MASE']),]

 ##Note that we look at MAE, MAPE or MASE value. The lower the better the fit.

Questa è la trama delle mie diverse previsioni, che non sembrano molto affidabili / accurate, attraverso il confronto tra il "set di test" rosso e il set "previsto" blu. Trama di previsioni diverse Previsioni diverse

Precisione diversa dei rispettivi modelli di test e set di addestramento

Test set
                    ME      RMSE       MAE        MPE     MAPE      MASE      ACF1 Theil's U
theta      -0.07408833 0.2277015 0.1881167 -0.6037191 1.460549 0.2944165 0.1956893 0.8322151
expsmooth  -0.12237967 0.2681452 0.2268248 -0.9823104 1.765287 0.3549976 0.3432275 0.9847223
randomwalk  0.11965517 0.2916008 0.2362069  0.8823040 1.807434 0.3696813 0.4529428 1.0626775
arima      -0.32556886 0.3943527 0.3255689 -2.5326397 2.532640 0.5095394 0.2076844 1.4452932
struc      -0.39735804 0.4573140 0.3973580 -3.0794740 3.079474 0.6218948 0.3841505 1.6767075

Training set
                     ME      RMSE       MAE         MPE     MAPE      MASE    ACF1 Theil's U
theta      2.934494e-02 0.2101747 0.1046614  0.30793753 1.143115 0.1638029  0.2191889194        NA
randomwalk 2.953975e-02 0.2106058 0.1050209  0.31049479 1.146559 0.1643655  0.2190857676        NA
expsmooth  1.277048e-02 0.2037005 0.1078265  0.14375355 1.176651 0.1687565 -0.0007393747        NA
arima      4.001011e-05 0.2006623 0.1079862 -0.03405395 1.192417 0.1690063 -0.0091275716        NA
struc      5.011615e-03 1.0068396 0.5520857  0.18206018 5.989414 0.8640550  0.1499843508        NA

Dall'accuratezza dei modelli, possiamo vedere che il modello più accurato sarebbe il modello theta. Non sono sicuro del motivo per cui la previsione è molto imprecisa e penso che uno dei motivi sarebbe che non ho trattato gli "outlier" nel mio set di dati, risultando in una cattiva previsione per tutti i modelli.

Questa è la mia trama anomala

Grafico dei valori anomali Valori anomali

uscita tsoutliers

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

Coefficients:
        sma1    LS46    LS51    LS61    TC133   LS181   AO183   AO184   LS185   TC186    TC193    TC200
      0.1700  0.4316  0.6166  0.5793  -0.5127  0.5422  0.5138  0.9264  3.0762  0.5688  -0.4775  -0.4386
s.e.  0.0768  0.1109  0.1105  0.1106   0.1021  0.1120  0.1119  0.1567  0.1918  0.1037   0.1033   0.1040
       LS207    AO237    TC248    AO260    AO266
      0.4228  -0.3815  -0.4082  -0.4830  -0.5183
s.e.  0.1129   0.0782   0.1030   0.0801   0.0805

sigma^2 estimated as 0.01258:  log likelihood=205.91
AIC=-375.83   AICc=-373.08   BIC=-311.19

 Outliers:
    type ind    time coefhat  tstat
1    LS  46 1996:10  0.4316  3.891
2    LS  51 1997:03  0.6166  5.579
3    LS  61 1998:01  0.5793  5.236
4    TC 133 2004:01 -0.5127 -5.019
5    LS 181 2008:01  0.5422  4.841 
6    AO 183 2008:03  0.5138  4.592
7    AO 184 2008:04  0.9264  5.911
8    LS 185 2008:05  3.0762 16.038
9    TC 186 2008:06  0.5688  5.483
10   TC 193 2009:01 -0.4775 -4.624
11   TC 200 2009:08 -0.4386 -4.217
12   LS 207 2010:03  0.4228  3.746
13   AO 237 2012:09 -0.3815 -4.877
14   TC 248 2013:08 -0.4082 -3.965
15   AO 260 2014:08 -0.4830 -6.027
16   AO 266 2015:02 -0.5183 -6.442

Vorrei sapere come posso "analizzare" / prevedere ulteriormente i miei dati, con questi set di dati pertinenti e il rilevamento di valori anomali, ecc. Aiutatemi nel trattamento dei miei valori anomali e anche a fare le mie previsioni.

Infine, vorrei sapere come combinare insieme le diverse previsioni del modello, come da quello che @forecaster aveva menzionato nel collegamento n. 1, combinando il diverso modello si otterrà molto probabilmente una migliore previsione / previsione.

MODIFICATO

Vorrei incorporare i valori anomali in altri modelli stanno bene.

Ho provato alcuni codici, ad es.

forecast.ets( res$fit ,h=period,xreg=newxreg)
Error in if (object$components[1] == "A" & is.element(object$components[2], : argument is of length zero

forecast.StructTS(res$fit,h=period,xreg=newxreg)
Error in predict.Arima(object, n.ahead = h) : 'xreg' and 'newxreg' have different numbers of columns

Ci sono alcuni errori prodotti e non sono sicuro del codice corretto per incorporare gli outlier come regressori. Inoltre, come posso lavorare con thetaf o rwf, poiché non ci sono forecast.theta o forecast.rwf?


1
Forse dovresti adottare un altro approccio per ottenere aiuto poiché il re-editing continuo non sembra funzionare
IrishStat

Sono d'accordo con @irishstat, entrambe le risposte che seguono forniscono una risposta diretta alla tua domanda e sembrano aver ricevuto poca attenzione.
previsioni

Prova a leggere la documentazione delle funzioni specifiche che ti danno errori, ETS e thetaf non hanno la capacità di gestire i regressori.
meteorologo,

Risposte:


7

Questa risposta è anche correlata ai punti 6 e 7 dell'altra domanda .

I valori erratici sono intesi come osservazioni che non sono spiegate dal modello, quindi il loro ruolo nelle previsioni è limitato nel senso che la presenza di nuovi valori erratici non sarà prevista. Tutto quello che devi fare è includere questi valori anomali nell'equazione di previsione.

Nel caso di un valore anomalo additivo (che interessa una singola osservazione), la variabile contenente questo valore erratico sarà semplicemente riempita di zeri, poiché il valore erratico è stato rilevato per un'osservazione nel campione; nel caso di uno spostamento di livello (un cambiamento permanente nei dati), la variabile verrà riempita con quelle al fine di mantenere lo spostamento nelle previsioni.


Successivamente, mostrerò come ottenere previsioni in R su un modello ARIMA con gli outlier rilevati da 'tsoutliers'. La chiave è definire correttamente l'argomento newxregche viene passato predict.

(Questo è solo per illustrare la risposta alla tua domanda su come trattare i valori anomali durante la previsione, non affronro il problema se il modello risultante o le previsioni sono la soluzione migliore.)

require(tsoutliers)
x <- c(
  7.55,  7.63,  7.62,  7.50,  7.47,  7.53,  7.55,  7.47,  7.65,  7.72,  7.78,  7.81,
  7.71,  7.67,  7.85,  7.82,  7.91,  7.91,  8.00,  7.82,  7.90,  7.93,  7.99,  7.93,
  8.46,  8.48,  9.03,  9.43, 11.58, 12.19, 12.23, 11.98, 12.26, 12.31, 12.13, 11.99,
 11.51, 11.75, 11.87, 11.91, 11.87, 11.69, 11.66, 11.23, 11.37, 11.71, 11.88, 11.93,
 11.99, 11.84, 12.33, 12.55, 12.58, 12.67, 12.57, 12.35, 12.30, 12.67, 12.71, 12.63,
 12.60, 12.41, 12.68, 12.48, 12.50, 12.30, 12.39, 12.16, 12.38, 12.36, 12.52, 12.63)
x <- ts(x, frequency=12, start=c(2006,1))
res <- tso(x, types=c("AO","LS","TC"))

# define the variables containing the outliers for
# the observations outside the sample
npred <- 12 # number of periods ahead to forecast 
newxreg <- outliers.effects(res$outliers, length(x) + npred)
newxreg <- ts(newxreg[-seq_along(x),], start = c(2012, 1))

# obtain the forecasts
p <- predict(res$fit, n.ahead=npred, newxreg=newxreg)

# display forecasts
plot(cbind(x, p$pred), plot.type = "single", ylab = "", type = "n", ylim=c(7,13))
lines(x)
lines(p$pred, type = "l", col = "blue")
lines(p$pred + 1.96 * p$se, type = "l", col = "red", lty = 2)  
lines(p$pred - 1.96 * p$se, type = "l", col = "red", lty = 2)  
legend("topleft", legend = c("observed data", 
  "forecasts", "95% confidence bands"), lty = c(1,1,2,2), 
  col = c("black", "blue", "red", "red"), bty = "n")

previsioni

modificare

La funzione predictsopra utilizzata restituisce previsioni basate sul modello ARIMA scelto, ARIMA (2,0,0) memorizzatores$fit e rilevati valori anomali, res$outliers. Abbiamo un'equazione modello come questa:

yt=Σj=1mωjLj(B)iot(tj)+θ(B)φ(B)α(B)εt,εt~NioD(0,σ2),

Ljjtsoutliersiot


quindi quello che hai fatto è stato aggiungere valori anomali nell'argomento "newxreg". Questo si chiama regressore? Posso sapere l'uso del regressore? Inoltre, tramite l'uso del regressore nella funzione "predict", utilizza ancora ARIMA? o è un metodo di previsione diverso? Grazie mille per il vostro aiuto nell'uso dei silenziatori. = D
Ted

è possibile incorporare valori anomali come regressore da utilizzare nella previsione anche in altri modelli? come modello strutturale di base, theta, camminata casuale ed ecc?
Ted,

@ Sì Sì, le previsioni si basano su un modello ARMA. Ho modificato la mia risposta con alcuni dettagli al riguardo.
javlacalle,

Puoi incorporare variabili regressori contenenti effetti come spostamenti di livello, valori anomali additivi, ... anche in altri modelli, ad es. Camminata casuale, modello di serie temporali strutturali, ... dovresti probabilmente chiederlo in un altro post e valutare se la domanda è più adatta ad altri siti come StackOverflow .
javlacalle,

Oh va bene. Un'altra domanda sarebbe: sai se esiste una differenza tra l'utilizzo di previsione e previsione ? Se c'è, quali sono le differenze
Ted

2

L'uso di un software che ho aiutato a sviluppare un modello ragionevole per le tue 72 osservazioni includerebbe una trasformazione di potenza (registri) in quanto la varianza dell'errore è collegabile al valore atteso. Questo è anche abbastanza evidente dalla trama originale in cui l'occhio può rilevare una maggiore varianza al livello più alto. inserisci qui la descrizione dell'immaginecon actual.fit/forecast inserisci qui la descrizione dell'immaginee una trama dei inserisci qui la descrizione dell'immagineresidui finali . Nota i limiti di confidenza più realistici tenendo conto della trasformazione di potenza. Sebbene questa risposta non utilizzi R, alza il livello di ciò che potrebbe includere un modello ragionevole che utilizza R.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.