直接来自数据的马尔可夫模型图(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
。
我想读取一堆因子数据并从中创建一个 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
。