使用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
相关产品推荐
相关产品推荐

