Oblicz macierz przejścia (Markov) w R.

29

Czy istnieje sposób w R (funkcja wbudowana) do obliczenia macierzy przejścia dla łańcucha Markowa na podstawie zestawu obserwacji?

Na przykład biorąc zestaw danych jak poniżej i obliczyć macierz przejścia pierwszego rzędu?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))
B_Miner
źródło
Co ma reprezentować ta matryca? Jeden przebieg łańcucha Markowa dla każdego wiersza (lub kolumny)? Lub...?
kardynał
Jest to 100 próbek sekwencji stanu (20 z nich).
B_Miner
Szukasz oszacowań prawdopodobieństwa, czy po prostu się liczy?
kardynał
Szacunki prawdopodobieństwa. Wykorzystując zaobserwowane sekwencje, jaka jest macierz prawdopodobieństwa przejścia (4x4 w tym przykładzie).
B_Miner

Odpowiedzi:

33

Nie jestem od razu świadomy funkcji „wbudowanej” (np. W baselub podobnej), ale możemy to zrobić bardzo łatwo i skutecznie w kilku liniach kodu.

Oto funkcja, która przyjmuje na wejściu macierz (a nie ramkę danych) i generuje albo liczbę przejść ( prob=FALSE), albo domyślnie ( prob=TRUE) szacowane prawdopodobieństwo przejścia.

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

Jeśli chcesz wywołać go w ramce danych, zawsze możesz to zrobić

trans.matrix(as.matrix(dat))

Jeśli szukasz pakietu innej firmy, Rseek lub witryna wyszukiwania R mogą zapewnić dodatkowe zasoby.

kardynał
źródło
1
+1 Istnieje również kilka pakietów R, w tym HMMi RHMMktóre mogą być pomocne.
Wayne,
@Wayne: (+1) W przeszłości różne pakiety HMM Rbyły bardzo wybredne, szczególnie jeśli chodzi o dopasowanie i nigdy nie znalazłem takiego, który naprawdę mi się podobał lub którym ufał. Może teraz sytuacja jest lepsza. Wyobrażam sobie jednak, że dobrze to zrobią. Jeśli znasz takie rozwiązanie, prześlij je jako odpowiedź; Z przyjemnością zagłosuję!
kardynał
1
Próbowałem, ale bezskutecznie. Ten problem nie wiąże się z ukrytymi stanami, a pakiety, które znalazłem, nie mają żadnych funkcji narzędziowych, które mogłyby zrobić coś mniej niż pełny HMM. (Na marginesie, datramka danych, którą OP podaje jako przykład, zawiera kolumny danych i czy chcą macierzy przejścia na kolumnę, czy ogólnej macierzy przejścia, czy możemy po prostu przekształcić macierz w wektor?)
Wayne
@Wayne: (+1) Podnosisz dobry punkt. I zakłada , że każdy wiersz jest niezależny bieg łańcucha Markowa i dlatego poszukują szacunki prawdopodobieństwa przejścia tworzą te łańcuchy równolegle. Ale nawet gdyby był to łańcuch, który, powiedzmy, zawinięty od jednego końca rzędu do początku następnego, szacunki byłyby jeszcze bliższe ze względu na strukturę Markowa.
kardynał
1
@B_Miner: Tak, pod warunkiem, że można rozsądnie założyć, że każdy klient zachowuje się niezależnie od wszystkich innych. Takie modele i wiele rozszerzeń są stosunkowo powszechne w analizie zachowań użytkowników, np.
kard.
25

Właśnie przesłałem nowy pakiet R markovchain, oparty na stylu programowania S4. Wraz z różnymi metodami obsługi obiektów markovchain S4 zawiera funkcję dopasowania łańcucha Markowa z sekwencji stanów. Spójrz na:

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)

To może pomóc.

Giorgio Spedicato
źródło
Bardzo fajny pakiet! Czy będziesz wspierać łańcuchy Markowa wyższego rzędu?
Wayne
Poproszono mnie o łańcuch Markowa wyższego rzędu, a inny facet pisze kod. Jeśli chcesz wziąć udział w tworzeniu kodu, wyślij e-mail na adres mantainer, abyśmy mogli omówić ...
Giorgio Spedicato
Cześć, jaka jest różnica między markovchainFit a powyższą funkcją? Czy dają takie same wyniki? Dzięki
aaaaa,
1
markovchainFit