Schätzen der Markov-Übergangswahrscheinlichkeiten aus Sequenzdaten

16

Ich habe einen vollständigen Satz von Sequenzen (um genau zu sein 432 Beobachtungen) von 4 Zuständen : zAD

Y=(ACDDBACBAACABCADABA)

EDIT : Die Beobachtungssequenzen sind ungleich lang! Ändert das etwas?

Gibt es eine Möglichkeit, die Übergangsmatrix in Matlab oder R oder ähnlich zu berechnen ? Ich denke, das HMM-Paket könnte helfen. Irgendwelche Gedanken?

Pij(Yt=j|Yt1=i)

zB: Schätzung der Markov-Kettenwahrscheinlichkeiten

HCAI
quelle
3
Sie haben 4 Zustände: S={1:=A,2:=B,3:=C,4:=D} . Sei nij die Häufigkeit, mit der die Kette einen Übergang vom Zustand i zum Zustand j , für ij,=1,2,3,4 . Berechnen Sie die nij aus Ihrer Stichprobe und schätzen Sie die Übergangsmatrix (pij) mit maximaler Wahrscheinlichkeit anhand der Schätzungen p^ij=nij/j=14nij .
Zen
Diese Notizen leiten die MLE-Schätzungen ab: stat.cmu.edu/~cshalizi/462/lectures/06/markov-mle.pdf
Zen
2
Ähnliche Frage: stats.stackexchange.com/questions/26722/…
B_Miner
@B_Miner könntest du deinen Code in Pseudocode-Form für mich schreiben? Oder erklären Sie es in einfachen Worten ... Ich sehe jedoch, dass es in meiner R-Konsole funktioniert.
HCAI
Ich habe eine Frage: Ich verstehe Ihre Implementierung und sie gefällt mir, aber ich habe mich gefragt, warum ich die Matlab-Hmmestimate-Funktion nicht einfach zum Berechnen der T-Matrix verwenden kann. So etwas wie: states = [1,2,3,4] [T, E] = hmmestimate (x, states); wobei T die Übergangsmatrix ist, an der ich interessiert bin. Ich bin neu in Markov-Ketten und HMM, daher möchte ich den Unterschied zwischen den beiden Implementierungen verstehen (falls vorhanden).
Jede

Antworten:

18

Bitte überprüfen Sie die obigen Kommentare. Hier ist eine schnelle Implementierung in R.

x <- c(1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3)
p <- matrix(nrow = 4, ncol = 4, 0)
for (t in 1:(length(x) - 1)) p[x[t], x[t + 1]] <- p[x[t], x[t + 1]] + 1
for (i in 1:4) p[i, ] <- p[i, ] / sum(p[i, ])

Ergebnisse:

> p
          [,1]      [,2]      [,3]      [,4]
[1,] 0.1666667 0.3333333 0.3333333 0.1666667
[2,] 0.2000000 0.2000000 0.4000000 0.2000000
[3,] 0.1428571 0.1428571 0.2857143 0.4285714
[4,] 0.2500000 0.1250000 0.2500000 0.3750000

Eine (wahrscheinlich dumme) Implementierung in MATLAB (die ich noch nie benutzt habe, daher weiß ich nicht, ob dies funktionieren wird. Ich habe gerade "Deklaration der Vektormatrix MATLAB" gegoogelt, um die Syntax zu erhalten):

x = [ 1, 2, 1, 1, 3, 4, 4, 1, 2, 4, 1, 4, 3, 4, 4, 4, 3, 1, 3, 2, 3, 3, 3, 4, 2, 2, 3 ]
n = length(x) - 1
p = zeros(4,4)
for t = 1:n
  p(x(t), x(t + 1)) = p(x(t), x(t + 1)) + 1
end
for i = 1:4
  p(i, :) = p(i, :) / sum(p(i, :))
end
Zen
quelle
Sieht großartig aus! Ich bin mir nicht sicher, was die dritte Zeile in Ihrem Code bewirkt (hauptsächlich, weil ich mit Matlab vertraut bin). Könnten Sie es vielleicht in Matlab oder Pseudocode schreiben? Ich wäre sehr verpflichtet.
HCAI
2
Die dritte Zeile führt dies aus: Die Kettenwerte sind . Für , inkrementiere . t = 1 , ... , n - 1 p x t , x t + 1x1,,xnt=1,,n1pxt,xt+1
Zen
Die vierte Zeile normalisiert jede Zeile der Matrix . (pij)
Zen
Bloß mit meiner Langsamkeit hier. Ich schätze die MATLAB-Code-Übersetzung, obwohl ich immer noch nicht sehe, was es in Ihrer ersten forSchleife versucht . In der dritten Zeile des ursprünglichen Codes wird gezählt, wie oft vom Zustand zum Zustand . Wenn Sie es in Worten sagen könnten, würde ich das sehr schätzen. Cheersx i x jxxixj
HCAI
1
Nein, ist nur eine Zeile. Verketten Sie nicht, weil Sie "falsche" Übergänge einführen werden: letzter Zustand einer Zeile ersten Zustand der nächsten Zeile. Sie müssen den Code ändern, um die Zeilen Ihrer Matrix zu durchlaufen und die Übergänge zu zählen. Normalisieren Sie am Ende jede Zeile der Übergangsmatrix. x
Zen
9

Hier ist meine Implementierung in R

x <- c(1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3)
xChar<-as.character(x)
library(markovchain)
mcX<-markovchainFit(xChar)$estimate
mcX
Giorgio Spedicato
quelle
1
user32041 's Anfrage (gepostet als Änderung anstelle eines Kommentars, da ihm / ihr der Ruf fehlt): Wie kann ich die TransitionMatrix des markovchainFit-Ergebnisses in einen data.frame umwandeln?
CHL
Sie können mita s ( m c X , " d a t a . f r a m e " )deintein.freinmeeins(mcX,"deintein.freinme")
Giorgio Spedicato 14.11.13
@GiorgioSpedicato kannst du in deinem Paket kommentieren, wie mit Sequenzen ungleicher Länge umgegangen werden soll (ich kann sie nicht verketten)?
HCAI
@HCAI, siehe aktuelle Vignette Seite 35-36
Giorgio Spedicato
@GiorgioSpedicato Danke für die Referenz cran.r-project.org/web/packages/markovchain/vignettes/… . Ich habe noch n Übergangsmatrizen, eine für jede Sequenz. Was ich anstrebe, ist eine allgemeine, die alle Sequenzbeobachtungen berücksichtigt. Fehlt mir etwas?
HCAI
2

Hier ist eine Möglichkeit, dies in Matlab zu tun:

x = [1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3];
counts_mat = full(sparse(x(1:end-1),x(2:end),1));
trans_mat = bsxfun(@rdivide,counts_mat,sum(counts_mat,2))

Dank an SomptingGuy: http://www.eng-tips.com/viewthread.cfm?qid=236532

John
quelle