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

如何基于生存数据使用R的drc包绘制死亡率剂量反应曲线

剂量反应曲线实现方案

1. 加载所需依赖包

library(drc)
library(ggplot2)
library(dplyr)

2. 读取并预处理数据

你的原始数据结构无需调整,单条记录对应单只蜂鸟的状态是标准的原始数据存储格式,后续分析非常方便。
首先读取数据,再按平行组+浓度分组计算百分比死亡率:

# 读取示例数据
df <- read.table("https://pastebin.com/raw/TZdjp2JX", header=T)

# 分组计算每个平行组的死亡率
df_processed <- df %>%
  group_by(room, concentration) %>%
  summarise(
    dead = sum(status == 0), # 统计每组死亡个体数
    total = n(), # 统计每组总个体数
    mortality = dead / total * 100, # 计算百分比死亡率
    .groups = "drop"
  )

3. 拟合剂量反应模型

采用你提到的三参数对数逻辑模型LL.3()拟合:

model <- drm(mortality ~ concentration, data = df_processed, fct = LL.3())
# 执行summary(model)可查看模型拟合的详细参数结果

你之前不理解的ryegrass示例代码逻辑统一说明:

  • 生成连续浓度梯度是为了绘制平滑的拟合曲线,避免用原始离散浓度点连线出现折角
  • predict步骤是为了得到每个连续浓度对应的预测值和置信区间上下限
  • 对0浓度做偏移是为了适配对数X轴(对数轴无法展示0值),如果你的X轴不需要做对数转换可以跳过该步骤

4. 生成预测数据用于绘图

# 生成连续的浓度梯度,覆盖你的实验浓度范围0-3
newdata <- data.frame(concentration = seq(0, 3, length.out = 100))
# 预测对应浓度的死亡率和95%置信区间
pred_res <- predict(model, newdata = newdata, interval = "confidence")
# 合并预测结果
newdata$pred_mort <- pred_res[,1]
newdata$lower <- pred_res[,2]
newdata$upper <- pred_res[,3]

5. 绘制目标剂量反应曲线

ggplot() +
  # 绘制原始观测点:每个点对应一个平行组的实测死亡率
  geom_point(data = df_processed, aes(x = concentration, y = mortality), size = 2) +
  # 绘制置信区间灰色阴影
  geom_ribbon(data = newdata, aes(x = concentration, y = pred_mort, ymin = lower, ymax = upper), alpha = 0.2, fill = "gray") +
  # 绘制拟合曲线
  geom_line(data = newdata, aes(x = concentration, y = pred_mort), linewidth = 1) +
  # 固定Y轴范围为0-100%
  ylim(0, 100) +
  # 自定义坐标轴标签
  labs(x = "糖浓度", y = "死亡率(%)") +
  theme_bw()

如果需要X轴做对数转换,只需在上述绘图代码中加上+ coord_trans(x="log"),同时提前将数据中浓度为0的值替换为极小值(比如0.1)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:45:05