微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

使用单个人的时间序列数据,我可以计算出一阶概率转移矩阵即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 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。