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

如何用R绘制Sigmoid曲线并从药物浓度数据拟合方程、获取R²值

用R拟合药物浓度相关的Sigmoid曲线方案

针对你的药物浓度-响应数据,下面提供两种可靠的实现方法,包含拟合模型、获取方程及R²值、绘制美观曲线的完整步骤:

1. 推荐方案:使用drc包(专业剂量反应拟合)

drc是专门用于剂量-反应曲线分析的R包,内置成熟的Sigmoid模型,拟合稳定性高,尤其适合小样本数据。

步骤1:准备数据

先将原始数据整理为数据框,方便后续处理:

# 构建数据框
drug_data <- data.frame(
  conc = c(0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30),  # 药物浓度(μM)
  response = c(97.01, 98.43, 98.29, 97.66, 96.51, 88.39, 38.54, 2.63)  # 响应值(%)
)

步骤2:拟合Sigmoid模型

安装并加载包后,用drm()函数拟合四参数逻辑斯蒂Sigmoid模型(最常用的药物抑制曲线模型):

# 安装包(首次使用时运行)
install.packages("drc")
library(drc)

# 拟合四参数Sigmoid模型
sig_model <- drm(response ~ conc, data = drug_data, fct = LL.4())

该模型的方程形式为:
$$f(x) = d + \frac{c - d}{1 + e^{b(\log(x) - \log(e))}}$$
参数说明:

  • c:响应渐近下限
  • d:响应渐近上限
  • b:曲线斜率(绝对值越大,曲线越陡)
  • e:半数效应浓度(EC₅₀,即响应达到(c+d)/2时的药物浓度)

步骤3:获取模型方程及R²值

运行以下代码查看拟合参数,计算并输出R²:

# 查看模型拟合参数
summary(sig_model)

# 计算R平方值(drc包默认不输出,用残差偏差法计算)
r_squared <- 1 - deviance(sig_model)/deviance(lm(response ~ 1, data = drug_data))
cat("模型R平方值:", round(r_squared, 4), "\n")

步骤4:绘制美观的拟合曲线

用ggplot2绘制带对数刻度的清晰曲线(药物浓度通常用对数轴呈现更直观):

# 安装并加载ggplot2(首次使用时运行)
install.packages("ggplot2")
library(ggplot2)

# 生成拟合曲线的预测数据
new_conc <- seq(min(drug_data$conc), max(drug_data$conc), length.out = 100)
predicted <- predict(sig_model, newdata = data.frame(conc = new_conc))
pred_df <- data.frame(conc = new_conc, response = predicted)

# 绘图
ggplot(drug_data, aes(x = conc, y = response)) +
  geom_point(size = 3, color = "#2c3e50", shape = 16) +  # 原始数据点
  geom_line(data = pred_df, aes(y = response), color = "#e74c3c", linewidth = 1.2) +  # 拟合曲线
  scale_x_log10(breaks = drug_data$conc, labels = drug_data$conc) +  # 对数刻度x轴
  labs(x = "药物浓度 (μM)", y = "响应值 (%)", title = "药物浓度-响应Sigmoid拟合曲线") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))

2. 备选方案:用nls手动拟合基础Sigmoid模型

如果不想依赖专业包,可使用R内置的nls()函数拟合三参数Sigmoid模型,注意初始值设置要合理(否则可能拟合失败):

# 拟合三参数Sigmoid模型:y = a / (1 + exp(-b(log(x) - c)))
sig_nls <- nls(response ~ a / (1 + exp(-b(log(conc) - c))), 
               data = drug_data,
               start = list(a = 100, b = -1, c = log(10)))  # 初始值需贴合数据趋势

# 查看拟合结果
summary(sig_nls)

# 计算R平方值
r_squared_nls <- 1 - deviance(sig_nls)/deviance(lm(response ~ 1, data = drug_data))
cat("手动拟合模型R平方值:", round(r_squared_nls, 4), "\n")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:40:25