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


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


@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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.