構成的な時系列を予測しようとしています。つまり、3つのコンポーネントがあり、それらはすべて0と1の間にあり、合計が1になるように制約されています。
この問題は、適切な一般化されたロジスティック変換を使用することにより、標準の指数平滑法を使用して対処できます。2010年の予測に関する国際シンポジウムで、ケーラー、スナイダー、オード&ボーモントによるこれに関するプレゼンテーションがあり、それが論文になりました(Snyder et al。、2017、International Journal of Forecasting)。
データを使ってこれを見ていきましょう。データをobs
時系列の行列に読み込みます。
obs <- structure(c(0.03333333, 0.03810624, 0, 0.03776683, 0.06606607,
0.03900325, 0.03125, 0, 0.04927885, 0.0610687, 0.03846154, 0,
0.06028636, 0.09646302, 0.04444444, 0.01111111, 0.02309469, 0.03846154,
0.03119869, 0.01201201, 0.02058505, 0.015625, 0, 0.01802885,
0.02290076, 0, 0, 0.03843256, 0.05144695, 0.06666667, 0.9555556,
0.9387991, 0.9615385, 0.9310345, 0.9219219, 0.9404117, 0.953125,
1, 0.9326923, 0.9160305, 0.9615385, 1, 0.9012811, 0.85209, 0.8888889
), .Dim = c(15L, 3L), .Dimnames = list(NULL, c("Series 1", "Series 2",
"Series 3")), .Tsp = c(1, 15, 1), class = c("mts", "ts", "matrix"
))
次のように入力して、これが機能したかどうかを確認できます
obs
ϵϵ
epsilon <- 0.0001
obs[obs<epsilon] <- epsilon
これで、変更された行の合計が1になりません。これを修正できます(ただし、これにより予測が悪化する可能性があります)。
obs <- obs/matrix(rowSums(obs),nrow=nrow(obs),ncol=ncol(obs),byrow=FALSE)
次に、プレゼンテーションの35ページに従ってデータを変換します。
zz <- log(obs[,-ncol(obs)]/obs[,ncol(obs)])
colnames(zz) <- head(colnames(obs),-1)
zz
forecast
パッケージをロードし、5つの時点の範囲を設定します。
library(forecast)
horizon <- 5
次に、変換されたデータを列ごとにモデル化して予測します。ここでは、単にを呼び出していますets()
。これは、状態空間指数平滑化モデルに適合しようとします。3つの系列すべてに対して単一の指数平滑法を使用していることがわかりますが、特に15を超える期間がある場合は、傾向モデルが選択される可能性があります。または、月次データがある場合は、ts()
with を使用して、潜在的な季節性があることをRに説明しますfrequency=12
-次にets()
季節モデルを調べます。
baz <- apply(zz,2,function(xx)forecast(ets(xx),horizon=horizon)["mean"])
forecasts.transformed <- cbind(baz[[1]]$mean,baz[[2]]$mean)
次に、プレゼンテーションの38ページに従って予測を逆変換します。
forecasts <- cbind(exp(forecasts.transformed),1)/(1+rowSums(exp(forecasts.transformed)))
最後に、履歴と予測をプロットしましょう。
plot(obs[,1],ylim=c(0,1),xlim=c(1,nrow(obs)+horizon),type="n",ylab="")
for ( ii in 1:ncol(obs) ) {
lines(obs[,ii],type="o",pch=19,col=ii)
lines(forecasts[,ii],type="o",pch=21,col=ii,lty=2)
}
legend("left",inset=.01,lwd=1,col=1:ncol(obs),pch=19,legend=colnames(obs))
編集:構成時系列予測に関する論文がちょうど登場しました。読んだことはありませんが、興味があるかもしれません。