Anda mencoba memperkirakan serangkaian waktu komposisi . Artinya, Anda memiliki tiga komponen yang semuanya dibatasi antara 0 dan 1 dan hingga 1.
Anda dapat mengatasi masalah ini menggunakan smoothing eksponensial standar, dengan menggunakan transformasi logistik umum yang sesuai. Ada presentasi mengenai hal ini oleh Koehler, Snyder, Ord & Beaumont di Simposium Internasional 2010 tentang Peramalan , yang berubah menjadi makalah ( Snyder et al., 2017, International Journal of Forecasting ).
Mari kita mulai dengan data Anda. Baca data ke dalam matriks obs
deret waktu:
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"
))
Anda dapat memeriksa apakah ini berhasil dengan mengetik
obs
Sekarang, Anda memiliki beberapa nol di sana, yang akan menjadi masalah setelah Anda mengambil logaritma. Solusi sederhana adalah dengan mengatur segala sesuatu yang kurang dari kecil ke :ϵϵ
epsilon <- 0.0001
obs[obs<epsilon] <- epsilon
Sekarang baris yang dimodifikasi tidak menjumlahkan 1 lagi. Kita dapat memperbaikinya (meskipun saya pikir ini dapat membuat perkiraan cuaca lebih buruk):
obs <- obs/matrix(rowSums(obs),nrow=nrow(obs),ncol=ncol(obs),byrow=FALSE)
Sekarang kami mengubah data sesuai halaman 35 presentasi:
zz <- log(obs[,-ncol(obs)]/obs[,ncol(obs)])
colnames(zz) <- head(colnames(obs),-1)
zz
Muat forecast
paket dan atur horizon 5 poin waktu:
library(forecast)
horizon <- 5
Sekarang model dan prakiraan kolom data yang diubah oleh kolom. Di sini saya hanya menelepon ets()
, yang akan berusaha agar sesuai dengan model pemulusan eksponensial ruang keadaan. Ternyata itu menggunakan smoothing eksponensial tunggal untuk ketiga seri, tetapi terutama jika Anda memiliki lebih dari 15 periode waktu, itu dapat memilih model tren. Atau jika Anda memiliki data bulanan, jelaskan kepada R bahwa Anda memiliki potensi musiman, dengan menggunakan ts()
dengan frequency=12
- maka ets()
akan melihat model musiman.
baz <- apply(zz,2,function(xx)forecast(ets(xx),horizon=horizon)["mean"])
forecasts.transformed <- cbind(baz[[1]]$mean,baz[[2]]$mean)
Selanjutnya kami melakukan backform ulang ramalan sesuai halaman 38 dari presentasi:
forecasts <- cbind(exp(forecasts.transformed),1)/(1+rowSums(exp(forecasts.transformed)))
Akhirnya, mari plot sejarah dan ramalan:
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))
EDIT: makalah tentang peramalan seri waktu komposisi baru saja muncul. Saya belum membacanya, tetapi mungkin menarik.