Calcola la matrice di transizione (Markov) in R


29

Esiste un modo in R (una funzione integrata) per calcolare la matrice di transizione per una catena di Markov da una serie di osservazioni?

Ad esempio, prendere un set di dati come il seguente e calcolare la matrice di transizione del primo ordine?

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

Cosa dovrebbe rappresentare questa matrice? Una corsa della catena Markov per ogni riga (o colonna)? O...?
cardinale il

Si tratta di 100 campioni di sequenze di stati (20 di questi).
B_Miner

Cerchi stime di probabilità o conta solo?
cardinale il

Stime di probabilità. Usando le sequenze osservate, qual è la matrice di probabilità di transizione (4x4 in questo esempio).
B_Miner

Risposte:


33

Non sono immediatamente a conoscenza di una funzione "incorporata" (ad esempio, in baseo simile), ma possiamo farlo in modo molto semplice ed efficiente in un paio di righe di codice.

Ecco una funzione che accetta una matrice (non un frame di dati) come input e produce i conteggi di transizione ( prob=FALSE) o, per impostazione predefinita ( prob=TRUE), le probabilità di transizione stimate.

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

Se è necessario chiamarlo su un frame di dati, è sempre possibile farlo

trans.matrix(as.matrix(dat))

Se stai cercando un pacchetto di terze parti, Rseek o il sito di ricerca R potrebbero fornire risorse aggiuntive.


1
+1 Esistono anche diversi pacchetti R, inclusi HMMe RHMMche potrebbero essere utili.
Wayne,

@Wayne: (1) Ho trovato i vari pacchetti disponibili in HMM Rdi essere molto schizzinoso in passato, in particolare quando si tratta di montaggio e non ho mai trovato uno che veramente è piaciuta o come attendibile. Forse la situazione è migliore ora. Immagino che avrebbero capito bene, però. Se conosci tale soluzione, ti preghiamo di inviarla come risposta; Sarei felice di votarlo!
cardinale il

1
Ci ho provato, ma senza successo. Questo problema non coinvolge stati nascosti e i pacchetti che ho trovato non hanno alcuna funzione di utilità che farebbe altro che un HMM completo. (Come nota a margine, il datframe di dati che l'OP fornisce come esempio ha colonne di dati e vogliono una matrice di transizione per colonna o una matrice di transizione globale o possiamo semplicemente trasformare la matrice in un vettore?)
Wayne

@Wayne: (+1) Sollevi un buon punto. Ho ipotizzato che ogni riga sia una corsa indipendente della catena di Markov e quindi stiamo cercando le stime di probabilità di transizione da queste catene che corrono in parallelo. Ma, anche se questa fosse una catena che, diciamo, avanzava da un'estremità di una fila all'inizio della successiva, le stime sarebbero ancora più vicine a causa della struttura di Markov.
cardinale il

1
@B_Miner: Sì, purché si possa ragionevolmente supporre che ogni cliente si comporti indipendentemente da tutti gli altri. Tali modelli e molte estensioni sono relativamente comuni nell'analisi del comportamento degli utenti, ad es. Durante ripetute visite a un sito Web, ecc.
Cardinale

25

Ho appena caricato un nuovo pacchetto R markovchain, basato sullo stile di programmazione S4. Insieme a vari metodi per gestire oggetti markovchain S4, contiene una funzione per adattare una catena Markov da una sequenza di stati. Dai un'occhiata a:

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)

Potrebbe aiutare


Un pacchetto molto carino! Sosterrai le catene Markov di ordine superiore?
Wayne,

Mi è stato chiesto per la catena Markov di ordine superiore e un altro ragazzo sta scrivendo del codice. Se desideri partecipare allo sviluppo del codice invia un'email all'indirizzo mantainer e possiamo discutere ...
Giorgio Spedicato

Ciao, qual è la differenza tra markovchainFit e la funzione pubblicata sopra? Danno gli stessi risultati? Grazie
aaaaa,

1
@aaaaa, la funzione dovrebbe essere più veloce poiché compilata in Rcpp e compilata in un pacchetto. Inoltre gestisce molti più formati di dati. markovchainFit
Giorgio Spedicato,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.