Jak wykonać prognozowanie z wykryciem wartości odstających w R? - Procedura i metoda analizy szeregów czasowych

16

Mam miesięczne dane szeregów czasowych i chciałbym robić prognozy z wykrywaniem wartości odstających.

Oto przykład mojego zestawu danych:

       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

Odwołałem się do procedury analizy Timeseries i metod wykorzystujących R , aby wykonać szereg różnych modeli prognozowania, jednak nie wydaje się to dokładne. Ponadto nie jestem pewien, jak włączyć do tego tsoutliers.

Mam inne stanowisko odnośnie mojego zapytania o tsoutliers i modelowanie ARIMA i procedurę ponad tutaj również.

Więc to jest mój kod, który jest podobny do linku nr 1.

Kod:

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.

Jest to wykres moich różnych prognoz, który nie wydaje się zbyt wiarygodny / dokładny, poprzez porównanie czerwonego „zestawu testowego” i niebieskiego „prognozowanego” zestawu. Wykres innej prognozy Inna prognoza

Różna dokładność poszczególnych modeli zestawu testowego i szkoleniowego

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

Z dokładności modeli widać, że najdokładniejszym modelem byłby model theta. Nie jestem pewien, dlaczego prognoza jest bardzo niedokładna, i uważam, że jednym z powodów byłoby to, że nie potraktowałem „wartości odstających” w moim zbiorze danych, co spowodowało złą prognozę dla wszystkich modeli.

To jest moja działka odstająca

Wykres wartości odstających Wartości odstające

wyjście 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

Chciałbym wiedzieć, w jaki sposób mogę dalej „analizować” / prognozować moje dane, stosując odpowiedni zestaw danych i wykrywanie wartości odstających itp. Proszę o pomoc w traktowaniu wartości odstających, a także w prognozowaniu.

Na koniec chciałbym wiedzieć, jak połączyć różne prognozy modeli razem, ponieważ z tego, co @forecaster wspomniał w linku nr 1, połączenie różnych modeli najprawdopodobniej zapewni lepsze prognozowanie / prognozowanie.

EDYTOWANE

Chciałbym uwzględnić wartości odstające w innych modelach.

Próbowałem niektóre kody, np.

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

Wystąpiły pewne błędy i nie jestem pewien, czy poprawny kod będzie uwzględniał wartości odstające jako regresory. Ponadto, jak mam pracować z thetaf lub rwf, ponieważ nie ma prognozy. Theta ani prognozy.rwf?

Przetrząsać
źródło
1
Być może powinieneś przyjąć inne podejście do uzyskania pomocy, ponieważ ciągłe ponowne edytowanie wydaje się nie działać
IrishStat
Zgadzam się z @irishstat, obie odpowiedzi poniżej zapewniają bezpośrednią odpowiedź na twoje pytanie i wydaje się, że nie poświęcono im zbytniej uwagi.
prezenter
Spróbuj przeczytać dokumentację konkretnych funkcji, które powodują błędy, ETS i thetaf nie mają możliwości obsługi regresorów.
przepowiednia

Odpowiedzi:

7

Ta odpowiedź dotyczy także punktów 6 i 7 drugiego pytania .

Wartości odstające są rozumiane jako obserwacje, które nie są wyjaśnione przez model, więc ich rola w prognozach jest ograniczona w tym sensie, że obecność nowych wartości odstających nie będzie przewidywana. Wszystko, co musisz zrobić, to uwzględnić te wartości odstające w równaniu prognozy.

W przypadku addytywnej wartości odstającej (która wpływa na pojedynczą obserwację) zmienna zawierająca tę wartość odstającą zostanie po prostu wypełniona zerami, ponieważ wartość odstająca została wykryta w obserwacji w próbce; w przypadku zmiany poziomu (trwałej zmiany danych) zmienna zostanie wypełniona zmiennymi w celu utrzymania zmiany w prognozach.


Następnie pokazuję, jak uzyskać prognozy w R na modelu ARIMA z wartościami odstającymi wykrytymi przez „tsoutlier”. Kluczem jest prawidłowe zdefiniowanie argumentu, newxregktóry zostanie przekazany predict.

(To tylko w celu zilustrowania odpowiedzi na twoje pytanie, jak traktować wartości odstające podczas prognozowania, nie rozwiązuję problemu, czy wynikowy model lub prognozy są najlepszym rozwiązaniem).

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

prognozy

Edytować

Funkcja predict stosowane wyżej zwroty prognozy na podstawie wybranego modelu ARIMA, ARIMA (2,0,0) przechowywane w res$fiti wykrywane wartości nadmiernych res$outliers. Mamy takie równanie modelu:

yt=jot=1mωjotL.jot(b)jat(tjot)+θ(b)ϕ(b)α(b)ϵt,ϵtN.jare(0,σ2)),

L.jotjottsoutliersjat

javlacalle
źródło
więc dodałeś wartości odstające do argumentu „newxreg”. Czy to się nazywa regresor? Czy mogę poznać zastosowanie regresora? Ponadto, czy poprzez użycie regresora w funkcji „przewidywania” nadal używa ARIMA? czy to inna metoda prognozowania? Bardzo dziękuję za pomoc w korzystaniu z tsoutlierów. = D
Ted
czy możliwe jest włączenie wartości odstających jako regresora do zastosowania w prognozowaniu również w innych modelach? jak podstawowy model konstrukcyjny, Theta, losowy spacer itp.?
Ted,
@Ted Tak, prognozy oparte są na modelu ARMA. Zredagowałem swoją odpowiedź z kilkoma szczegółami na ten temat.
javlacalle,
Możesz włączyć zmienne regresora zawierające efekty, takie jak przesunięcie poziomu, wartości odstające addytywne, ... również w innych modelach, np. Chodzenie losowe, strukturalny model szeregów czasowych, ... Jeśli pytasz, jak do tego celu użyć jakiegoś oprogramowania, powinieneś prawdopodobnie zadać to w innym poście i zastanowić się, czy to pytanie lepiej pasuje do innych witryn, takich jak stackoverflow .
javlacalle,
o ok Innym pytaniem byłoby, czy wiesz, czy istnieje różnica między używaniem prognozy a prognozą ? Jeśli tak, to jaka jest różnica
Ted
2

Korzystanie z oprogramowania, które pomogłem opracować rozsądny model dla twoich 72 obserwacji, obejmowałoby transformację mocy (logi), ponieważ wariancję błędu można powiązać z oczekiwaną wartością. Jest to również dość oczywiste z oryginalnego wykresu, w którym oko może wykryć zwiększoną wariancję na wyższym poziomie. wprowadź opis zdjęcia tutajz fact.fit/forecast wprowadź opis zdjęcia tutaji wykresem końcowych wprowadź opis zdjęcia tutajreszt. Zwróć uwagę na bardziej realistyczne limity ufności, biorąc pod uwagę transformację mocy. Chociaż ta odpowiedź nie używa R, podnosi poprzeczkę co do tego, co może zawierać rozsądny model wykorzystujący R.

IrishStat
źródło