Berechnen Sie die Übergangsmatrix (Markov) in R

29

Gibt es in R (eine eingebaute Funktion) eine Möglichkeit, die Übergangsmatrix für eine Markov-Kette aus einer Reihe von Beobachtungen zu berechnen?

Nehmen Sie zum Beispiel einen Datensatz wie den folgenden und berechnen Sie die Übergangsmatrix erster Ordnung?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))
B_Miner
quelle
Was soll diese Matrix darstellen? Ein Lauf der Markov-Kette für jede Zeile (oder Spalte)? Oder...?
Kardinal
Dies sind 100 Samples von Zustandssequenzen (20 von ihnen).
B_Miner
Suchen Sie nach Wahrscheinlichkeitsschätzungen oder zählen Sie nur?
Kardinal
Wahrscheinlichkeitsschätzungen. Wie lautet die Übergangswahrscheinlichkeitsmatrix unter Verwendung der beobachteten Sequenzen (4x4 in diesem Beispiel)?
B_Miner

Antworten:

33

Ich bin mir einer "eingebauten" Funktion (zB in baseoder ähnlichem) nicht sofort bewusst , aber wir können dies sehr einfach und effizient in ein paar Codezeilen tun.

Hier ist eine Funktion, die eine Matrix (keinen Datenrahmen) als Eingabe verwendet und entweder die Übergangszahlen ( prob=FALSE) oder standardmäßig ( prob=TRUE) die geschätzten Übergangswahrscheinlichkeiten erzeugt.

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

Wenn Sie es auf einem Datenrahmen aufrufen müssen, können Sie immer tun

trans.matrix(as.matrix(dat))

Wenn Sie nach Paketen von Drittanbietern suchen, bietet Rseek oder die R- Suchsite möglicherweise zusätzliche Ressourcen.

Kardinal
quelle
1
+1 Es gibt auch mehrere R-Pakete, einschließlich HMMund RHMMdas könnte hilfreich sein.
Wayne
@Wayne: (+1) Ich habe die verschiedenen HMM - Pakete zur Verfügung gefunden Rwerden sehr heikel in der Vergangenheit, vor allem wenn es um die Montage kommt und ich fand nie den ich wirklich mochte oder als vertrauenswürdig. Vielleicht ist die Situation jetzt besser. Ich würde mir vorstellen, dass sie das richtig machen würden. Wenn Sie eine solche Lösung kennen, reichen Sie sie bitte als Antwort ein. Ich würde gerne darüber abstimmen!
Kardinal
1
Ich habe es versucht, aber ohne Erfolg. Bei diesem Problem handelt es sich nicht um versteckte Zustände, und die Pakete, die ich gefunden habe, haben keine Dienstprogrammfunktionen, die weniger als das vollständige HMM leisten würden. (Als Randnotiz: Der datDatenrahmen, den das OP als Beispiel angibt, enthält Datenspalten. Wollen sie eine Übergangsmatrix pro Spalte oder eine Gesamtübergangsmatrix, oder können wir die Matrix einfach in einen Vektor umwandeln?)
Wayne
@ Wayne: (+1) Sie sprechen einen guten Punkt an. Ich habe angenommen, dass jede Zeile ein unabhängiger Lauf der Markov-Kette ist, und deshalb suchen wir die Übergangswahrscheinlichkeitsschätzungen für diese parallel laufenden Ketten. Aber selbst wenn es sich um eine Kette handeln würde, die beispielsweise von einem Ende einer Reihe zum nächsten gewickelt ist, wären die Schätzungen aufgrund der Markov-Struktur noch näher.
Kardinal
1
@B_Miner: Ja, solange Sie davon ausgehen können, dass sich jeder Kunde unabhängig von allen anderen verhält. Solche Modelle und viele Erweiterungen sind bei der Analyse des Benutzerverhaltens relativ häufig, z. B. bei wiederholten Besuchen einer Website usw.
Kardinal
25

Ich habe gerade ein neues R-Paket hochgeladen markovchain, das auf dem S4-Programmierstil basiert. Zusammen mit verschiedenen Methoden zum Behandeln von S4-Markovchain-Objekten enthält es eine Funktion zum Anpassen einer Markov-Kette aus einer Folge von Zuständen. Schauen Sie sich an:

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)

Es könnte helfen.

Giorgio Spedicato
quelle
A very nice package! Will you be supporting higher-order Markov Chains?
Wayne
I have been asked for higher order Markov chain and another guy is writing some code. If you wish to partecipate in code developing send an email to mantainer address and we can discuss...
Giorgio Spedicato
Hi, what’s the difference between markovchainFit and the function posted above? Do they yield the same results? Thanks
aaaaa
1
@aaaaa, the markovchainFit function should be faster since build in Rcpp and compiled within a package. Also it handles much more data formats.
Giorgio Spedicato