R cinsinden Geçiş Matrisini (Markov) hesaplayın


29

Markov Zincirinin geçiş matrisini bir dizi gözlemden hesaplamak için R'de (yerleşik bir işlev) bir yol var mı?

Örneğin, aşağıdaki gibi bir veri seti almak ve birinci mertebe geçiş matrisini hesaplamak?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))

Bu matrisin neyi temsil etmesi gerekiyor? Her satır (veya sütun) için Markov zincirinin bir çalıştırması? Veya...?
kardinal,

Bu 100 devlet dizisi örneğidir (20 tanesi).
B_Miner

Olasılık tahminleri mi arıyorsunuz yoksa sayıları mı?
kardinal

Olasılık tahminleri. Gözlenen dizileri kullanarak, geçiş olasılığı matrisi nedir (bu örnekte 4x4).
B_Miner

Yanıtlar:


33

Bir "yerleşik" işlevden hemen haberdar değilim (örneğin, içinde baseveya benzeri), ancak bunu birkaç satır kodda çok kolay ve verimli bir şekilde yapabiliriz.

Burada girdi olarak bir matris (veri çerçevesi değil) alan ve geçiş sayımlarını ( prob=FALSE) veya varsayılan olarak ( prob=TRUE) tahmin edilen geçiş olasılıklarını üreten bir işlevdir .

# 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
}

Veri çerçevesinde aramanız gerekirse, istediğiniz zaman

trans.matrix(as.matrix(dat))

Bazı üçüncü taraf paketlerini arıyorsanız, Rseek veya R arama sitesi ek kaynaklar sağlayabilir.


1
+1 Ayrıca dahil olmak üzere birkaç R paketi de var HMMve RHMMbu yardımcı olabilir.
Wayne

@Wayne: (1) I mevcut olan çeşitli SMM paketleri bulduk Rolmak çok o uydurma geldiğinde özellikle geçmişte titiz ve bana gerçekten sevdim veya güvenilir bulmadım. Belki durum şimdi daha iyi. Yine de bunu doğru yapabileceklerini hayal ediyorum. Böyle bir çözüm biliyorsanız, lütfen bir cevap olarak gönderin; Oy vermekten mutlu olurum!
kardinal

1
Denedim, ama başarılı olamadım. Bu sorun, gizli durumları içermez ve bulduğum paketler, tam gelişmiş HMM'den daha az bir şey yapabilecek yardımcı işlevlere sahip değildir. (Bir not olarak, datOP'nin bir örnek olarak verdiği veri çerçevesi veri sütunlarına sahiptir ve sütun başına bir geçiş matrisi mi, yoksa genel bir geçiş matrisi mi isterler yoksa matrisi bir vektöre çevirebilir miyiz?)
Wayne

@Wayne: (+1) İyi bir noktaya değindin. Ben var varsayılır her satır bir olduğunu bağımsız Markov zincirinin çalışma ve biz arıyorlar böylece geçiş olasılık tahminleri bu zincirler paralel çalışmasına oluştururlar. Ancak, bu, bir satırın bir ucundan diğerinin başlangıcına kadar sarılmış bir zincir olsa bile, Markov yapısı nedeniyle tahminler daha da yakın olacaktı.
kardinal

1
@B_Miner: Evet, öyle ki, her müşterinin diğerlerinden bağımsız olarak davrandığını makul bir şekilde varsaydığınız sürece. Bu tür modeller ve birçok uzantı, kullanıcı davranışını analiz etmede nispeten yaygındır, örneğin, bir web sitesine tekrar tekrar yapılan ziyaretler vb.
kardinal

25

markovchainS4 programlama stiline göre yeni bir R paketi yükledim . S4 markovchain nesnelerini işlemek için çeşitli yöntemlerle birlikte, bir durum dizisinden bir Markov zincirine uyacak bir fonksiyon içerir. Göz atmak:

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)

Yardımcı olabilir.


Çok hoş bir paket! Yüksek dereceli Markov Zincirlerini destekleyecek misiniz?
Wayne

Ben Markov zincirinin daha yüksek dereceli olması istendi ve başka bir adam bazı kodlar yazıyor. Kod geliştirme sürecine katılmak istiyorsanız, mantainer adresine bir e-posta gönderin ve görüşebiliriz ...
Giorgio Spedicato

Merhaba, markovchainFit ve yukarıda belirtilen işlev arasındaki fark nedir? Aynı sonuçları veriyorlar mı? Thanks
aaaaa

1
@aaaaa, işlevi, Rcpp'de derlendiğinden ve bir paket içinde derlendiğinden daha hızlı olmalıdır. Ayrıca çok daha fazla veri formatını yönetir. markovchainFit
Giorgio Spedicato
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.