我正在尝试根据不同患者的医生就诊顺序创建马尔可夫转移矩阵。在我的马尔可夫模型中,状态是不同的医生,联系是患者的就诊。患者可以留在同一家提供者处,也可以在下次就诊时转至另一家提供者处。使用该信息我需要创建一个转换矩阵。
这是Excel中的部分数据。数据包括对近 100 个不同提供商的超过 30K 次访问。
这是Excel中的部分数据。 data
如何使用此 Excel 数据(或 csv)并创建马尔可夫转移矩阵作为访问次数,例如: ....
我需要的矩阵如下所示:
如何使用 R 将数据转换为转换矩阵?
我对 R 还很陌生,确实需要帮助。
谢谢
最佳答案
这是一种适用于您的示例数据的方法。
我将使用 readxl
获取数据并使用 data.table
来操作它。
读取数据:
library(readxl)
library(data.table)
data <- setDT(read_excel("~/Desktop/Book2.xlsx"))[!is.na(PatId)]
#read_excel doesn't have the option to specify integers... silly...
data[ , (names(data)) := lapply(.SD, as.integer)]
预分配转换矩阵:
provs <- data[ , sort(unique(SeenByProv))]
nprov <- length(provs)
markov <- matrix(nrow = nprov, ncol = nprov,
dimnames = list(provs, provs))
逐行分配
for (pr in provs){
markov[as.character(pr), ] <-
data[ , {nxt <- SeenByProv[which(SeenByProv == pr) + 1L]
.(prov = provs, count =
sapply(provs, function(pr2) sum(nxt == pr2, na.rm = TRUE)))}, by = PatId
][, sum(count), by = prov]$V1
}
这可能在某些地方可以加快速度,但它确实有效。
关于r - 来自不同患者就诊序列的马尔可夫转移矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34519137/