直接来自数据的马尔可夫模型图(makovchain 或 deemod 包?)

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

我想读取一堆因子数据并从中创建一个 t运行sition 矩阵,以便我可以很好地可视化。我找到了一个非常棒的包,叫做 'heemod',它和 'diagram' 一起做得不错。

对于我的第一个快速而肮脏的方法,运行 一段 Python 代码获取矩阵,然后使用此 R 代码片段绘制图形。请注意,t运行sition 概率来自未公开且不太重要的 Python 代码,但您也可以假设我在纸上计算了它。

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)

但是,我想在 R 中集成所有内容,并直接从序列数据生成 t运行sition 矩阵和 R 中的图形。

这是我目前拥有的:

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

问题:我怎样才能运行传递 dimMatrix 以便 define_transition 可以处理它?

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

有什么想法吗?有 better/easier 解决方案吗?

define_transition的输入好像很别扭。也许这是由于我对 heemod 包缺乏经验,但似乎输入转换的唯一方法是逐个元素。

这是一个解决方法

library(heemod)
library(diagram)

首先将转换矩阵转换为列表。我在数字上使用了四舍五入,这是可选的。这对应于 define_transition

中的 ... 个变量
lis <- as.list(round(dimMatrix, 3))

现在将您希望的所有其他命名参数添加到列表中:

lis$state_names = colnames(dimMatrix)

现在使用 do.call 将这些参数传递给 define_transition

plot(do.call(define_transition, lis))

更新:针对评论中的问题:

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

背后的原因do.call

最明显的方法(在这里不起作用)是:

define_transition(dimMatrix, state_names = colnames(dimMatrix))

然而,这会引发错误,因为 define_transition 期望每个转换都作为参数提供,而不是作为矩阵或列表提供。为了避免打字:

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

可以将所有参数放在一个列表中,然后像我所做的那样对该列表调用 do.call