You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:35:02