2

我想读取一堆因子数据并从中创建一个可以很好地可视化的转换矩阵。我发现了一个非常可爱的包,称为“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 可以处理它?

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

有任何想法吗?有更好/更简单的解决方案吗?

4

1 回答 1

2

的输入define_transition似乎很尴尬。也许这是由于我对heemod包没有经验,但似乎输入转换的唯一方法是逐个元素。

这是一个解决方法

library(heemod)
library(diagram)

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

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

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

lis$state_names = colnames(dimMatrix)

现在将这些参数传递给define_transitionusing do.call

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像我所做的那样调用该列表。

于 2018-09-01T11:11:58.043 回答