如何使用ggplot2为散点数据拟合双参数Weibull曲线
问题解答
前置疑问说明
- 关于你提到的
nls(y~127*dweibull(x,shape,scale), start=c(shape=3,scale=100))中的127:dweibull()是Weibull分布的概率密度函数,输出值的积分和为1,前面的常数是幅度缩放因子,作用是将密度值映射到你的观测指标(生物标志物水平)的实际取值范围。你的数据中生物标志物最高值约为2.27,所以对应的常数你可以先预设为2.3左右,也可以直接作为待拟合参数让模型自动计算最优值。 - 关于拟合初始值设置:双参数Weibull的初始值可以直接通过观测数据的分布规律估计:
- shape参数:如果曲线呈现先升高后降低的趋势,shape取值大于1即可,根据你的数据趋势可以初始设置为2
- scale参数:对应曲线峰值出现的x轴(天数)位置,你的数据中生物标志物峰值出现在15~35天区间,初始设置为25即可
完整实现代码
首先加载依赖包、构造样本数据:
library(ggplot2) # 构造样本数据 df <- data.frame( biomaker_level = c(1.5515,0.712,1.831,1.738,1.519,1.2145,2.2085,2.15,2.1845,2.248,2.098,2.2645,2.273,2.213,2.2515,2.245,1.894,2.265,2.2305,1.7955,1.649,1.4635,1.3775,1.008,1.44,0.1845), days = c(81,5,15,30,9,21,19,18,20,18,14,36,55,9,15,14,68,25,25,84,85,16,98,114,35,2), result = c(rep("Positive",25),"Negative") )
拟合Weibull模型:
# 幅度缩放因子a直接作为待拟合参数,无需手动计算固定值 weibull_fit <- nls(biomaker_level ~ a * dweibull(days, shape = shape, scale = scale), data = df, start = list(a = 2.3, shape = 2, scale = 25)) # 查看拟合得到的参数结果 summary(weibull_fit)
绘制最终可视化结果:
# 生成连续天数序列用于绘制平滑拟合曲线 pred_df <- data.frame(days = seq(min(df$days), max(df$days), length.out = 100)) pred_df$biomaker_level <- predict(weibull_fit, newdata = pred_df) ggplot() + # 绘制原始样本点 geom_point(data = df, aes(x = days, y = biomaker_level, color = result), size = 2) + # 绘制拟合的Weibull曲线 geom_line(data = pred_df, aes(x = days, y = biomaker_level), color = "black", linewidth = 1) + # 添加0.5的分界阈值线 geom_hline(yintercept = 0.5, linetype = "dashed", color = "red") + labs(x = "days", y = "biomaker level", color = "检测结果") + theme_bw()
内容的提问来源于stack exchange,提问作者Wing
相关产品推荐
相关产品推荐

