Estimation des probabilités de transition de Markov à partir des données de séquence

16

J'ai un ensemble complet de séquences (432 observations pour être précis) de 4 états AD : par ex.

Y=(ACDDBACBAACABCADABA)

EDIT : Les séquences d'observation sont de longueurs inégales! Est-ce que cela change quelque chose?

Existe-t-il un moyen de calculer la matrice de transition dans Matlab ou R ou similaire? Je pense que le package HMM pourrait aider. Des pensées?

Pij(Yt=j|Yt1=i)

Exemple: Estimation des probabilités de la chaîne de Markov

HCAI
la source
3
Vous avez états: S = { 1 : = A , 2 : = B , 3 : = C , 4 : = D } . Soit n i j le nombre de fois que la chaîne est passée de l'état i à l'état j , pour i j , = 1 , 2 , 3 , 4 . Calculer le n i j4S={1:=A,2:=B,3:=C,4:=D}nijijij,=1,2,3,4nij« s à partir de l' échantillon et d' estimer la matrice de transition par maximum de vraisemblance en utilisant les estimations p i j = n i j / Σ 4 j = 1 n i j . (pij)p^ij=nij/j=14nij
Zen
Ces notes dérivent des estimations MLE: stat.cmu.edu/~cshalizi/462/lectures/06/markov-mle.pdf
Zen
2
Question similaire: stats.stackexchange.com/questions/26722/…
B_Miner
@B_Miner pourriez-vous écrire votre code sous forme de pseudo-code pour moi? Ou expliquez-le en termes simples ... Cependant, je vois que cela fonctionne dans ma console R.
HCAI
J'ai une question: je comprends votre implémentation et ça me va très bien, mais je me demandais pourquoi ne puis-je pas simplement utiliser la fonction hmmestimate de Matlab pour calculer la matrice T? Quelque chose comme: états = [1,2,3,4] [T, E] = hmmestimate (x, états); où T est la matrice de transition qui m'intéresse. Je suis nouveau dans les chaînes de Markov et HMM, donc j'aimerais comprendre la différence entre les deux implémentations (s'il y en a).
N'importe quel

Réponses:

18

Veuillez vérifier les commentaires ci-dessus. Voici une implémentation rapide dans 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, ])

Résultats:

> 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

Une implémentation (probablement stupide) dans MATLAB (que je n'ai jamais utilisée, donc je ne sais pas si cela va fonctionner. Je viens de googler "déclarer la matrice vectorielle MATLAB" pour obtenir la syntaxe):

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
la source
Ça a l'air super! Je ne sais pas ce que fait la 3e ligne dans votre code (principalement parce que je connais Matlab). Avez-vous des chances de l'écrire dans matlab ou pseudo-code? Je serais bien obligé.
HCAI
2
x1,,xnt=1,,n1pxt,xt+1
(pij)
forxxixj
1
x
9

Voici mon implémentation en 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
la source
1
user32041 de (publiée en tant que modification au lieu d'un commentaire car il / elle manque de réputation): Comment puis-je contraindre la transitionMatrix du résultat markovchainFit à un data.frame?
chl
Vous pouvez convertir en unetune.Fruneme en utilisant unes(mcX,"unetune.Fruneme")
Giorgio Spedicato
@GiorgioSpedicato pouvez-vous commenter comment traiter des séquences de longueurs inégales (je ne peux pas concaténer) s'il vous plaît dans votre colis?
HCAI
@HCAI, veuillez consulter la vignette actuelle page 35-36
Giorgio Spedicato
@GiorgioSpedicato merci pour la référence cran.r-project.org/web/packages/markovchain/vignettes/… . J'ai encore n matrices de transition, une pour chaque séquence. Ce que je recherche, c'est un général qui prend en compte toutes les observations de séquence. Y a-t-il quelque chose qui me manque?
HCAI
2

Voici une façon de le faire dans 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))

Remerciements dus à SomptingGuy: http://www.eng-tips.com/viewthread.cfm?qid=236532

John
la source