R语言疾病建模:种群矩阵初始化与动态更新技术咨询
R语言疾病建模种群矩阵构建方案
是否需要Leslie矩阵?
不需要。Leslie矩阵核心是通过年龄特异性生育率、存活率模拟种群数量的年龄结构动态,而你的需求核心是维护感染状态的年龄分布,以及简单的年龄增长(个体增龄、50岁退出、新增5岁组),用R基础的矩阵/数据框操作就能实现,无需引入Leslie矩阵。如果后续需要加入生育率、非50岁强制退出的死亡率这类种群数量动态机制,再考虑结合Leslie矩阵即可。
着手步骤与代码示例
第一步:明确数据结构
推荐用数据框(比矩阵更直观,新手易操作)存储个体信息,包含两列:
age:个体年龄(5-50岁)infected:感染状态(0=未感染,1=感染)
如果必须用矩阵,后续可将数据框转为one-hot编码格式。
第二步:构建初始种群
需满足:总个体数10000、总感染率10%(1000个感染者)、每个年龄组至少1个感染者。
# 设置随机种子,保证结果可复现 set.seed(123) # 1. 创建初始种群数据框 total_individuals <- 10000 ages <- sample(5:50, total_individuals, replace = TRUE) pop_df <- data.frame(age = ages, infected = 0) # 2. 确保每个年龄组至少1个感染者 unique_ages <- 5:50 for (a in unique_ages) { first_idx <- which(pop_df$age == a)[1] pop_df$infected[first_idx] <- 1 } # 3. 分配剩余感染者(总感染数1000,已分配46个) remaining_infected <- 1000 - length(unique_ages) non_infected_idx <- which(pop_df$infected == 0) selected_idx <- sample(non_infected_idx, remaining_infected) pop_df$infected[selected_idx] <- 1 # 验证结果 cat("总感染率:", mean(pop_df$infected), "\n") # 检查每个年龄组是否至少1个感染者 all(table(pop_df$age, pop_df$infected)[,2] >= 1)
第三步:年度种群更新
每年执行3个操作:个体增龄、移除50岁增龄后的个体、新增带随机感染状态的5岁个体(数量波动)。
# 定义年度更新函数 update_population <- function(current_pop) { # 1. 个体增龄 current_pop$age <- current_pop$age + 1 # 2. 移除增龄后51岁的个体(原50岁个体退出) current_pop <- current_pop[current_pop$age <= 50, ] # 3. 新增5岁个体:数量为当前种群数的8%-12%随机波动 current_size <- nrow(current_pop) new_individuals_num <- round(current_size * runif(1, 0.08, 0.12)) # 按10%感染率分配状态 new_infected <- sample(c(0,1), new_individuals_num, replace = TRUE, prob = c(0.9, 0.1)) new_pop <- data.frame(age = rep(5, new_individuals_num), infected = new_infected) # 合并新旧种群 updated_pop <- rbind(current_pop, new_pop) return(updated_pop) } # 执行一次年度更新 updated_pop <- update_population(pop_df) # 验证更新结果 cat("更新后种群规模:", nrow(updated_pop), "\n") cat("更新后感染率:", mean(updated_pop$infected), "\n")
第四步:转为指定矩阵格式(可选)
如果必须用10000行×46列的矩阵(列对应5-50岁),可将数据框转为one-hot编码矩阵,每个元素代表对应年龄组个体的感染状态:
age_groups <- 5:50 pop_matrix <- matrix(0, nrow = nrow(pop_df), ncol = length(age_groups)) colnames(pop_matrix) <- age_groups for (i in 1:nrow(pop_df)) { col_idx <- which(colnames(pop_matrix) == as.character(pop_df$age[i])) pop_matrix[i, col_idx] <- pop_df$infected[i] } # 查看矩阵前5行 head(pop_matrix)
内容的提问来源于stack exchange,提问作者Katy Baker
相关产品推荐
相关产品推荐

