Hitung Matriks Transisi (Markov) di R

29

Apakah ada cara dalam R (fungsi bawaan) untuk menghitung matriks transisi untuk Rantai Markov dari serangkaian pengamatan?

Misalnya, mengambil kumpulan data seperti berikut dan menghitung matriks transisi orde pertama?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))
B_Miner
sumber
Apa yang seharusnya diwakili oleh matriks ini? Satu putaran rantai Markov untuk setiap baris (atau kolom)? Atau...?
kardinal
Ini menjadi 100 sampel urutan negara (20 di antaranya).
B_Miner
Apakah Anda mencari perkiraan probabilitas atau hanya menghitung?
kardinal
Estimasi probabilitas. Menggunakan urutan yang diamati, apa matriks probabilitas transisi (4x4 dalam contoh ini).
B_Miner

Jawaban:

33

Saya tidak segera mengetahui fungsi "built-in" (misalnya, dalam baseatau serupa), tetapi kita dapat melakukan ini dengan sangat mudah dan efisien dalam beberapa baris kode.

Berikut adalah fungsi yang mengambil matriks (bukan bingkai data) sebagai input dan menghasilkan jumlah transisi ( prob=FALSE) atau, secara default ( prob=TRUE), perkiraan probabilitas transisi.

# Function to calculate first-order Markov transition matrix.
# Each *row* corresponds to a single run of the Markov chain
trans.matrix <- function(X, prob=T)
{
    tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
    if(prob) tt <- tt / rowSums(tt)
    tt
}

Jika Anda perlu menyebutnya pada frame data, Anda selalu dapat melakukannya

trans.matrix(as.matrix(dat))

Jika Anda mencari beberapa paket pihak ketiga, maka Rseek atau situs pencarian R dapat menyediakan sumber daya tambahan.

kardinal
sumber
1
+1 Ada juga beberapa paket R, termasuk HMMdan RHMMyang mungkin membantu.
Wayne
@Wayne: (+1) Saya telah menemukan berbagai paket HMM tersedia Runtuk menjadi sangat rewel di masa lalu, terutama ketika datang ke pemasangan dan saya tidak pernah menemukan satu saya benar-benar suka atau dipercaya. Mungkin situasinya lebih baik sekarang. Saya akan membayangkan mereka akan melakukan ini dengan benar. Jika Anda mengetahui solusi semacam itu, harap kirimkan sebagai jawaban; Saya akan senang memilihnya!
kardinal
1
Saya mencoba, tetapi tidak berhasil. Masalah ini tidak melibatkan status tersembunyi dan paket yang saya temukan tidak memiliki fungsi utilitas yang akan melakukan apa pun selain HMM. (Sebagai catatan, datkerangka data yang diberikan OP sebagai contoh memiliki kolom data, dan apakah mereka menginginkan matriks transisi per kolom, atau keseluruhan matriks transisi atau dapatkah kita mengubah matriks menjadi vektor?)
Wayne
@Wayne: (+1) Anda meningkatkan poin yang baik. Saya berasumsi bahwa setiap baris adalah proses independen dari rantai Markov dan jadi kami mencari perkiraan probabilitas transisi dari rantai ini yang berjalan secara paralel. Tetapi, bahkan jika ini adalah rantai yang, katakanlah, dibungkus dari satu ujung baris ke awal berikutnya, perkiraan masih akan cukup dekat karena struktur Markov.
kardinal
1
@ B_Miner: Ya, itu benar, selama Anda dapat dengan wajar mengasumsikan bahwa setiap pelanggan berperilaku secara independen dari semua pelanggan lainnya. Model seperti itu dan banyak ekstensi relatif umum dalam menganalisis perilaku pengguna, misalnya, pada kunjungan berulang ke situs web, dll.
kardinal
25

Saya baru saja mengunggah paket R baru markovchain, berdasarkan gaya pemrograman S4. Seiring dengan berbagai metode untuk menangani objek markovchain S4 itu berisi fungsi agar sesuai rantai Markov dari urutan negara. Lihatlah:

library(markovchain) 
sequence <- c("a", "b", "a", "a", "a", "a", "b", "a", "b", "a", 
              "b", "a", "a", "b", "b", "b", "a")
mcFit <- markovchainFit(data=sequence)

Itu bisa membantu.

Giorgio Spedicato
sumber
Paket yang sangat bagus! Apakah Anda akan mendukung Rantai Markov tingkat tinggi?
Wayne
Saya telah diminta untuk rantai Markov urutan yang lebih tinggi dan orang lain sedang menulis beberapa kode. Jika Anda ingin berpartisipasi dalam pengembangan kode, kirim email ke alamat mantainer dan kami dapat mendiskusikan ...
Giorgio Spedicato
Hai, apa perbedaan antara markovchainFit dan fungsi yang diposting di atas? Apakah mereka menghasilkan hasil yang sama? Terima kasih
aaaaa
1
mSebuahrkHaivchSebuahsayanFsayat