r - 每个索引时间间隔创建转换矩阵
问题描述
我有一个关于特定时间间隔内状态(总共 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
解决方案
我自己解决了这个问题,虽然不是以最优雅的方式使用非常非结构化的 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 循环中创建了一个空矩阵,该矩阵可以填充转换矩阵,以考虑并非所有状态都会在特定时间范围内出现的情况。
如果有人仍然有更优雅/更清洁的解决方案,请随时为未来的读者做出贡献。
推荐阅读
- python - 使用 .format() 语法的区域感知字符串格式化
- python-3.x - 如何在特定时间范围内获取字典或数据集?
- time - 如何根据输入设置中断
- java - 如果不打算保留该字段(@Transient 等),是否可以在 JPA 实体中拥有一个公共最终实例字段?
- javascript - 如何从自定义反应钩子中丰富数据
- php - 如何在递归中增加深度变量?它一直在重置
- javascript - 如何制作水平打印的for循环
- html - 在 CSS 中键入动画不起作用(在动画开始之前显示文本)
- vb.net - NX中的SKETCH(1:1B)是什么意思?
- azure-aks - 并发 AzureML REST 请求失败,服务请求过多(过载)