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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:24:03