Markov Model diagram directly from data (makovchain or deemod package?)

扶醉桌前 提交于 2019-12-06 14:33:52

问题


I want to read a bunch of factor data and create a transition matrix from it that I can visualise nicely. I found a very sweet package, called 'heemod' which, together with 'diagram' does a decent job.

For my first quick-and-dirty approach, a ran a piece of Python code to get to the matrix, then used this R sniplet to draw the graph. Note that the transition probabilities come from that undisclosed and less important Python code, but you can also just assume that I calculated it on paper.

library('heemod')
library('diagram')
mat_dim <- define_transition(
  state_names = c('State_A', 'State_B', 'State_C'),
  .18, .73, .09, 
  .22, .0, .78,
  .58, .08, .33);
plot(mat_dim)

However, I would like to integrate all in R and generate the transition matrix and the graph within R and from the sequence data directly.

This is what I have so far:

library(markovchain)
library('heemod')
library('diagram')

# the data --- this is normally read from a file
data = c(1,2,1,1,1,2,3,1,3,1,2,3,1,2,1,2,3,3,3,1,2,3,2,3,1,2,3,3,1,2,3,3,1)
fdata = factor(data)
rdata = factor(data,labels=c("State_A","State_B","State_C"))

# create transition matrix
dimMatrix = createSequenceMatrix(rdata, toRowProbs = TRUE)
dimMatrix

QUESTION: how can I transfer dimMatrix so that define_transition can process it?

mat_dim <- define_transition( ??? );
plot(mat_dim)

Any ideas? Are there better/easier solutions?


回答1:


The input to define_transition seems to be quite awkward. Perhaps this is due to my inexperience with the heemod package but it seems the only way to input transitions is element by element.

Here is a workaround

library(heemod)
library(diagram)

first convert the transition matrix to a list. I used rounding on the digits which is optional. This corresponds to the ... variables in define_transition

lis <- as.list(round(dimMatrix, 3))

now add to the list all other named arguments you wish:

lis$state_names = colnames(dimMatrix)

and now pass these arguments to define_transition using do.call:

plot(do.call(define_transition, lis))

Update: to the question in the comments:

lis <- as.list(t(round(dimMatrix, 3)))
lis$state_names = colnames(dimMatrix)
plot(do.call(define_transition, lis))

The reasoning behind do.call

The most obvious way (which does not work here) is to do:

define_transition(dimMatrix, state_names = colnames(dimMatrix))

however this throws an error since the define_transition expects each transition to be supplied as an argument and not as a matrix or a list. In order to avoid typing:

define_transition(0.182, 0.222,..., state_names = colnames(dimMatrix))

one can put all the arguments in a list and then call do.call on that list as I have done.



来源:https://stackoverflow.com/questions/52126866/markov-model-diagram-directly-from-data-makovchain-or-deemod-package

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!