R'de aykırı değerlerin tespiti ile tahmin nasıl yapılır? - Zaman serisi analiz prosedürü ve Metodu


16

Aylık zaman serisi verilerim var ve aykırı değerlerin tespiti ile tahmin yapmak istiyorum.

Bu benim veri setimin bir örneğidir:

       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

Bahsetmiştim TimeSeries analiz prosedürü ve R kullanarak yöntemlerle ancak doğru gibi görünüyor değil, tahmin değişik modelde bir dizi yapmak. Ayrıca, tsoutliers'ı da nasıl ekleyeceğimi bilmiyorum.

Benim tsoutliers ve arima modelleme ve prosedür hakkında soruşturma başka bir yazı var Burada da .

Bunlar şu anda benim kod, bağlantı no.1 benzer.

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.

Bu, kırmızı "test seti" ve mavi "tahmin edilen" set karşılaştırması yoluyla çok güvenilir / doğru görünmeyen farklı tahminlerimin çizimidir. Farklı tahmin grafiği Farklı tahmin

İlgili test ve eğitim seti modellerinin farklı doğruluğu

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

Modellerin doğruluğundan, en doğru modelin teta modeli olacağını görebiliriz. Tahmin neden çok yanlış olduğundan emin değilim ve bunun nedenlerinden birinin veri setimdeki "aykırı değerlere" bakmadığım ve tüm model için kötü bir tahminle sonuçlanmadığımı düşünüyorum.

Bu benim aykırı planım

Aykırı Grafik Aykırı

tsoutliers çıkışı

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

Bu ilgili veri seti ve aykırı değerlerin tespiti vb. İle verilerimi nasıl "analiz edebileceğimi" / tahmin edebileceğimi bilmek istiyorum.

Son olarak, 1 numaralı bağlantıda @forecaster'ın belirttiği gibi, farklı model tahmininin birlikte nasıl birleştirileceğini bilmek istiyorum, farklı modeli birleştirmek büyük olasılıkla daha iyi bir tahmin / tahminle sonuçlanacaktır.

REDAKTE

Aykırı değerleri diğer modellere dahil etmek istiyorum.

Bazı kodları denedim, örneğin.

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

Üretilen bazı hatalar var ve aykırı değerleri regresör olarak dahil etmek için doğru koddan emin değilim. Ayrıca, tahmin.theta veya tahmin.rwf olmadığından tetaf veya rwf ile nasıl çalışabilirim?


1
Sürekli yeniden düzenleme işe yaramadığı için belki de yardım almak için başka bir yaklaşım benimsemelisiniz
IrishStat

@İrishstat ile hemfikirim, aşağıdaki her iki cevap da sorunuza doğrudan cevap veriyor ve çok az ilgi gördü.
tahminci

Size hata veren belirli işlevlerin belgelerini okumayı deneyin, ETS ve tetaf regresörleri işleme yeteneğine sahip değildir.
tahminci

Yanıtlar:


7

Bu cevap aynı zamanda diğer sorunuzun 6. ve 7. maddelerine de ilişkindir .

Aykırı değerler model tarafından açıklanmayan gözlemler olarak anlaşılmaktadır, bu nedenle tahminlerdeki rolleri, yeni aykırı değerlerin varlığının tahmin edilmeyeceği anlamıyla sınırlıdır. Tek yapmanız gereken bu aykırı değerleri tahmin denklemine dahil etmektir.

Bir ilave aykırı değer olması durumunda (tek bir gözlemi etkiler), aykırı değer örnekte bir gözlem için tespit edildiğinden, bu aykırı değeri içeren değişken basitçe sıfırlarla doldurulur; Seviye kayması durumunda (verilerde kalıcı bir değişiklik), değişken, tahminlerde kaymayı korumak için değişkenlerle doldurulur.


Sonra, 'tsoutliers' tarafından tespit edilen aykırı değerlerle ARIMA modeli üzerinde R'de tahminlerin nasıl elde edileceğini göstereceğim. Anahtar newxreg, aktarılan argümanı doğru bir şekilde tanımlamaktır .predict .

(Bu yalnızca öngörme sırasında aykırı değerlerin nasıl ele alınacağı ile ilgili sorunuzun yanıtını göstermek içindir, ortaya çıkan model veya tahminlerin en iyi çözüm olup olmadığı sorununu ele almıyorum.)

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

tahminleri

Düzenle

predictYukarıda kullanılan fonksiyon seçilen ARIMA modeli, depolanan ARIMA (2,0,0) res$fitve tespit edilen aykırı değerlere dayalı tahminleri döndürür res$outliers. Bunun gibi bir model denklemimiz var:

yt=Σj=1mωjLj(B)bent(tj)+θ(B)φ(B)α(B)εt,εt~N-benD(0,σ2),

Ljjtsoutliersbent


yani yaptığınız şey "newxreg" argümanına aykırı değerler eklemekti. Buna regresör deniyor mu? Regresör kullanımını bilebilir miyim? Ek olarak, "tahmin" fonksiyonunda regresör kullanımı ile hala ARIMA kullanıyor mu? ya da farklı tahmin yöntemi? Tsoutliers kullanımında yardımlarınız için çok teşekkürler. = D
Ted

aykırı değerlerin diğer modellerde öngörmede kullanılacak regresör olarak dahil edilmesi mümkün müdür? gibi Temel Yapısal Model, Teta, Rastgele Yürüyüş ve vb?
Ted

@Ted Evet, tahminler bir ARMA modeline dayanmaktadır. Cevabımı bununla ilgili bazı ayrıntılarla düzenledim.
javlacalle

Seviye kaymaları, toplamsal aykırtıcılar, ... gibi efektler içeren regresör değişkenlerini diğer modellere de ekleyebilirsiniz, örneğin, rastgele yürüyüş, yapısal zaman serisi modeli, ... Bunu yapmak için bazı yazılımları nasıl kullanacağınızı soruyorsanız, muhtemelen başka bir gönderide sormalı ve sorunun stackoverflow gibi diğer siteler için daha uygun olup olmadığını düşünmelidir .
javlacalle

Ah tamam. Başka soru, kullandığınız arasında bir fark olup olmadığını bilmek yapacağını öngörmek ve tahmini ? Varsa, fark nedir
Ted

2

72 gözleminiz için makul bir model geliştirmeye yardımcı olduğum bir yazılım parçası kullanmak, hata sapması beklenen değere bağlanabilir olduğundan bir güç dönüşümü (günlükler) içerir. Bu, gözün daha yüksek seviyede varyansın tespit edilebildiği orijinal çizimden de oldukça açıktır. resim açıklamasını buraya girinfiili.fit/forecast resim açıklamasını buraya girinve nihai resim açıklamasını buraya girinartıkların bir arsa ile . Güç dönüşümünü dikkate alarak daha gerçekçi güven sınırlarına dikkat edin. Bu yanıt R kullanmasa da, R'yi kullanan makul bir modelin neler içerebileceği konusunda çıtayı yükseltiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.