R中带患者进出的四状态马尔可夫链循环模拟修改需求
R语言四状态马尔可夫链患者模拟代码修改方案
核心修改逻辑
针对需求,我们需要在每次迭代的起始阶段完成两个关键操作:
- 用
rpois(1, lambda = 10)生成随机数量的新患者,全部加入状态1 - 移除当前所有处于状态4的患者
以下是修改后的完整代码,保留原有的100次迭代、100初始患者、1000次重复模拟的核心设定,仅调整循环内的前置逻辑:
# 定义四状态转移矩阵(示例矩阵,可根据实际需求替换) transition_matrix <- matrix(c( 0.7, 0.2, 0.1, 0.0, # 状态1转移概率 0.1, 0.6, 0.2, 0.1, # 状态2转移概率 0.0, 0.1, 0.5, 0.4, # 状态3转移概率 0.0, 0.0, 0.0, 1.0 # 状态4为吸收态,此处修改后会被移除,不影响迭代 ), nrow = 4, byrow = TRUE) # 模拟参数设置 n_iterations <- 100 n_initial_patients <- 100 n_simulations <- 1000 # 存储每次模拟各状态的患者数量 results <- array(0, dim = c(n_simulations, n_iterations, 4)) # 重复模拟循环 for (sim in 1:n_simulations) { # 初始化患者状态:全部从状态1开始 current_states <- rep(1, n_initial_patients) for (iter in 1:n_iterations) { # --- 新增:迭代开始时的操作 --- # 生成新患者并加入状态1 new_patients <- rpois(1, lambda = 10) current_states <- c(current_states, rep(1, new_patients)) # 移除所有处于状态4的患者 current_states <- current_states[current_states != 4] # ------------------------------ # 统计当前各状态患者数量 state_counts <- table(factor(current_states, levels = 1:4)) results[sim, iter, ] <- as.numeric(state_counts) # 执行马尔可夫状态转移 if (length(current_states) > 0) { current_states <- sapply(current_states, function(s) { sample(1:4, size = 1, prob = transition_matrix[s, ]) }) } } } # 可视化结果:各状态患者数量的均值变化 library(ggplot2) library(reshape2) # 计算各迭代步的状态均值 mean_results <- apply(results, c(2,3), mean) mean_df <- melt(mean_results) colnames(mean_df) <- c("Iteration", "State", "Mean_Patients") ggplot(mean_df, aes(x = Iteration, y = Mean_Patients, color = factor(State))) + geom_line(linewidth = 1) + labs(title = "四状态马尔可夫链患者模拟均值变化", x = "迭代次数", y = "平均患者数量", color = "状态") + theme_minimal()
关键修改说明
- 迭代前置操作:在每个
iter循环的最开头,先完成新患者添加和状态4患者移除,确保后续的状态转移是基于更新后的患者群体 - 状态4处理:由于状态4患者会被直接移除,转移矩阵中状态4的概率设置不影响模拟逻辑(即使设为吸收态也会被清除)
- 空群体判断:加入
if (length(current_states) > 0)的判断,避免当所有患者都被移除后出现转移错误 - 结果统计:用
factor(current_states, levels = 1:4)确保即使某状态没有患者,也能统计到0值,保证结果数组的维度一致性
内容的提问来源于stack exchange,提问作者farrow90
相关产品推荐
相关产品推荐

