Rで異常値を検出して予測を行う方法 -時系列分析の手順と方法


16

私は毎月の時系列データを持っていますが、外れ値を検出して予測を行いたいです。

これは私のデータセットのサンプルです。

       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

Rを使用した時系列分析の手順と方法を参照して、一連の異なる予測モデルを実行しましたが、正確ではないようです。さらに、tsoutliersを組み込む方法もわかりません。

私は、ここでまた、tsoutliersとarimaのモデリングと手順に関する私の質問に関する別の投稿を持っています。

したがって、これらは現在私のコードであり、リンク1に似ています。

コード:

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.

これは、さまざまな予測のプロットです。赤の「テストセット」と青の「予測」セットを比較すると、非常に信頼性が高く正確ではないようです。 さまざまな予測のプロット 異なる予報

テストおよびトレーニングセットのそれぞれのモデルの異なる精度

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

モデルの精度から、最も正確なモデルはthetaモデルであることがわかります。予測が非常に不正確である理由は定かではありませんが、その理由の1つは、データセットの「外れ値」を処理しなかったため、すべてのモデルの予測が悪くなったためだと思います。

これは私の外れ値プロットです

外れ値プロット 外れ値

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

これらの関連データセットや外れ値の検出などで、データをさらに「分析」/予測する方法を知りたいのですが、予測を行うためにも、外れ値の処理を手伝ってください。

最後に、@ forecasterがリンク1で述べたように、異なるモデルの予測を組み合わせる方法を知りたいと思います。異なるモデルを組み合わせると、より良い予測/予測になります。

編集済み

外れ値を他のモデルにも取り入れたいと思います。

たとえば、いくつかのコードを試しました。

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

いくつかのエラーが生成されますが、外れ値を回帰変数として組み込むための正しいコードについては確信がありません。さらに、predict.thetaまたはpredict.rwfがないため、どのようにthetafまたはrwfを使用しますか?


1
おそらく、継続的な再編集が機能しないように思われるので、ヘルプを取得するために別のアプローチを取る必要があります
-IrishStat

私は@irishstatに同意します。以下の両方の回答はあなたの質問に対する直接的な回答を提供し、ほとんど注目されていないようです。
予報官

エラーが発生している特定の関数のドキュメントを読んでみてください。ETSとthetafにはリグレッサを処理する機能がありません。
予報官

回答:


7

この答えは、あなたの他の質問のポイント6と7にも関連しています。

外れ値はモデルによって説明されない観測値として理解されるため、予測におけるそれらの役割は、新しい外れ値の存在が予測されないという意味で制限されます。必要なのは、これらの外れ値を予測式に含めることだけです。

加算的な外れ値(単一の観測値に影響する)の場合、この外れ値を含む変数は、サンプル内の観測値で外れ値が検出されたため、単にゼロで埋められます。レベルシフト(データの永続的な変更)の場合、予測のシフトを維持するために変数が1で埋められます。


次に、 'tsoutliers'によって検出された外れ値を持つARIMAモデルでRの予測を取得する方法を示します。キーは、にnewxreg渡される引数を適切に定義することですpredict

(これは、予測時に異常値を処理する方法に関する質問への答えを示すためだけであり、結果のモデルまたは予測が最適なソリューションであるかどうかの問題には対処しません。)

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

予報

編集

predict上記で使用された関数は、選択されたARIMAモデルARIMA(2,0,0)に基づいて予測を返しres$fit、検出された外れ値を返しますres$outliers。次のようなモデル方程式があります。

yt=j=1mωjLjBttj+θBϕBαBϵtϵtND0σ2

Ljjtsoutlierst


そのため、引数「newxreg」に外れ値を追加しました。これはリグレッサーと呼ばれますか?リグレッサーの使用を知ることができますか?さらに、「予測」機能でリグレッサーを使用することで、ARIMAを使用しますか?それとも異なる予測方法ですか?tsoutliersの使用にご協力いただきありがとうございます。= D
テッド

他のモデルの予測で使用される回帰変数として外れ値を組み込むことは可能ですか?基本構造モデル、シータ、ランダムウォークなどのような?
テッド

@Tedはい、予測はARMAモデルに基づいています。これについていくつかの詳細を付けて回答を編集しました。
javlacalle

レベルシフト、相加的外れ値などの効果を含むリグレッサー変数を、他のモデル(ランダムウォーク、構造的時系列モデルなど)に組み込むことができます。おそらく別の投稿でそれを尋ねて、質問がstackoverflowのような他のサイトに適しているかどうかを検討する必要があります。
javlacalle

わかった 別の質問は、予測予測の使用に違いがあるかどうか知っていますか?ある場合、違いは何
テッド

2

エラー分散が期待値にリンク可能であるため、72個の観測値の合理的なモデルの開発を支援したソフトウェアを使用すると、べき乗変換(ログ)が含まれます。これは、目がより高いレベルで増加した分散を検出できる元のプロットからも明らかです。ここに画像の説明を入力してくださいactual.fit/forecast ここに画像の説明を入力してくださいと最終ここに画像の説明を入力してください残差のプロットを使用します。パワー変換を考慮したより現実的な信頼限界に注意してください。この応答はRを使用していませんが、Rを使用する合理的なモデルに含まれるものについては水準を引き上げています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.