lifelines 生存数据生成指南:3 步构建你的模拟数据集

📅 2026/8/23 13:35:26
lifelines 生存数据生成指南:3 步构建你的模拟数据集
lifelines 生存数据生成指南3 步构建你的模拟数据集【免费下载链接】lifelinesSurvival analysis in Python项目地址: https://gitcode.com/gh_mirrors/li/lifelines真实生存数据获取贵、采集慢还受隐私限制。lifelines 数据生成模块 generate_datasets 让你几分钟造出带协变量、带截尾的合成生存数据。按这篇指南你 30 秒跑通最小示例再用三步流水线定制自己的模拟生存数据集。快速上手一个能跑的最小示例先说结论指数分布是最简单的起点没有协变量跑起来也最快。import numpy as np from lifelines.generate_datasets import exponential_survival_data np.random.seed(123) # 固定种子让结果可复现 times, events exponential_survival_data( n1000, # 样本量 cr0.2, # 截尾Censoring比例约两成样本只被看到一半 scale5.0 # 指数分布尺度参数越大存活越久 ) print(times[:5], events[:5]) # 看一眼前 5 个样本times 是观测时间被截尾的样本会停在截尾时刻events 是布尔标记True 表示事件发生False 表示截尾。把这两列交给 KaplanMeierFitter就能直接画出生存曲线。三步流水线数据生成背后的逻辑跑通之后你可能会问带协变量的数据是怎么造出来的整条链路是「协变量 → 风险率 → 生存时间」三步。第一步协变量。generate_covariates(n, d, n_binary, p)生成 (n, d1) 矩阵连续列服从指数分布二值列是 0/1最后一列全为 1留给截距项。第二步风险率。generate_hazard_rates把协变量和系数相乘得到每个个体在每个时刻的风险率。这里给两个直觉生存函数 S(t) 回答活过 t 时刻的概率它随时间单调下降风险函数 h(t) 回答此刻事件发生的瞬时速率。两者的关系是 S(t) exp(−∫h(u)du)累积风险越大存活概率越低。第三步生存时间。generate_random_lifetimes对累积风险做反演抽出每个人的事件时间。这里有个容易忽略的点真实随访里总有人到期末还没发生事件。给模拟叠加截尾Censoring就是在模拟这件事——超过截尾时刻的样本只记录到该时刻事件标记改为 False。核心函数速查六个函数覆盖从简单到定制的全部需求先记住名字和分工函数用途关键参数exponential_survival_data生成指数分布生存数据带截尾n样本量cr截尾比例piecewise_exponential_survival_data生成风险率分段的生存数据无截尾breakpoints变点lambdas各段风险率generate_covariates生成连续二值协变量矩阵d协变量数n_binary二值列数generate_hazard_rates由协变量算出每个个体的风险率model取 cox/aalenconstant系数是否恒定generate_random_lifetimes从风险率反演生存时间可选截尾censor截尾开关或截尾时刻generate_observational_matrix一站式生成协变量事件时间矩阵无截尾model取 cox/aalentimelines时间轴最常用的就是中间三步串起来就是完整调用链import numpy as np from lifelines.generate_datasets import generate_hazard_rates, generate_random_lifetimes timelines np.linspace(0, 100, 1000) # 观测时间轴0 到 100 共 1000 个点 hazard_rates, coefs, covariates generate_hazard_rates( n1000, d5, timelinestimelines, modelcox # 比例风险模型Cox PH ) times, observed generate_random_lifetimes( hazard_rates, timelines, censorTrue # 叠加均匀截尾 ) print(times.shape, observed.mean()) # 数据形状与事件发生率modelcox表示比例风险模型Cox PH风险比不随时间变换成aalen则是加法风险模型系数可以随时间漂移。进阶让模拟数据更贴近真实场景真实场景里协变量的分布和组间差异才是数据像不像的关键。模拟 SaaS 客户流失数据import numpy as np from lifelines.generate_datasets import generate_covariates np.random.seed(42) # 固定种子保证每次结果一致 # 2 个二值列模拟套餐等级、是否企业客户 x generate_covariates(n1000, d6, n_binary2, p0.3)连续列由指数分布生成可当作使用频率、接口调用量这类特征n_binary2把两列换成 0/1p0.3控制高级套餐这类少数派占比。后面接generate_random_lifetimes时把censor设成一个具体时刻让约两成客户在观测期末仍在用模拟还没流失。模拟医疗随访数据import numpy as np age np.random.normal(55, 12, size1000).clip(30) # 年龄均值55、标准差12截到30以上 treat np.random.binomial(1, 0.5, size1000) # 治疗组/对照组各占一半 hz np.exp(0.04 * (age - 55) / 12) * np.where(treat, 0.6, 1.0)年龄取正态(55, 12) 再 clip 到 30 以上贴合成人随访队列的常识。np.where给治疗组风险打六折相当于风险比HR约 0.6模拟治疗有效对照组保持 1.0。参数怎么选避免踩坑这 5 个参数最容易在第一次模拟时翻车参数推荐值注意事项n≥ 1000太小曲线跳动剧烈估计不稳太大模拟变慢d3–8维度太高容易过拟合系数也难以解释cr0.1–0.3截尾比例过高会让事件变少参数方差变大modelcox 或 aalen相信比例风险用 cox系数随时间变用 aalenbreakpoints/lambdas2–3 个变点lambdas必须比breakpoints多 1 段该函数不产生截尾还有一个隐藏坑cr只作用于exponential_survival_data其他函数要传censor参数来控制截尾。总结与下一步你手里现在有一条完整的 Python 生存分析数据生成链路协变量 → 风险率 → 生存时间外加两个分布类的快捷函数。调好n、d、cr这几个旋钮就能造出覆盖流失、随访等场景的自定义生存数据集。想看内部怎么抽样直接翻源码比读文档更快。git clone https://gitcode.com/gh_mirrors/li/lifelines源码入口lifelines.generate_datasets 模块跑通第一个模拟数据集之后你会发现自己离能用的生存模型只差一张图。【免费下载链接】lifelinesSurvival analysis in Python项目地址: https://gitcode.com/gh_mirrors/li/lifelines创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考