Wie mache ich eine Prognose mit Erkennung von Ausreißern in R? - Zeitreihenanalyseverfahren und -methode

16

Ich verfüge über monatliche Zeitreihendaten und möchte Prognosen zur Erkennung von Ausreißern erstellen.

Dies ist das Beispiel meines Datensatzes:

       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

Ich habe auf Timeseries-Analyseverfahren und -methoden unter Verwendung von R Bezug genommen , um eine Reihe verschiedener Vorhersagemodelle zu erstellen, die jedoch nicht genau zu sein scheinen. Außerdem bin ich mir nicht sicher, wie ich die Lieferanten einbinden soll.

Ich habe eine andere Stelle in Bezug auf meine Anfrage von tsoutliers und ARIMA Modellierung und Verfahren über bekam hier auch.

Das ist also momentan mein Code, der dem Link Nr. 1 ähnelt.

Code:

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.

Dies ist die grafische Darstellung meiner unterschiedlichen Vorhersagen, die durch den Vergleich des roten "Testsatzes" und des blauen "Vorhersagesatzes" nicht sehr zuverlässig / genau erscheinen. Diagramm der unterschiedlichen Prognose Andere Prognose

Unterschiedliche Genauigkeit der jeweiligen Test- und Trainingsmodelle eingestellt

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

An der Modellgenauigkeit können wir erkennen, dass das genaueste Modell das Theta-Modell ist. Ich bin nicht sicher, warum die Prognose sehr ungenau ist, und ich denke, dass einer der Gründe darin besteht, dass ich die "Ausreißer" in meinem Datensatz nicht behandelt habe, was zu einer schlechten Prognose für alle Modelle geführt hat.

Das ist meine Ausreißerhandlung

Ausreißer-Plot Ausreißer

tsoutliers Ausgabe

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

Ich möchte wissen, wie ich meine Daten mit diesem relevanten Datensatz und der Erkennung von Ausreißern usw. weiter "analysieren" / prognostizieren kann. Bitte helfen Sie mir auch bei der Behandlung meiner Ausreißer, um meine Prognosen zu erstellen.

Zuletzt möchte ich wissen, wie die verschiedenen Modellvorhersagen kombiniert werden können, wie in @forecaster in Link 1 erwähnt. Die Kombination der verschiedenen Modelle wird höchstwahrscheinlich zu einer besseren Vorhersage / Vorhersage führen.

BEARBEITET

Ich möchte die Ausreißer gut in andere Modelle einbinden.

Ich habe einige Codes ausprobiert, z.

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

Es sind einige Fehler aufgetreten, und ich bin mir nicht sicher, welchen Code die Ausreißer als Regressoren verwenden sollen. Wie arbeite ich außerdem mit thetaf oder rwf, da dort keine forecast.theta oder forecast.rwf vorhanden sind?

Ted
quelle
1
Vielleicht sollten Sie einen anderen Ansatz
wählen
Ich stimme @irishstat zu. Beide Antworten geben eine direkte Antwort auf Ihre Frage und scheinen wenig Beachtung gefunden zu haben.
Prognose
Lesen Sie die Dokumentation der spezifischen Funktionen, die zu Fehlern führen. ETS und thetaf sind nicht in der Lage, mit Regressoren umzugehen.
Prognose

Antworten:

7

Diese Antwort bezieht sich auch auf die Punkte 6 und 7 Ihrer anderen Frage .

Unter Ausreißern werden Beobachtungen verstanden, die nicht durch das Modell erklärt werden, so dass ihre Rolle in den Prognosen in dem Sinne eingeschränkt ist, dass das Vorhandensein neuer Ausreißer nicht vorhergesagt wird. Alles, was Sie tun müssen, ist, diese Ausreißer in die Prognosegleichung einzubeziehen.

Bei einem additiven Ausreißer (der eine einzelne Beobachtung betrifft) wird die Variable, die diesen Ausreißer enthält, einfach mit Nullen gefüllt, da der Ausreißer für eine Beobachtung in der Stichprobe ermittelt wurde. Im Falle einer Pegelverschiebung (eine permanente Änderung der Daten) wird die Variable mit Einsen gefüllt, um die Verschiebung in den Prognosen beizubehalten.


Als nächstes zeige ich, wie man Prognosen in R für ein ARIMA-Modell mit den von 'tsoutliers' erkannten Ausreißern erhält. Der Schlüssel liegt darin, das Argument newxreg, an das übergeben wird, richtig zu definieren predict.

(Dies ist nur zur Veranschaulichung der Antwort auf Ihre Frage, wie Ausreißer bei der Prognose behandelt werden sollen. Ich gehe nicht auf das Problem ein, ob das resultierende Modell oder die Prognosen die beste Lösung sind.)

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")

Vorhersagen

Bearbeiten

Die oben verwendete Funktion predictgibt Vorhersagen basierend auf dem ausgewählten ARIMA-Modell, dem in gespeicherten ARIMA (2,0,0) res$fitund den erkannten Ausreißern zurück res$outliers. Wir haben eine Modellgleichung wie diese:

yt=j=1mωjLj(B)icht(tj)+θ(B)ϕ(B)α(B)ϵt,ϵtNichD(0,σ2),

Ljjtsoutliersicht

javlacalle
quelle
Sie haben also Ausreißer in das Argument "newxreg" eingefügt. Wird das der Regressor genannt? Kann ich die Verwendung von Regressoren kennen? Wird durch die Verwendung des Regressors in der Funktion "Vorhersagen" weiterhin ARIMA verwendet? oder ist es eine andere vorhersagemethode? Vielen Dank für Ihre Hilfe bei der Verwendung von tsoutliers. = D
Ted
Ist es möglich, Ausreißer als Regressor einzubeziehen, um sie auch in anderen Modellen zu prognostizieren? wie Basic Structural Model, Theta, Random Walk und so weiter?
Ted
@Ted Ja, die Vorhersagen basieren auf einem ARMA-Modell. Ich habe meine Antwort mit einigen Details dazu bearbeitet.
Javlacalle
Sie können Regressorvariablen, die Effekte wie Pegelverschiebungen, additive Ausreißer usw. enthalten, auch in andere Modelle einbeziehen, z sollte wohl in einem anderen post nachfragen und überlegen, ob die frage besser für andere sites wie stackoverflow geeignet ist .
Javlacalle
Oh ok. Eine andere Frage wäre, wissen Sie, ob es einen Unterschied zwischen der Verwendung von Vorhersagen und Prognosen gibt ? Wenn ja, was ist der Unterschied
Ted
2

Die Verwendung einer Software, mit deren Hilfe ich ein vernünftiges Modell für Ihre 72 Beobachtungen entwickelt habe, würde eine Leistungstransformation (Protokolle) beinhalten, da die Fehlervarianz mit dem erwarteten Wert verknüpft werden kann. Dies ist auch aus der ursprünglichen Darstellung ziemlich offensichtlich, in der das Auge eine erhöhte Varianz auf der höheren Ebene erkennen kann. Bildbeschreibung hier eingebenmit actual.fit/forecast Bildbeschreibung hier eingebenund einer grafischen Darstellung der endgültigen Bildbeschreibung hier eingebenResiduen. Beachten Sie die realistischeren Konfidenzgrenzen unter Berücksichtigung der Leistungstransformation. Obwohl diese Antwort kein R verwendet, wird die Messlatte höher gelegt, was ein vernünftiges Modell mit R beinhalten könnte.

IrishStat
quelle