Menggabungkan dua seri waktu dengan rata-rata titik data

10

Saya ingin menggabungkan perkiraan dan backcasted (yaitu nilai-nilai masa lalu yang diprediksi) dari data time-series yang ditetapkan ke dalam satu time-series dengan meminimalkan Mean Squared Prediction Error.

Katakanlah saya memiliki deret waktu dari 2001-2010 dengan celah untuk tahun 2007. Saya telah dapat meramalkan 2007 menggunakan data 2001-2007 (garis merah - menyebutnya ) dan melakukan backcast menggunakan data 2008-2009 (biru muda) line - sebut saja ).Y bYfYb

Saya ingin menggabungkan titik data dan menjadi titik data Y_i yang diperhitungkan untuk setiap bulan. Idealnya saya ingin mendapatkan bobot sedemikian rupa sehingga meminimalkan Kesalahan Prediksi Kuadrat Rata-Rata (MSPE) dari . Jika ini tidak memungkinkan, bagaimana saya bisa menemukan rata-rata antara dua titik data seri waktu?Y b w Y iYfYbwYi

Yi=wYf+(1w)Yb

Sebagai contoh cepat:

tt_f <- ts(1:12, start = 2007, freq = 12)
tt_b <- ts(10:21, start=2007, freq=12)

tt_f
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007   1   2   3   4   5   6   7   8   9  10  11  12
tt_b
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007  10  11  12  13  14  15  16  17  18  19  20  21

Saya ingin mendapatkan (hanya menunjukkan rata-rata ... Idealnya meminimalkan MSPE)

tt_i
     Jan Feb Mar Apr May Jun  Jul  Aug  Sep  Oct  Nov  Dec
2007 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5 13.5 14.5 15.5 16.5

masukkan deskripsi gambar di sini

OSlOlSO
sumber
Apa model peramalan (arima, ets, beberapa lainnya)? (+1) untuk saran pendekatan, saya pernah berpikir seperti itu, tetapi tetap dalam Ekspektasi-Maksimal setelah interpolasi. Pada prinsipnya periode pembelajaran bisa menjadi masalah, untuk memberikan bobot yang lebih tinggi untuk model berdasarkan info yang lebih besar (perkiraan merah dalam gambar). Beberapa kriteria keakuratan juga dapat berpotensi bermanfaat untuk membuat bobot, agar tidak begitu terkait secara pasti dengan panjang deret waktu.
Dmitrij Celov
Maaf tentang meninggalkan model peramalan. Yang di atas hanya menggunakan predictfungsi paket perkiraan. Namun, saya pikir saya akan menggunakan model peramalan HoltWinters untuk memprediksi dan membatalkan. Saya memiliki deret waktu dengan jumlah <50, dan mencoba perkiraan regresi Poisson - tetapi untuk beberapa alasan prediksi sangat lemah.
OSlOlSO
Data untuk penghitungan tampaknya memiliki terobosan tepat di tempat yang Anda tunjukkan, prakiraan dan back-cast juga menggambarkan hal yang sama. Di Poisson, Anda membuat regresi pada tren waktu ? tlog(counts)t
Dmitrij Celov
Apakah Anda baru saja menghitung atau beberapa deret waktu terkait tanpa NAnilai? Tampaknya membuat periode pembelajaran MSPE bisa menyesatkan karena sub-periode 'dijelaskan dengan baik oleh kecenderungan linier, tetapi pada periode yang terlewatkan, penurunan di suatu tempat terjadi, dan itu sebenarnya bisa berupa titik apa pun. Perhatikan juga bahwa karena prakiraannya adalah tren linier, rata-rata mereka akan memperkenalkan dua jeda struktural bukannya satu.
Dmitrij Celov
Maaf karena baru kembali sekarang @ Dmitij. Apa 'istirahat' yang kamu bicarakan ini? Saya memang melakukan log (hitungan) untuk regresi GLM. Dan ada himpunan bagian dari data jumlah yang memiliki jumlah kurang dari <6 yang akan memaksa saya untuk menggunakannya. Saya hanya punya hitungan. Jika Anda melihat pertanyaan ini , Anda akan mendapatkan gambaran tentang data yang saya miliki. Hitungan di atas hanya untuk AgeGroup '15up'. Jika ini masuk akal?
OSlOlSO

Jawaban:

0

Dengan asumsi Anda memiliki Kesalahan Prediksi Kuadrat untuk perkiraan dan backcast secara individual, saya akan merekomendasikan ini: Biarkan w menjadi vektor dengan panjang 12, biarkan m menjadi bulan yang Anda minati.

w=rep(NA,12);
for(w in 1:12){
w[m]=SPE_Backcast[m]/(SPE_Backcast[m]+SPE_Forecast[m]);
}

Sekarang w adalah bobot untuk ramalan dan 1-w adalah bobot untuk backcast.

Dennis Jaheruddin
sumber
Hal ini tampaknya hanya memberi bobot nilai terendah lebih tinggi (ke titik di mana angka negatif dapat berakhir dengan bobot> 1). Apa gunanya? Juga, jalur duas/w/m/
naught101
Bagaimana Anda mendapatkan kesalahan prediksi kuadrat negatif?
Owe Jessen
3

t

Y^t:=E(Yt|Y1:r,Ys:n)
Yu:v:=[Yu,Yu+1,,Yv]uvr+1s1ntY^t|1:r,s:n

Y^tt

Ketika model deret waktu dapat dimasukkan ke dalam bentuk State Space (SS), smoothing FI adalah operasi standar berdasarkan penyaringan Kalman dan dapat dilakukan misalnya menggunakan fungsi R yang tersedia. Anda hanya perlu menentukan bahwa nilai-nilai di celah tersebut hilang. Algoritma smoothing memperkirakan status tersembunyi yang berisi semua informasi yang relevan tentang untuk di celah. Model ARIMA dapat dimasukkan dalam bentuk SS.Y t tαtYtt

Menariknya, penghalusan FI dapat ditulis sebagai kombinasi dari dua filter: satu ke depan dan satu ke belakang, mengarah ke formula seperti yang Anda harapkan, tetapi untuk estimasi status tersembunyi (perkiraan dan backcast), tapi tidak untuk pengamatan . Ini dikenal sebagai penyaringan Rauch-Tung-Striebel .Y tαtYt

Setidaknya dalam versi multiplikatif, prosedur peramalan 'ad hoc' seperti Holt-Winters mengandalkan model stokastik tanpa algoritma FI sederhana karena tidak dapat dimasukkan ke dalam bentuk SS. Formula penghalusan mungkin dapat diperkirakan dengan menggunakan model SS, tetapi jauh lebih sederhana untuk menggunakan model Structural Time Series dengan transformasi log. Fungsi 'KalmanSmooth', 'tsSmooth' dan 'StructTS' dari paket statistik R dapat melakukan pekerjaan itu. Anda harus melihat buku-buku karya Harvey atau oleh Durbin dan Koopman yang dikutip di halaman bantuan R. Algoritma smoothing dapat memberikan varian bersyarat untuk estimasiYtdan dapat digunakan untuk membangun interval smoothing, yang biasanya cenderung lebih besar di tengah celah. Namun perlu dicatat bahwa estimasi Model Stuktural bisa sulit.

AP <- log10(AirPassengers) 
## Fit a Basic Structural Model
fit <- StructTS(AP, type = "BSM")

## Fit with a gap
AP.gap <- AP
AP.gap[73:96] <- NA
fit.gap <- StructTS(AP.gap, type = "BSM", optim.control = list(trace = TRUE))

# plot in orginal (non-logged) scale
plot(AirPassengers, col = "black", ylab = "AirPass")
AP.missing <- ts(AirPassengers[73:96], start=1955, , freq=12)
lines(AP.missing, col = "grey", lwd = 1)

## smooth and sum 'level' and 'sea' to retrieve series
sm <- tsSmooth(fit.gap)
fill <- apply(as.matrix(sm[ , c(1,3)]), 1, sum)
AP.fill <- ts(fill[73:96], start=1955, , freq=12)
lines(10^AP.fill, col = "red", lwd = 1)

Isi dihaluskan

Yves
sumber
2

Saya menemukan pendekatan yang Anda sarankan, untuk mengambil cara para pemain depan dan belakang, menarik.

Satu hal yang mungkin perlu ditunjukkan adalah bahwa dalam sistem apa pun yang memperlihatkan struktur kacau, perkiraannya cenderung lebih akurat dalam periode yang lebih pendek. Itu tidak berlaku untuk semua sistem, misalnya pendulum teredam dapat dimodelkan oleh fungsi dengan periode yang salah, dalam hal ini semua perkiraan jangka menengah cenderung salah, sedangkan yang jangka panjang semuanya akan menjadi sangat akurat, karena sistem konvergen ke nol. Tetapi bagi saya, dari grafik di pertanyaan, bahwa ini mungkin asumsi yang masuk akal untuk dibuat di sini.

Itu menyiratkan bahwa kita mungkin lebih baik lebih mengandalkan data perkiraan untuk bagian awal dari periode yang hilang, dan lebih banyak pada data back-cast untuk bagian terakhir. Cara paling sederhana untuk melakukan ini adalah menggunakan bobot yang menurun secara linear untuk perkiraan, dan sebaliknya untuk pemain belakang:

> n <- [number of missing datapoints] 
> w <- seq(1, 0, by = -1/(n+1))[2:(n+1)]

Ini memberikan sedikit bobot backcast pada elemen pertama. Anda juga bisa menggunakan n-1, tanpa subskrip di akhir, jika Anda hanya ingin menggunakan nilai perkiraan pada titik interpolasi pertama.

> w
 [1] 0.92307692 0.84615385 0.76923077 0.69230769 0.61538462 0.53846154
 [7] 0.46153846 0.38461538 0.30769231 0.23076923 0.15384615 0.07692308

Saya tidak memiliki data Anda, jadi mari kita coba ini pada dataset AirPassenger di R. Saya hanya akan menghapus periode dua tahun di dekat pusat:

> APearly <- ts(AirPassengers[1:72], start=1949, freq=12)
> APlate <- ts(AirPassengers[97:144], start=1957, freq=12)
> APmissing <- ts(AirPassengers[73:96], start=1955, freq=12)
> plot(AirPassengers)
# plot the "missing data" for comparison
> lines(APmissing, col="#eeeeee")
# use the HoltWinters algorithm to predict the mean:
> APforecast <- hw(APearly)[2]$mean
> lines(APforecast, col="red")
# HoltWinters doesn't appear to do backcasting, so reverse the ts, forecast, 
# and reverse again (feel free to edit if there's a better process)
> backwards <- ts(rev(APlate), freq=12)
> backcast <- hw(backwards)[2]$mean
> APbackcast <- ts(rev(backcast), start=1955, freq=12)
> lines(APbackcast, col='blue')
# now the magic: 
> n <- 24 
> w <- seq(1, 0, by=-1/(n+1))[2:(n+1)]
> interpolation = APforecast * w + (1 - w) * APbackcast
> lines(interpolation, col='purple', lwd=2)

Dan ada interpolasi Anda.

output grafik

Tentu saja, itu tidak sempurna. Saya kira itu adalah hasil dari pola di bagian awal data yang berbeda dengan pola di bagian terakhir (puncak Juli-Agustus tidak begitu kuat di tahun-tahun sebelumnya). Tapi seperti yang bisa Anda lihat dari gambar, itu jelas lebih baik daripada hanya perkiraan atau pengecoran kembali saja. Saya akan membayangkan bahwa data Anda mungkin mendapatkan hasil yang sedikit kurang andal, karena tidak ada variasi musiman yang kuat.

Dugaan saya adalah Anda bisa mencoba ini termasuk interval kepercayaan juga, tapi saya tidak yakin validitas melakukannya sesederhana ini.

tidak ada apa-apa101
sumber