Calcular la matriz de transición (Markov) en R

29

¿Hay alguna manera en R (una función incorporada) para calcular la matriz de transición para una cadena de Markov a partir de un conjunto de observaciones?

Por ejemplo, ¿tomar un conjunto de datos como el siguiente y calcular la matriz de transición de primer orden?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))
B_Miner
fuente
¿Qué se supone que representa esta matriz? ¿Una corrida de la cadena de Markov para cada fila (o columna)? O...?
cardenal
Esto es 100 muestras de secuencias de estado (20 de ellas).
B_Miner
¿Está buscando estimaciones de probabilidad o solo cuenta?
cardenal
Estimaciones de probabilidad. Usando las secuencias observadas, cuál es la matriz de probabilidad de transición (4x4 en este ejemplo).
B_Miner

Respuestas:

33

No tengo conocimiento inmediato de una función "incorporada" (p. Ej., En baseo similar), pero podemos hacerlo de manera muy fácil y eficiente en un par de líneas de código.

Aquí hay una función que toma una matriz (no un marco de datos) como entrada y produce los recuentos de transición ( prob=FALSE) o, por defecto ( prob=TRUE), las probabilidades de transición estimadas.

# 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 necesita llamarlo en un marco de datos, siempre puede hacerlo

trans.matrix(as.matrix(dat))

Si está buscando un paquete de terceros, Rseek o el sitio de búsqueda R pueden proporcionar recursos adicionales.

cardenal
fuente
1
+1 También hay varios paquetes R, incluidos HMMy RHMMque pueden ser útiles.
Wayne
@Wayne: (+1) He encontrado que los diversos paquetes HMM disponibles Reran muy delicados en el pasado, particularmente cuando se trata de la adaptación y nunca encontré uno que realmente me gustara o en el que confiara. Quizás la situación sea mejor ahora. Sin embargo, me imagino que lo entenderían bien. Si conoce tal solución, envíela como respuesta; ¡Me encantaría votarlo!
cardenal
1
Lo intenté, pero sin éxito. Este problema no involucra estados ocultos y los paquetes que encontré no tienen ninguna función de utilidad que haga algo menos que HMM completo. (Como nota al margen, el datmarco de datos que el OP da como ejemplo tiene columnas de datos, y ¿quieren una matriz de transición por columna, o una matriz de transición general o podemos convertir la matriz en un vector?)
Wayne
@Wayne: (+1) Planteas un buen punto. He asumido que cada fila es un independiente de ejecución de la cadena de Markov y así estamos buscando las estimaciones de probabilidad de transición formar estas cadenas corren en paralelo. Pero, incluso si se tratara de una cadena que, por ejemplo, se envuelve desde un extremo de una fila hasta el comienzo del siguiente, las estimaciones aún estarían bastante más cercanas debido a la estructura de Markov.
cardenal
1
@B_Miner: Sí, siempre que pueda suponer razonablemente que cada cliente se comporta independientemente de todos los demás. Tales modelos y muchas extensiones son relativamente comunes en el análisis del comportamiento del usuario, por ejemplo, en visitas repetidas a un sitio web, etc.
cardenal
25

Acabo de subir un nuevo paquete R markovchain, basado en el estilo de programación S4. Junto con varios métodos para manejar objetos S4 markovchain, contiene una función para ajustar una cadena de Markov a partir de una secuencia de estados. Mira esto:

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)

Podría ayudar

Giorgio Spedicato
fuente
Un muy buen paquete! ¿Apoyarás las cadenas de Markov de orden superior?
Wayne
Me han pedido una cadena de Markov de orden superior y otro tipo está escribiendo un código. Si desea participar en el desarrollo del código, envíe un correo electrónico a la dirección de mantenimiento y podemos discutir ...
Giorgio Spedicato
Hola, ¿cuál es la diferencia entre markovchainFit y la función publicada anteriormente? ¿Producen los mismos resultados? Gracias
aaaaa
1
metrounarkovdohunayonorteFyot