Calculer la matrice de transition (Markov) dans R

29

Existe-t-il un moyen dans R (une fonction intégrée) de calculer la matrice de transition pour une chaîne de Markov à partir d'un ensemble d'observations?

Par exemple, en prenant un ensemble de données comme le suivant et en calculant la matrice de transition de premier ordre?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))
B_Miner
la source
Qu'est-ce que cette matrice est censée représenter? Un passage de la chaîne de Markov pour chaque ligne (ou colonne)? Ou...?
Cardinal
Il s'agit de 100 échantillons de séquences d'états (20 d'entre eux).
B_Miner
Cherchez-vous des estimations de probabilité ou simplement des chiffres?
Cardinal
Estimations de probabilité. En utilisant les séquences observées, quelle est la matrice de probabilité de transition (4x4 dans cet exemple).
B_Miner

Réponses:

33

Je ne suis pas immédiatement au courant d'une fonction "intégrée" (par exemple, dans baseou similaire), mais nous pouvons le faire très facilement et efficacement en quelques lignes de code.

Voici une fonction qui prend une matrice (pas une trame de données) comme entrée et produit soit le nombre de transitions ( prob=FALSE) soit, par défaut ( prob=TRUE), les probabilités de transition estimées.

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

Si vous devez l'appeler sur une trame de données, vous pouvez toujours le faire

trans.matrix(as.matrix(dat))

Si vous recherchez un package tiers, Rseek ou le site de recherche R peuvent fournir des ressources supplémentaires.

cardinal
la source
1
+1 Il existe également plusieurs packages R, y compris HMMet RHMMqui pourraient être utiles.
Wayne
@Wayne: (+1) J'ai trouvé les différents forfaits disponibles HMM dans Rd'être très pointilleux dans le passé, en particulier en matière de montage et je ne trouve que je vraiment aimé ou confiance. Peut-être que la situation est meilleure maintenant. J'imagine cependant qu'ils réussiraient. Si vous connaissez une telle solution, veuillez la soumettre comme réponse; Je serais heureux de le voter!
Cardinal
1
J'ai essayé, mais sans succès. Ce problème ne concerne pas les états cachés et les packages que j'ai trouvés n'ont pas de fonctions utilitaires qui feraient autre chose que HMM à part entière. (En guise de remarque, la dattrame de données que l'OP donne comme exemple a des colonnes de données, et veulent-ils une matrice de transition par colonne, ou une matrice de transition globale ou pouvons-nous simplement transformer la matrice en un vecteur?)
Wayne
@Wayne: (+1) Vous soulevez un bon point. J'ai supposé que chaque ligne est une séquence indépendante de la chaîne de Markov et nous recherchons donc les estimations de probabilité de transition à partir de ces chaînes exécutées en parallèle. Mais, même s'il s'agissait d'une chaîne qui, par exemple, s'enroulait d'un bout à l'autre du début du suivant, les estimations seraient encore plus proches en raison de la structure de Markov.
Cardinal
1
@B_Miner: Oui, tant que vous pouvez raisonnablement supposer que chaque client se comporte indépendamment des autres. De tels modèles et de nombreuses extensions sont relativement courants dans l'analyse du comportement des utilisateurs, par exemple lors de visites répétées sur un site Web, etc.
cardinal
25

Je viens de télécharger un nouveau package R markovchain, basé sur le style de programmation S4. Avec diverses méthodes pour gérer les objets S4 Markovchain, il contient une fonction pour adapter une chaîne de Markov à partir d'une séquence d'états. Jettes un coup d'oeil à:

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)

Ça pourrait aider.

Giorgio Spedicato
la source
Un très joli package! Soutiendrez-vous des chaînes de Markov d'ordre supérieur?
Wayne
On m'a demandé une chaîne Markov d'ordre supérieur et un autre gars écrit du code. Si vous souhaitez participer au développement du code, envoyez un e-mail à l'adresse du responsable et nous pourrons discuter ...
Giorgio Spedicato
Salut, quelle est la différence entre markovchainFit et la fonction affichée ci-dessus? Donnent-ils les mêmes résultats? Merci
aaaaa
1
munerkovchunejenFjet