Masalah dengan prediksi deret waktu

8

Saya mendapat pertanyaan tentang pemodelan seri waktu dalam R. data saya terdiri dari matriks berikut:

1   0.03333333 0.01111111 0.9555556
2   0.03810624 0.02309469 0.9387991
3   0.00000000 0.03846154 0.9615385
4   0.03776683 0.03119869 0.9310345
5   0.06606607 0.01201201 0.9219219
6   0.03900325 0.02058505 0.9404117
7   0.03125000 0.01562500 0.9531250
8   0.00000000 0.00000000 1.0000000
9   0.04927885 0.01802885 0.9326923
10  0.06106870 0.02290076 0.9160305
11  0.03846154 0.00000000 0.9615385
12  0.00000000 0.00000000 1.0000000
13  0.06028636 0.03843256 0.9012811
14  0.09646302 0.05144695 0.8520900
15  0.04444444 0.06666667 0.8888889

matriks ini memiliki total 200 baris.

seperti yang Anda lihat dalam setiap situasi jumlah dari setiap baris adalah 1, itu menjadi karena nilainya adalah persentase dari keseluruhan. misalnya baris 1 berisi 3,33% dari variabel a, 1,11% dari variabel 2 dan 95,5% dapat diverifikasi 3. kolom pertama menunjukkan tahun ketika nilai-nilai diukur.

target saya adalah membuat prediksi untuk 5 tahun ke depan, jadi dari tahun 200 hingga 205.

Saya dapat melakukannya dengan membuat tiga perkiraan deret waktu normal. Tetapi untuk ramalan itu jumlah totalnya tidak pernah sama dengan 1, yang sangat penting. Normaly menggunakan teknik seperti arima dan smoothing eksponensial.

Apakah ada yang tahu metode untuk membuat perkiraan untuk masalah seperti itu?

karmabob
sumber
Apakah Anda tahu apakah ini proporsi tersendiri (mis., Jumlah unit dalam kategori A, B, & C, diberi jumlah total unit) atau proporsi berkelanjutan? Jika mereka terpisah, apakah Anda tahu jumlah unit pada setiap titik waktu?
gung - Reinstate Monica
Ya nilai-nilai ini berasal dari unit diskrit, saya menghitung rasio ini dengan menggunakan angka total.
karmabob

Jawaban:

8

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 obsderet 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 forecastpaket 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))

perkiraan komposisi

EDIT: makalah tentang peramalan seri waktu komposisi baru saja muncul. Saya belum membacanya, tetapi mungkin menarik.

Stephan Kolassa
sumber
Terima kasih @stephan Kolassa, itulah yang saya maksud. Apakah ada yang tahu apakah ada toolpack di R untuk membuat perkiraan dengan deret waktu komposisi.
karmabob
Saya rasa tidak, dan penulis ini tidak termasuk di antara orang-orang "selalu menulis paket R pendamping untuk publikasi apa pun". Tetapi pendekatan mereka cukup sederhana dan seharusnya tidak memerlukan lebih dari lima baris untuk preprocess seri waktu Anda, setelah itu Anda dapat menggunakan alat standar (misalnya, ets()dalam forecastpaket untuk smoothing eksponensial ruang ruang negara).
Stephan Kolassa
Pengetahuan matematis saya tidak begitu bagus. dapatkah Anda membantu proses pra pengolahan data? ketika data dalam format yang tepat saya dapat melakukan proses peramalan.
karmabob
Saya berkeliaran jika Anda telah menemukan waktu untuk membantu saya dengan masalah yang saya miliki dengan seri waktu komposisi?
karmabob
Ini dia Maaf butuh beberapa saat; Saya benar-benar terjebak memahami presentasi dan harus menjernihkan pikiran saya.
Stephan Kolassa