Estimando probabilidades de transição de Markov a partir de dados de sequência

16

Eu tenho um conjunto completo de seqüências (432 observações para ser mais preciso) de 4 estados : por exemploAD

Y=(ACDDBACBAACABCADABA)

EDITAR : As sequências de observação são de tamanhos desiguais! Isso muda alguma coisa?

Existe uma maneira de calcular a matriz de transição

Pij(Yt=j|Yt1=i)
no Matlab ou R ou similar? Eu acho que o pacote HMM pode ajudar. Alguma ideia?

por exemplo: Estimando probabilidades da cadeia de Markov

HCAI
fonte
3
Você tem estados: S = { 1 : = A , 2 : = B , 3 : = C , 4 : = D } . Seja n i j o número de vezes que a cadeia fez uma transição do estado i para o estado j , para i j , = 1 , 2 , 3 , 4 . Calcule o n i j4S={1:=A,2:=B,3:=C,4:=D}nijijij,=1,2,3,4nij's a partir de sua amostra e estimar a matriz de transição por máxima verosimilhança usando as estimativas p i j = n i j / Σ 4 J = 1 n i j . (pij)p^ij=nij/j=14nij
Zen
Estas notas derivam as estimativas do MLE: stat.cmu.edu/~cshalizi/462/lectures/06/markov-mle.pdf
Zen
2
Pergunta semelhante: stats.stackexchange.com/questions/26722/…
B_Miner
@B_Miner, você poderia escrever seu código em forma de pseudo-código para mim? Ou explique-o em termos leigos ... No entanto, vejo que funciona no meu console R.
HCAI 11/09/12
Eu tenho uma pergunta: eu entendo sua implementação e ela parece muito bem para mim, mas eu queria saber por que não posso simplesmente usar a função hmmestimate do Matlab para calcular a matriz T? Algo como: states = [1,2,3,4] [T, E] = hmmestimate (x, states); onde T é a matriz de transição em que estou interessado. Sou novo nas cadeias de Markov e no HMM, então gostaria de entender a diferença entre as duas implementações (se houver alguma).
Qualquer

Respostas:

18

Por favor, verifique os comentários acima. Aqui está uma rápida implementação em 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, ])

Resultados:

> 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

Uma implementação (provavelmente burra) no MATLAB (que eu nunca usei, por isso não sei se isso vai funcionar. Acabei de pesquisar no Google "declarar matriz vetorial MATLAB" para obter a sintaxe):

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
fonte
Parece ótimo! No entanto, não tenho certeza do que a terceira linha faz no seu código (principalmente porque estou familiarizado com o Matlab). Alguma chance de você escrever no matlab ou no pseudo-código? Eu ficaria muito grato.
HCAI
2
A terceira linha faz isso: os valores da cadeia são . Para t = 1 , , n - 1 , incremente p x t , x t + 1 . x1,,xnt=1,,n1pxt,xt+1
Zen
A quarta linha normaliza cada linha da matriz . (pij)
Zen
Nua com minha lentidão aqui. Agradeço a tradução do código MATLAB, embora ainda não consiga ver o que está tentando fazer no seu primeiro forloop. A terceira linha do código original está contando o número de vezes que passa do estado x i para o estado x j ? Se você pudesse dizer em palavras, eu apreciaria muito isso. Cheersxxixj
HCAI
1
Não, é apenas uma linha. Não concatene, porque você introduzirá transições "falsas": último estado de uma linha primeiro estado da próxima linha. Você precisa alterar o código para percorrer as linhas da sua matriz e contar as transições. No final, normalize cada linha da matriz de transição. x
Zen
9

Aqui está minha implementação em 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
fonte
1
solicitação do user32041 (postada como uma edição em vez de um comentário, pois não possui reputação): como coagir a transiçãoMatrix do resultado markovchainFit a um data.frame?
quer
data.frameas(mcX,"data.frame")
@GiorgioSpedicato, você pode comentar sobre como lidar com seqüências de comprimentos desiguais (não posso concatenar), por favor no seu pacote?
HCAI
@HCAI, consulte a página atual da vinheta 35-36
Giorgio Spedicato
@GiorgioSpedicato, obrigado pela referência cran.r-project.org/web/packages/markovchain/vignettes/… . Eu ainda tenho n matrizes de transição, uma para cada sequência. O que eu estou procurando é um que leve em consideração todas as observações de sequência. Tem algo que estou perdendo?
HCAI
2

Aqui está uma maneira de fazer isso no 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))

Agradecimento devido a SomptingGuy: http://www.eng-tips.com/viewthread.cfm?qid=236532

John
fonte