Stima delle probabilità di transizione di Markov dai dati di sequenza


16

Ho un set completo di sequenze (432 osservazioni per essere precisi) di 4 stati AD : es

Y=(ACDDBACBAACABCADABA)

EDIT : le sequenze di osservazione sono di lunghezza diversa! Questo cambia qualcosa?

Esiste un modo per calcolare la matrice di transizione in Matlab o R o simile? Penso che il pacchetto HMM potrebbe aiutare. qualche idea?

Pij(Yt=j|Yt1=i)

ad es .: Stima delle probabilità della catena di Markov


3
Hai stati: S = { 1 : = A , 2 : = B , 3 : = C , 4 : = D } . Sia n i j il numero di volte in cui la catena ha effettuato una transizione dallo stato i allo stato j , poiché i j , = 1 , 2 , 3 , 4 . Calcola n i j4S={1:=A,2:=B,3:=C,4:=D}nijijij,=1,2,3,4nij's dal campione e stimare la matrice di transizione con la massima verosimiglianza usando le stime p i j = n i j / Σ 4 j = 1 n i j . (pij)p^ij=nij/j=14nij
Zen,

Queste note derivano dalle stime MLE: stat.cmu.edu/~cshalizi/462/lectures/06/markov-mle.pdf
Zen


@B_Miner potresti scrivere il tuo codice in forma di pseudo-codice per me? O spiegalo in termini semplici ... Comunque vedo che funziona nella mia console R.
HCAI,

Ho una domanda: capisco la tua implementazione e mi va bene, ma mi chiedevo perché non posso semplicemente usare la funzione hmmestimate di Matlab per calcolare la matrice T? Qualcosa del tipo: stati = [1,2,3,4] [T, E] = hmmestimate (x, stati); dove T è la matrice di transizione che mi interessa. Sono nuovo delle catene di Markov e dell'HMM, quindi mi piacerebbe capire la differenza tra le due implementazioni (se ce ne sono).
Qualsiasi

Risposte:


18

Per favore, controlla i commenti sopra. Ecco una rapida implementazione 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, ])

risultati:

> 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

Un'implementazione (probabilmente stupida) in MATLAB (che non ho mai usato, quindi non so se funzionerà. Ho appena cercato su google "dichiara MATLAB matrice vettoriale" per ottenere la sintassi):

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

Sembra fantastico! Non sono sicuro di cosa faccia la terza riga nel tuo codice (principalmente perché ho familiarità con Matlab). Qualche possibilità che tu possa scriverlo in matlab o pseudo-codice? Sarei molto grato.
HCAI,

2
La terza riga fa questo: i valori della catena sono . Per t = 1 , , n - 1 , incremento p x t , x t + 1 . x1,,xnt=1,,n1pxt,xt+1
Zen,

La quarta riga normalizza ogni riga della matrice . (pij)
Zen,

forxxixj

1
No, x is just one row. Don't concatenate because you will introduce "false" transitions: last state of one line first state of the next line. You have to change the code to loop through the lines of your matrix and count the transitions. At the end, normalize each line of the transition matrix.
Zen

9

Here is my implementation 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 request (posted as an edit instead of a comment since he/she lacks reputation): How can I coerce the transitionMatrix of the markovchainFit result to a data.frame?
chl

You can convert to data.frame using as(mcX,"data.frame")
Giorgio Spedicato

@GiorgioSpedicato can you comment on how to deal with sequences of unequal lengths (I cannot concatenate) please in your package?
HCAI

@HCAI, please see the current vignette page 35-36
Giorgio Spedicato

@GiorgioSpedicato thank you for the reference cran.r-project.org/web/packages/markovchain/vignettes/…. I still have n transition matrices, one for each sequence. What I’m after is one general one that takes into account all the sequence observations. Is there something I’m missing?
HCAI

2

Here is a way to do it in Matlab:

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))

Acknowledgement owed to SomptingGuy: http://www.eng-tips.com/viewthread.cfm?qid=236532

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.