【问题标题】:Creating transition matrix per indexed Time interval每个索引时间间隔创建转换矩阵
【发布时间】:2020-09-22 03:35:13
【问题描述】:

我有一个关于用户在特定时间间隔内(总共 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

【问题讨论】:

    标签: r matrix transition probability


    【解决方案1】:

    我自己解决了这个问题,虽然不是以最优雅的方式使用相当非结构化的 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 循环中创建了一个空矩阵,可以用转换矩阵填充该矩阵,以考虑并非所有状态都会在特定时间范围内出现的情况。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      相关资源
      最近更新 更多