首页 > 解决方案 > 每个索引时间间隔创建转换矩阵

问题描述

我有一个关于特定时间间隔内状态(总共 9 个)之间用户转换的数据集。该数据集将用于马尔可夫链模型。总共有 96 个时间间隔,因此:对于每个用户,有 96 个观测值,每个观测值都提供指定的时间间隔、开始位置和结束位置。结合两个位置的状态仅仅意味着用户仍在两个状态之间转换。

下面是一个虚构的数据集。在此示例中,与实际数据集不同,开始和结束位置不一定是关联的,但我相信这可以很好地说明问题。

ID <- rep(1:10, each = 96)
TimeInterval <- rep(1:96, 10)
Locations <- c("Home", "Bakery", "Grocery", "Home-Bakery", "Home-Grocery", "Bakery-Home", "Bakery-Grocery", "Grocery-Home", "Grocery-Bakery")
startLocation <- sample(Locations, 960, replace = TRUE)
endLocation <- sample(Locations, 960, replace = TRUE)
df <- data.frame(ID, TimeInterval, startLocation, endLocation)

我想为每个时间间隔计算一个转换矩阵,其中转换概率是通过转换到给定前一个时间间隔的状态/位置的状态/位置的概率来计算的。例如,为了计算 TimeInterval 37 的转移概率矩阵,在给定 TimeInterval 36 中的状态的情况下,采用 TimeInterval 37 中处于某个状态的概率。

这将产生总共 96 个转换矩阵。然后,在给定特定时间范围内,从一种状态(位置)转换到另一种状态的概率取决于所有用户组合的概率。

但是,我不知道如何汇总各个转换的结果。计算这些矩阵的有效方法是什么?

每个时间间隔的转移矩阵应该是一个包含所有状态的 9x9 矩阵。

编辑:

适用于单个转换矩阵的(非常丑陋的)dplyr 解决方案:

Interval36 <- df %>% filter(TimeInterval== 36)
Interval37 <- df %> filter(TimeInterval == 37)

timeBlock37 <- as.data.frame(cbind(Interval37$journey, Interval36$journey))
mTimeBlock37 <- as.data.frame.matrix(table(timeBlock37))
timeBlock <- prop.table(mTimeBlock37 )
timeBlock

标签: rmatrixtransitionprobability

解决方案


我自己解决了这个问题,虽然不是以最优雅的方式使用非常非结构化的 for 循环。

matrixList <- list()
states <- Locations
for(i in 1:96){
  i <- ifelse(i < 96,i + 1, 96)
  t1 <- df %>% filter(timeBlock == i)
  j <- ifelse(i < 96,i + 1, 96)
  t2 <- df%>% filter(timeBlock == j)


  timeBlock <- as.data.frame(cbind(t1[,8], t2[,8]))
  mTime <- as.data.frame.matrix(table(timeBlock))
  timeBlock <- prop.table(mTime)
  timeBlock <- as.matrix(timeBlock)

  mat1 <- matrix(0, nrow = 9, ncol = 9)
  colnames(mat1) <- states
  rownames(mat1) <- states

  colsNeeded <- colnames(mat1)[colnames(mat1) %in% colnames(timeBlock)]
  rowsNeeded <- rownames(mat1)[rownames(mat1) %in% rownames(timeBlock)]
  mat1[rowsNeeded, colsNeeded] <- timeBlock[rowsNeeded, colsNeeded] 
  matrixList[[i]] <- mat1

}

我在 for 循环中创建了一个空矩阵,该矩阵可以填充转换矩阵,以考虑并非所有状态都会在特定时间范围内出现的情况。

如果有人仍然有更优雅/更清洁的解决方案,请随时为未来的读者做出贡献。


推荐阅读