R语言 为马尔可夫模型创建转换矩阵

2ic8powd  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(153)

我需要关于马尔可夫链和数据预处理的帮助。假设我有以下矩阵,将个体与状态随时间推移联系起来:

  1. ID Time1 Time2
  2. 1 14021 A A
  3. 2 15031 B A
  4. 3 16452 A C

对于这个矩阵,我想得到状态转移矩阵:因此,需要的是

  1. A B C
  2. A 1 0 1
  3. B 1 0 0
  4. C 0 0 0

同样的事情,但是现在由从该状态的转换的总数加权,即,

  1. A B C
  2. A 0.5 0 0.5
  3. B 1 0 0
  4. C 0 0 0

(as有两个从状态A离开的转换).我知道markovchain包有一个功能,如果一个有一个序列,比如AAABBAAABBCC,但如果数据像我一样设置,就不会这样做.理想情况下,直接过程会很好,但如果有某种方法将数据转换为一组序列,也会工作.

erhoui1w

erhoui1w1#

一种igraph方法,因此使用Joseph的答案中的df

  1. library(igraph)
  2. g <- graph_from_data_frame(df)
  3. E(g)$weight = 1/degree(g, mode="out")[df$Time1] # get counts
  4. as_adj(g, attr = "weight", sparse=FALSE) # output weighted adjacency matrix
  5. A B C
  6. A 0.5 0 0.5
  7. B 1.0 0 0.0
  8. C 0.0 0 0.0
suzh9iv8

suzh9iv82#

这是另一个base R解决方案。

  1. df <- data.frame(Time1 = c("A","B","A"), Time2 = c("A","A","C"), stringsAsFactors = FALSE)
  2. myStates <- sort(unique(c(df$Time1, df$Time2)))
  3. lenSt <- length(myStates)
  4. currState <- match(df$Time1, myStates)
  5. nextState <- match(df$Time2, myStates)
  6. transMat <- matrix(0L, lenSt, lenSt)
  7. transMat[cbind(currState, nextState)] <- 1L
  8. transMat <- transMat/rowSums(transMat)
  9. transMat[is.na(transMat)] <- 0
  10. transMat
  11. [,1] [,2] [,3]
  12. [1,] 0.5 0 0.5
  13. [2,] 1.0 0 0.0
  14. [3,] 0.0 0 0.0
展开查看全部
az31mfrm

az31mfrm3#

当然有更好的方法。这是我在一个无聊的星期五下午用循环涂鸦。

  1. lvls <- sort(unique(unlist(df[,-1])))
  2. dat <- matrix(0, nrow= length(lvls), ncol= length(lvls))
  3. colnames(dat) <- lvls
  4. rownames(dat) <- lvls
  5. concat <- paste0(df[,2], df[,3])
  6. for (i in 1:length(lvls)) {
  7. for (j in 1:length(lvls)) {
  8. dat[i,j] <- paste0(rownames(dat)[i], colnames(dat)[j])
  9. }
  10. }
  11. dat <- matrix(sapply(dat, function(x) length(grep(x, concat))),
  12. nrow= length(lvls), ncol= length(lvls))
  13. colnames(dat) <- lvls
  14. rownames(dat) <- lvls
  15. dat
  16. ## A B C
  17. ## A 1 0 1
  18. ## B 1 0 0
  19. ## C 0 0 0
  20. dat <- dat / rowSums(dat)
  21. dat[is.na(dat)] <- 0
  22. dat
  23. ## A B C
  24. ##A 0.5 0 0.5
  25. ##B 1.0 0 0.0
  26. ##C 0.0 0 0.0
展开查看全部

相关问题