直接从数据中获得马尔可夫模型图(makovchain或deemod包?)

时间:2018-09-01 09:39:10

标签: r graph markov-models

我想读取一堆因子数据,并据此创建一个过渡矩阵,以便很好地可视化。我找到了一个非常甜美的包装,叫做“ heemod”,它与“ diagram”一起做得不错。

对于我的第一个快捷方法,运行了一段Python代码以获取矩阵,然后使用该R代码段绘制图形。请注意,转换概率来自该未公开且不太重要的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中,并直接从序列数据中生成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可以处理它?<​​/ p>

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

有什么想法吗?有更好/更简便的解决方案吗?

1 个答案:

答案 0 :(得分:2)

define_transition的输入似乎很尴尬。也许这是由于我对heemod软件包的经验不足,但似乎输入过渡的唯一方法是逐个元素。

这是一种解决方法

library(heemod)
library(diagram)

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

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

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

lis$state_names = colnames(dimMatrix)

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

plot(do.call(define_transition, lis))

enter image description here

更新:对评论中的问题:

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

enter image description here

do.call

背后的原因

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

define_transition(dimMatrix, state_names = colnames(dimMatrix))

但是这会引发错误,因为define_transition希望将每个转换作为参数而不是矩阵或列表来提供。为了避免键入:

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

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