如何基于生存数据使用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
相关产品推荐
相关产品推荐

