存在しないデータや欠落しているデータをどのように処理しますか?


12

予測方法を試しましたが、自分の方法が正しいかどうかを確認したいと思います。

私の研究は、さまざまな種類の投資信託を比較することです。GCCインデックスをそのうちの1つのベンチマークとして使用したいのですが、問題は2011年9月にGCCインデックスが停止し、私の研究は2003年1月から2014年7月までであるということです。線形回帰を作成しますが、問題は、MSCIインデックスに2010年9月のデータが欠落していることです。

これを回避するために、私は次のことを行いました。これらの手順は有効ですか?

  1. MSCIインデックスには2010年9月から2012年7月までのデータがありません。5つの観測値に移動平均を適用することで、「提供」しました。このアプローチは有効ですか?その場合、いくつの観測を使用する必要がありますか?

  2. 欠落データを推定した後、相互に利用可能な期間(2007年1月から2011年9月)のGCCインデックス(従属変数として)とMSCIインデックス(独立変数として)で回帰を実行し、すべての問題からモデルを修正しました。毎月、xを残りの期間のMSCIインデックスのデータで置き換えます。これは有効ですか?

以下は、行ごとに年、列ごとに月を含む、カンマ区切り値形式のデータです。データはこのリンクからも入手できます 。

シリーズGCC:

,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
2002,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,117.709
2003,120.176,117.983,120.913,134.036,145.829,143.108,149.712,156.997,162.158,158.526,166.42,180.306
2004,185.367,185.604,200.433,218.923,226.493,230.492,249.953,262.295,275.088,295.005,328.197,336.817
2005,346.721,363.919,423.232,492.508,519.074,605.804,581.975,676.021,692.077,761.837,863.65,844.865
2006,947.402,993.004,909.894,732.646,598.877,686.258,634.835,658.295,672.233,677.234,491.163,488.911
2007,440.237,486.828,456.164,452.141,495.19,473.926,492.782,525.295,519.081,575.744,599.984,668.192
2008,626.203,681.292,616.841,676.242,657.467,654.66,635.478,603.639,527.326,396.904,338.696,308.085
2009,279.706,252.054,272.082,314.367,340.354,325.99,326.46,327.053,354.192,339.035,329.668,318.267
2010,309.847,321.98,345.594,335.045,311.363,299.555,310.802,306.523,315.496,324.153,323.256,334.802
2011,331.133,311.292,323.08,327.105,320.258,312.749,305.073,297.087,298.671,NA,NA,NA

MSCIシリーズ:

,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
2007,NA,NA,NA,NA,1000,958.645,1016.085,1049.468,1033.775,1118.854,1142.347,1298.223
2008,1197.656,1282.557,1164.874,1248.42,1227.061,1221.049,1161.246,1112.582,929.379,680.086,516.511,521.127
2009,487.562,450.331,478.255,560.667,605.143,598.611,609.559,615.73,662.891,655.639,628.404,602.14
2010,601.1,622.624,661.875,644.751,588.526,587.4,615.008,606.133,NA,NA,NA,NA
2011,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA
2012,NA,NA,NA,NA,NA,NA,NA,609.51,598.428,595.622,582.905,599.447
2013,627.561,619.581,636.284,632.099,651.995,651.39,687.194,676.76,694.575,704.806,727.625,739.842
2014,759.036,787.057,817.067,824.313,857.055,805.31,873.619,NA,NA,NA,NA,NA

データ


最後の段落で言及されているxは何ですか?
Nick Cox

yはgccインデックスの終値、xはmsciインデックスの終値
TG Zain

ARIMA時系列モデルのフレームワークに適用されるカルマンフィルターを使用して時系列のギャップを埋める方法の例を示すこの投稿に興味があるかもしれません。
javlacalle 2014年

javlacalle、私の欠落しているデータで動作しますか?欠落データのファイルは4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain

ファイルをダウンロードできませんでした。データを投稿することができます。たとえば、年を行で、月を列で表示し、値をコンマで区切って表示します。
javlacalle 2014年

回答:


9

私の提案は、移動平均の代わりに時系列モデルを使用することを除いて、あなたが提案したものに似ています。ARIMAモデルのフレームワークは、リグレッサとしてのシリーズMSCIだけでなく、データのダイナミクスもキャプチャする可能性があるGCCシリーズのラグを含む予測を取得するのにも適しています。

最初に、シリーズMSCIのARIMAモデルを近似し、このシリーズで欠落している観測を内挿します。次に、MSCIを外因性リグレッサとして使用してシリーズGCCのARIMAモデルを近似し、このモデルに基づいてGCCの予測を取得できます。これを行う際には、シリーズでグラフィカルに観察され、ARIMAモデルの選択と適合を歪める可能性のある中断に注意深く対処する必要があります。


これが私がこの分析をで行うものRです。この関数を使用してforecast::auto.arima、ARIMAモデルを選択し、tsoutliers::tso可能なレベルシフト(LS)、一時的な変化(TC)または加法的外れ値(AO)を検出します。

これらは一度ロードされたデータです:

gcc <- structure(c(117.709, 120.176, 117.983, 120.913, 134.036, 145.829, 143.108, 149.712, 156.997, 162.158, 158.526, 166.42, 180.306, 185.367, 185.604, 200.433, 218.923, 226.493, 230.492, 249.953, 262.295, 275.088, 295.005, 328.197, 336.817, 346.721, 363.919, 423.232, 492.508, 519.074, 605.804, 581.975, 676.021, 692.077, 761.837, 863.65, 844.865, 947.402, 993.004, 909.894, 732.646, 598.877, 686.258, 634.835, 658.295, 672.233, 677.234, 491.163, 488.911, 440.237, 486.828, 456.164, 452.141, 495.19, 473.926, 
492.782, 525.295, 519.081, 575.744, 599.984, 668.192, 626.203, 681.292, 616.841, 676.242, 657.467, 654.66, 635.478, 603.639, 527.326, 396.904, 338.696, 308.085, 279.706, 252.054, 272.082, 314.367, 340.354, 325.99, 326.46, 327.053, 354.192, 339.035, 329.668, 318.267, 309.847, 321.98, 345.594, 335.045, 311.363, 
299.555, 310.802, 306.523, 315.496, 324.153, 323.256, 334.802, 331.133, 311.292, 323.08, 327.105, 320.258, 312.749, 305.073, 297.087, 298.671), .Tsp = c(2002.91666666667, 2011.66666666667, 12), class = "ts")
msci <- structure(c(1000, 958.645, 1016.085, 1049.468, 1033.775, 1118.854, 1142.347, 1298.223, 1197.656, 1282.557, 1164.874, 1248.42, 1227.061, 1221.049, 1161.246, 1112.582, 929.379, 680.086, 516.511, 521.127, 487.562, 450.331, 478.255, 560.667, 605.143, 598.611, 609.559, 615.73, 662.891, 655.639, 628.404, 602.14, 601.1, 622.624, 661.875, 644.751, 588.526, 587.4, 615.008, 606.133, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 609.51, 598.428, 595.622, 582.905, 599.447, 627.561, 619.581, 636.284, 632.099, 651.995, 651.39, 687.194, 676.76, 694.575, 704.806, 727.625, 739.842, 759.036, 787.057, 817.067, 824.313, 857.055, 805.31, 873.619), .Tsp = c(2007.33333333333, 2014.5, 12), class = "ts")

ステップ1:ARIMAモデルをシリーズMSCIに適合させる

グラフィックはいくつかの中断の存在を示していますが、によって異常値は検出されませんでしたtso。これは、サンプルの中央にいくつかの観測値が欠落しているためと考えられます。これは2つのステップで処理できます。最初に、ARIMAモデルを近似し、それを使用して欠落している観測値を内挿します。2番目に、可能性のあるLS、TC、AOの補間シリーズチェックのARIMAモデルを近似し、変更が見つかった場合は補間値を調整します。

シリーズMSCIのARIMAモデルを選択します。

require("forecast")
fit1 <- auto.arima(msci)
fit1
# ARIMA(1,1,2) with drift         
# Coefficients:
#           ar1     ma1     ma2    drift
#       -0.6935  1.1286  0.7906  -1.4606
# s.e.   0.1204  0.1040  0.1059   9.2071
# sigma^2 estimated as 2482:  log likelihood=-328.05
# AIC=666.11   AICc=666.86   BIC=678.38

この投稿への私の回答で説明されているアプローチに従って、欠落している観測を埋めます 。

kr <- KalmanSmooth(msci, fit1$model)
tmp <- which(fit1$model$Z == 1)
id <- ifelse (length(tmp) == 1, tmp[1], tmp[2])
id.na <- which(is.na(msci))
msci.filled <- msci
msci.filled[id.na] <- kr$smooth[id.na,id]

ARIMAモデルを塗りつぶしたシリーズに適合させmsci.filledます。現在、いくつかの異常値が見つかりました。それにもかかわらず、代替オプションを使用して、異なる外れ値が検出されました。ほとんどの場合に見つかったもの、2008年10月のレベルシフト(観察18)を保持します。たとえば、これらのオプションや他のオプションを試すことができます。

require("tsoutliers")
tso(msci.filled, remove.method = "bottom-up", tsmethod = "arima", 
  args.tsmethod = list(order = c(1,1,1)))
tso(msci.filled, remove.method = "bottom-up", args.tsmethod = list(ic = "bic"))

選択されたモデルは次のとおりです。

mo <- outliers("LS", 18)
ls <- outliers.effects(mo, length(msci))
fit2 <- auto.arima(msci, xreg = ls)
fit2
# ARIMA(2,1,0)                    
# Coefficients:
#           ar1     ar2       LS18
#       -0.1006  0.4857  -246.5287
# s.e.   0.1139  0.1093    45.3951
# sigma^2 estimated as 2127:  log likelihood=-321.78
# AIC=651.57   AICc=652.06   BIC=661.39

前のモデルを使用して、欠落している観測値の補間を調整します。

kr <- KalmanSmooth(msci, fit2$model)
tmp <- which(fit2$model$Z == 1)
id <- ifelse (length(tmp) == 1, tmp[1], tmp[2])
msci.filled2 <- msci
msci.filled2[id.na] <- kr$smooth[id.na,id]

最初と最後の補間は、プロットで比較できます(スペースを節約するためにここには表示されていません)。

plot(msci.filled, col = "gray")
lines(msci.filled2)

ステップ2:外因性のリグレッサとしてmsci.filled2を使用して、ARIMAモデルをGCCに適合させる

の初めに欠けている観測を無視しmsci.filled2ます。この時点auto.arimatso、と一緒に使用するのが難しいことがわかったので、いくつかのARIMAモデルを手動で試しtso、最終的にARIMA(1,1,0)を選択しました。

xreg <- window(cbind(gcc, msci.filled2)[,2], end = end(gcc))
fit3 <- tso(gcc, remove.method = "bottom-up", tsmethod = "arima",  
  args.tsmethod = list(order = c(1,1,0), xreg = data.frame(msci=xreg)))
fit3
# ARIMA(1,1,0)                    
# Coefficients:
#           ar1    msci     AO72
#       -0.1701  0.5131  30.2092
# s.e.   0.1377  0.0173   6.7387
# sigma^2 estimated as 71.1:  log likelihood=-180.62
# AIC=369.24   AICc=369.64   BIC=379.85
# Outliers:
#   type ind    time coefhat tstat
# 1   AO  72 2008:11   30.21 4.483

GCCのプロットは、2008年の初めにシフトを示しています。しかし、それは、説明者MSCIによってすでに捕捉されており、2008年11月の追加の外れ値を除いて、追加の説明者は含まれていなかったようです。

残差のプロットは自己相関構造を示唆していませんでしたが、プロットは2008年11月にレベルシフトを示し、2011年2月に加法的外れ値を示しました。ただし、対応する介入を追加すると、モデルの診断は悪化しました。この時点で、さらに分析が必要になる場合があります。ここでは、前回のモデルに基づいた予測を引き続き取得しfit3ます。

95%

newxreg <- data.frame(msci=window(msci.filled2, start = c(2011, 10)), AO72=rep(0, 34))
p <- predict(fit3$fit, n.ahead = 34, newxreg = newxreg)
head(p$pred)
# [1] 298.3544 298.2753 298.0958 298.0641 297.6829 297.7412
par(mar = c(3,3.5,2.5,2), las = 1)
plot(cbind(gcc, msci), xaxt = "n", xlab = "", ylab = "", plot.type = "single", type = "n")
grid()
lines(gcc, col = "blue", lwd = 2)
lines(msci, col = "green3", lwd = 2)
lines(window(msci.filled2, start = c(2010, 9), end = c(2012, 7)), col = "green", lwd = 2)
lines(p$pred, col = "red", lwd = 2)
lines(p$pred + 1.96 * p$se, col = "red", lty = 2)
lines(p$pred - 1.96 * p$se, col = "red", lty = 2)
xaxis1 <- seq(2003, 2014)
axis(side = 1, at = xaxis1, labels = xaxis1)
legend("topleft", col = c("blue", "green3", "green", "red", "red"), lwd = 2, bty = "n", lty = c(1,1,1,1,2), legend = c("GCC", "MSCI", "Interpolated values", "Forecasts", "95% confidence interval"))

結果


本当にありがとう、私は本当に私が探しているものであるあなたの助けに本当に感謝しています、私はあなたの時間を取ってすみません、、、私はプログラムRを持っていないのでeviewsのすべてのステップを実行しますそして、私はそれを使用する方法がわかりません....ありがとうございました
TG Zain

お役に立ててうれしいです。
javlacalle 2014年

私はRIがEviewsで答えを見つけることができなかったので初めてです...それで、Rを使い始めて、いくつかの質問があります。どのようにデータをインポートすればよいですか。 msci to R + kalmansmoothまたはrunが見つからないというエラーメッセージが表示されます。kalmanフィルターのパッケージを既にダウンロードしています。どうすればよいですか?..ありがとう
TG Zain

ソフトウェアの使用に関する質問は、このサイトではトピックから外れています。スタックオーバーフローは、この種の質問に適しています。それが私の答えに固有のものである場合は、私に電子メールを送信できます。
javlacalle 14

1
  1. 値がランダムに欠落している場合、代入(つまり、「移動平均によって提供される」)は有効です。かなりの長さの途切れのない期間であれば、これは起こりそうにありません。質問の2番目の部分は不明確です。
  2. 質問に応じて、データの範囲を超えて予測にモデルを使用することは、準最適から無効までのすべてと見なされます。たとえば、2つのインデックス間の関係が2012-2014で変化した場合はどうなりますか?欠落しているデータポイントに回帰推定値を使用することはできますが(別のインデックスの生の値で直接置き換えることはできません)、これは2つのインデックスの間に強い関係があり、これらの値が重要である場合にのみ意味があります見積もりとして明確にマークされています。そして、「すべての問題からモデルを修正した」とはどういう意味ですか?

2
時系列分析の大部分は、未来を予測するためのものです。一部の人にとって、それは統計の主な理由です!したがって、#2は、臆病者を時系列予報者から分離する完璧の助言者です。
Nick Cox

十分に公正、私は同意する/スタンド修正。中程度の勾配と勾配の終わりの値が欠落している予測子を選択する方が賢明かどうかはまだ疑問です。それらが関連している場合。
カチャ2014年

申し訳ありませんが、ファイルをアップロードしようとしましたが、方法と場所がわかりません:( ... +異分散性とシリアル相関からモデルを修正することを意味しました
TG Zain


1

2元気そうです。私はそれで行きます。

1.と同様に、データセットで使用可能なすべての機能(2011年9月以降はNAではない)を使用してGCCを予測するモデルをトレーニングすることをお勧めします(トレーニング中にsep2011の前にNA値を持つ行は省略します)。モデルは非常に良いはずです(K分割交差検証を使用)。次に、2011年9月以降のGCCを予測します。

または、MSCIを予測するモデルをトレーニングし、それを使用して欠落しているMSCI値を予測することもできます。MSCIを使用してGCCを予測するモデルをトレーニングし、2011年9月以降のGCCを予測します


ありがとうnar ..あなたの答えはvarモデルについて考えるように私を導きます...それはうまくいくでしょうか?
TG Zain

理論的にはVARモデルは機能するはずですが、将来ずっと遅く予測を開始すると、累積誤差が非常に高くなります。つまり、y(t)に立っていて、y(t + 10)の値が必要な場合、再帰的に10回予測する必要があります。最初にy(t + 1)を予測し、次に予測値を使用してy(t + 2)を予測します。
show_stopper 2014年

私はあなたの助けに感謝します...それであなたはvarよりも優れたtrain amodelによって提案した方法を意味します...どのようなモデルを使用する必要がありますか?
TG Zain

OK。データセットを見たので、次の手順を実行します。MSCIを使用してGCCを予測する単純なモデルを設計します。2012年8月以降のGCCを予測します。2011年10月から2012年7月までの期間、VARまたは単純なARモデルを使用してGCC値を予測します
show_stopper 2014年

1
単純なモデルとは、線形または対数線形回帰モデルです。K分割検証は簡単です。データセット全体をk分割に分割します。kは任意の数にすることができます。k-1分割を使用してモデルをトレーニングし、最後の分割でモデルをテストします。すべての唾がテストされるまで、これを繰り返します。次に、RMSE値を計算します。上記を行う理由は、選択したモデルが優れた予測力を持っていることを確認するためです
show_stopper '31
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.