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

使用R语言drm()绘制量效曲线时EC50标注异常问题求助

解决量效曲线EC50标注线位置错误问题

问题根源

你的代码存在几个关键问题导致EC50标注线无法正确对应曲线:

  • 未从拟合模型中提取真实的EC50参数,直接使用了未定义的ec50变量
  • EC50对应的Y轴数值错误:你用了0.5,但实际Y轴是存活率百分比,EC50对应的是半最大效应的百分比数值,而非0-1的小数
  • 代码存在拼写错误:scale_x_log10中的ata$concentration应为data$concentration

修复步骤与完整代码

1. 提取模型参数

从curve_fit中提取EC50以及对应的半效应Y值:

# 提取模型拟合参数
model_params <- coef(curve_fit)
ec50 <- model_params["ec_50"]
# 计算半效应对应的Y值(存活率百分比)
half_effect <- (model_params["max_value"] + model_params["min_value"]) / 2

2. 修正高亮线数据框

使用真实的EC50和半效应Y值构建高亮线:

lines_to_highlight_ec50 <- tribble(
  ~x,    ~xend, ~y,          ~yend,
  ec50,  ec50,  -Inf,        half_effect,  # 从Y轴底部到曲线交点的垂直线
  0,     ec50,  half_effect, half_effect   # 从Y轴到垂直线的水平线
)

3. 修正绘图代码中的拼写错误与标注位置

调整标注文本的Y坐标为半效应值,并修正scale_x_log10中的拼写错误。


完整修正后的绘图代码

# 提取模型参数
model_params <- coef(curve_fit)
ec50 <- model_params["ec_50"]
half_effect <- (model_params["max_value"] + model_params["min_value"]) / 2

# 构建EC50高亮线数据
lines_to_highlight_ec50 <- tribble(
  ~x,    ~xend, ~y,          ~yend,
  ec50,  ec50,  -Inf,        half_effect,
  0,     ec50,  half_effect, half_effect
)

p <- ggplot() +
  geom_segment(
    data = lines_to_highlight_ec50,
    aes(x = x, y = y, xend = xend, yend = yend),
    color = 'grey', linetype = 'dashed', size = 1
  ) +
  geom_line(data = data_predicted, aes(x = concentration, y = predicted), size = 1) +
  geom_point(
    data = data,
    aes(x = concentration, y = survival, fill = replicate),
    shape = 21, size = 3, color = 'white', show.legend = FALSE
  ) +
  annotate(
    'text', x = 0.01, y = half_effect, 
    label = paste0('EC50: ', round(ec50, digits = 3), ' mg/L'),
    hjust = 0, vjust = -1
  ) +
  scale_x_log10(name = 'Measured Lithium (mg/L)', breaks = unique(data$concentration)) +
  scale_y_continuous(name = 'Survival (%)') +
  theme_bw()

ggsave('dose_response_curve.png', p, height = 4, width = 6)
p

额外说明

  • 你的数据中空白组存活率在24-31%之间,高浓度组存活率为0,因此拟合出的EC50对应的半效应值约为15%左右,而非50%——这是因为你的量效曲线是存活率随浓度升高而降低的抑制型曲线,EC50指的是存活率下降到半最大值时的浓度。
  • 如果需要强制以50%作为EC50的Y参考点(尽管不符合你的数据趋势),可以将half_effect替换为50,但这会与实际曲线不匹配,不建议这么做。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:34:59