四参数拟合(Four-Parameter Logistic, 4PL)是一种广泛应用于生物学、药理学以及实验数据分析的非线性回归模型。它特别适用于处理具有“S型”趋势的曲线,例如ELISA实验中的标准曲线拟合。
什么是四参数拟合?
四参数拟合公式如下:
其中:
a:曲线的上限(最大值)。
d:曲线的下限(最小值)。
b:曲线的斜率(陡峭程度)。
c:半效浓度(EC50),也称为曲线的中点。
该模型的核心优势是可以精确描述许多生物实验中的非线性关系,比如浓度与信号之间的关系。
四参数拟合的应用场景
ELISA数据分析:用于绘制标准曲线,计算样品浓度。
药效学研究:分析药物的剂量-效应关系。
生物学实验:拟合细胞增殖、酶动力学等曲线。
为什么选择四参数拟合?
精准性:可以很好地拟合非线性数据,尤其是上下限不对称的情况。
普适性:适用于多种实验类型,结果具有较高的可信度。
直观性:参数清晰明了,每个参数都有明确的生物学意义。
使用示例数据查看
#
# # # 示例数据:浓度(X)和 OD 值(Y)
# 示例数据
data <- data.frame(
concentration = c(15.625, 31.250, 62.500, 125.000, 250.000, 500.000, 1000.000),
OD = c(0.1675, 0.2935, 0.4365, 1.0835, 2.0930, 3.0355, 3.5870)
)
# # head(data)
#
# # 查看数据
print(data)
2.函数拟合
# 四参数拟合模型
fit <- drm(OD ~ concentration, data = data, fct = LL.4()) # LL.4() 表示四参数 Log-Logistic 模型
fit
# 查看拟合结果
summary(fit)
3.输出拟合函数和和曲线
{
# 提取拟合的四参数
params <- coef(fit) # 提取参数
b <- params["b:(Intercept)"]; print(b) # Slope 参数
c <- params["c:(Intercept)"] # 最小值
d <- params["d:(Intercept)"] # 最大值
e <- params["e:(Intercept)"] # 半数效应浓度
# 输出拟合函数
cat("拟合的四参数方程为:\n")
cat(sprintf("Y = %.4f + (%.4f - %.4f) / (1 + (X / %.4f)^%.4f)\n", c, d, c, e, b))
# 计算 R² 值
# 根据 Residual Sum of Squares (RSS) 和 Total Sum of Squares (TSS) 来计算
fitted_values <- fitted(fit) # 模型拟合值
rss <- sum((data$OD - fitted_values)^2) # 残差平方和
tss <- sum((data$OD - mean(data$OD))^2) # 总平方和
r_squared <- 1 - (rss / tss)
cat(sprintf("拟合的 R² 值为:%.4f\n", r_squared))
cat(sprintf("Y = %.4f + (%.4f - %.4f) / (1 + (X / %.4f)^%.4f)\n", c, d, c, e, b))
# 预测新数据点,用于绘制曲线
new_data <- data.frame(concentration = seq(min(data$concentration), max(data$concentration), length.out = 100))
new_data$predicted_OD <- predict(fit, newdata = new_data)
head(new_data)
# 绘制拟合曲线和原始数据点
ggplot(data, aes(x = concentration, y = OD)) +
geom_point(color = "blue", size = 3) + # 原始数据点
geom_line(data = new_data, aes(x = concentration, y = predicted_OD), color = "red", size = 1) + # 拟合曲线
scale_x_log10() + # 对浓度轴取对数
labs(title = "四参数拟合曲线", x = "浓度", y = "OD 值") +
theme_minimal()
# 保存拟合结果到文件(可选)
}
4. 制作函数,方便后续使用
#制作函数--------
fit_4pl <- function(data) {
library(drc)
# 拟合四参数模型
fit <- drm(OD ~ concentration, data = data, fct = LL.4())
# 提取拟合参数
params <- coef(fit)
b <- params["b:(Intercept)"] # Slope 参数
c <- params["c:(Intercept)"] # 最小值
d <- params["d:(Intercept)"] # 最大值
e <- params["e:(Intercept)"] # 半数效应浓度
# 检查原始数据趋势是否递增
is_increasing <- all(diff(data$OD) > 0)
# 如果拟合方向与数据方向不一致,交换 c 和 d
if ((c > d && is_increasing) || (c < d && !is_increasing)) {
c_temp <- c
c <- d
d <- c_temp
}
# 输出拟合公式
formula <- sprintf("Y = %.4f + (%.4f - %.4f) / (1 + (X / %.4f)^%.4f)", c, d, c, e, b)
# 计算 R² 值
fitted_values <- fitted(fit)
rss <- sum((data$OD - fitted_values)^2)
tss <- sum((data$OD - mean(data$OD))^2)
r_squared <- 1 - (rss / tss)
#print( cat("拟合公式为:", fit_result$equation, "\n"))
#print( cat("拟合的 R² 为:", fit_result$R2, "\n"))
# 返回结果
list(
fit_model = fit,
equation = formula,
R2 = r_squared
)
}
使用函数
# 使用修正后的函数拟合
fit_result <- fit_4pl(data)
# 打印拟合公式
cat("拟合公式为:", fit_result$equation, "\n")
# 打印 R² 值
cat("拟合的 R² 为:", fit_result$R2, "\n")
如有不足,欢迎关注、留言