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

双宿主SI模型在R语言中实现μ、α参数动态调整的技术问询

双宿主SI模型的参数动态调整与可视化方案

问题背景

研究无恢复舱室的双宿主(雄性&雌性)流行病学SI模型,需同时调整μ(取值0-1)和α(取值0-1)两个参数,实现:

  • 生成不同参数组合下的动态模拟结果
  • 绘制3D图或相图
  • 判断种群是否消亡

已有基础代码框架如下:

# 加载所需包
library(deSolve) 
library(ggplot2)

# 定义双宿主SI模型
KModel <- function(time, state, params){
  with(as.list(c(state, params)),{
    N <- SF+IF+SM+IM
    dSF <- r*(SF+alpha*IF)-r*N*SF-BFM*(SF*IM)/N
    dIF <- (BFM*(SF*IM)/N)-r*N*IF-mu*IF
    dSM <- r*(SF+alpha*IF)-r*N*SM-BMF*(SM*IF)/N
    dIM <- (BMF*(SM*IF)/N)-r*N*IM-mu*IM
    
    return(list(c(dSF, dIF, dSM, dIM)))
  })
}

# 初始参数与状态设置
r = 0.2
BFM = 1.2
BMF = 1
mu = 0
alpha = 0

params<-c(r,BFM,BMF,mu,alpha)
initial_state<-c(SF=0.49 ,IF=0.01, SM=0.49,IM=0.01)
times<-0:60

# 数值求解
out1<-ode(y=initial_state, times=times, func=KModel, parms=params, method="ode23")
out<-as.data.frame(out1)
plot(out1)

实现方案

1. 批量遍历μ和α参数组合

生成参数网格,批量运行模型并存储所有结果:

# 生成μ和α的参数网格(步长可自定义,示例用0.1)
mu_vals <- seq(0, 1, by = 0.1)
alpha_vals <- seq(0, 1, by = 0.1)
param_grid <- expand.grid(mu = mu_vals, alpha = alpha_vals)

# 定义单组参数的模型运行函数
run_model <- function(mu, alpha) {
  params <- c(r = r, BFM = BFM, BMF = BMF, mu = mu, alpha = alpha)
  out <- ode(y = initial_state, times = times, func = KModel, parms = params, method = "ode23")
  as.data.frame(out) |>
    mutate(mu = mu, alpha = alpha) # 标记当前参数组合
}

# 批量运行所有参数组合(用purrr简化循环)
library(purrr)
all_results <- pmap_dfr(param_grid, run_model)

2. 动态结果可视化

用分面图展示不同μ和α组合下的种群动态变化:

ggplot(all_results, aes(x = time)) +
  geom_line(aes(y = SF, color = "易感雌性")) +
  geom_line(aes(y = IF, color = "感染雌性")) +
  geom_line(aes(y = SM, color = "易感雄性")) +
  geom_line(aes(y = IM, color = "感染雄性")) +
  facet_grid(mu ~ alpha) + # 按μ行、α列分面展示
  labs(x = "时间", y = "种群比例", color = "种群类型") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

3. 3D参数扫描图(直观判断种群消亡)

以μ和α为坐标轴,最终总种群数量为高度,绘制交互式3D图:

# 提取每个参数组合的最终时刻总种群数量
final_results <- all_results |>
  filter(time == max(times)) |>
  mutate(total_pop = SF + IF + SM + IM)

# 用plotly绘制交互式3D曲面图
library(plotly)
plot_ly(final_results, x = ~mu, y = ~alpha, z = ~total_pop, 
        type = "surface", colors = "viridis") |>
  layout(scene = list(xaxis = list(title = "μ"), 
                      yaxis = list(title = "α"), 
                      zaxis = list(title = "最终总种群比例")))

4. 相图分析(单参数组合下的相空间)

选择特定μ和α值,绘制感染雌性与感染雄性的相轨迹:

# 指定目标参数组合
target_mu <- 0.3
target_alpha <- 0.5
params_target <- c(r = r, BFM = BFM, BMF = BMF, mu = target_mu, alpha = target_alpha)
out_target <- ode(y = initial_state, times = times, func = KModel, parms = params_target, method = "ode23")
out_target_df <- as.data.frame(out_target)

# 绘制IF vs IM的相图
ggplot(out_target_df, aes(x = IF, y = IM)) +
  geom_path(color = "blue", linewidth = 1) +
  geom_point(aes(x = IF[1], y = IM[1]), color = "red", size = 3) +
  labs(x = "感染雌性比例", y = "感染雄性比例", 
       title = paste0("相图 (μ=", target_mu, ", α=", target_alpha, ")")) +
  theme_bw()

5. 种群消亡判断与可视化

设定消亡阈值,筛选并可视化导致种群消亡的参数区域:

# 设定种群消亡阈值(示例:总种群比例<0.01)
extinction_threshold <- 0.01

# 筛选消亡参数组合
extinction_params <- final_results |>
  filter(total_pop < extinction_threshold) |>
  select(mu, alpha, total_pop)

# 输出消亡参数
cat("导致种群消亡的μ和α组合:\n")
print(extinction_params)

# 热图可视化消亡区域
ggplot(final_results, aes(x = mu, y = alpha, fill = total_pop < extinction_threshold)) +
  geom_tile() +
  scale_fill_manual(values = c("FALSE" = "white", "TRUE" = "darkred"), 
                    labels = c("种群存活", "种群消亡")) +
  labs(x = "μ", y = "α", fill = "种群状态") +
  theme_bw()

内容的提问来源于stack exchange,提问作者Sprawk48

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:40:39