如何解决个人时期数据的一阶马尔可夫转移矩阵
使用单个人的时间序列数据,我可以计算出一阶概率转移矩阵即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)
*对于列表中的每个人,我无法弄清楚:
有人对如何通过 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 举报,一经查实,本站将立刻删除。