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


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


@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

Ç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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.