个人时期数据的一阶马尔可夫转移矩阵

问题描述

使用单个人的时间序列数据,我可以计算出一阶概率转移矩阵即library(markovchain)并计算其密度即library(statnet)

此代码有效:

ds = matrix(c(1,1,2,4,3,6,8),ncol=3,byrow=TRUE) #create person period data for a single person
colnames(ds) = c("Id","Time","Evt")
ds = as.data.frame(ds)
mc = markovchainFit(ds$Evt,name = "mc")$estimate #calculate markovchain
am = mc@transitionMatrix #remove slot from S4 object
em = network(am,matrix.type="adjacency",directed=TRUE,Weighted = TRUE,loops = FALSE) #make network object
gden(em)#calculate density of network,etc

但是我无法使用 tapply 使其适用于具有多个 ID 的数据。此代码在第 4 行之后不起作用,但这是我脑海中的解决方案:

ds2 = matrix(c(1,8,5,7,9),byrow=TRUE) #create person period data for two people
colnames(ds2) = c("Id","Evt")
ds2 = as.data.frame(ds2)
mc2 = tapply(ds2$Evt,ds2$Id,markovchainFit) #it works to here and I am STUCK for days *see below
am2 = mc@transitionMatrix,#can't figure how to integrate these steps from above
em2 = network(am,loops = FALSE) 
gden(em2)

*对于列表中的每个人,我无法弄清楚:

  1. 如何命名马尔可夫链 S4 对象
  2. 如何从 S4 对象中删除转换矩阵槽
  3. 如何在markovchainFit之后传递附加函数

有人对如何通过 ID 向量循环我对单个人的分析有任何建议吗?将不胜感激。

解决方法

像下面这样的怎么样。在下面的代码中,我创建了一个函数来完成所有的临时工作,并在适当的对象上返回 gden() 的结果。


ds2 = matrix(c(1,1,2,4,3,6,8,5,7,9),ncol=3,byrow=TRUE) #create person period data for two people
colnames(ds2) = c("Id","Time","Evt")
ds2 = as.data.frame(ds2)
mcfun <- function(x){
  mc <- markovchainFit(x,name="mc")$estimate
  am <- mc@transitionMatrix
  em <- network(am,matrix.type="adjacency",directed=TRUE,Weighted = TRUE,loops = FALSE) #make network object
  gden(em)#calculate density of network,etc
  
}
tapply(ds2$Evt,ds2$Id,mcfun)
#    1    2 
# 0.25 0.25 

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...