文章目录
前言
http://www.sthda.com/ 是个好网站,Clinical Statistics: Introducing Clinical Trials, Survival Analysis, and Longitudinal Data Analysis 是本好书。
提示:
一、基础概念
Survival time and event(生存时间或事件)
常见的event:Relapse(复发),Progression,Death。
Censoring (删失)生存分析主要产生censoring或者drop out的原因是回访时间点,event没有发生,这种情况被称为right-censored,这种情况会导致censored survival times(截尾时间)偏短,我们可能会得到一个低估的数据。
Survival function and hazard function (生存函数和风险函数)用来衡量survial的表现形式和预测手段。
1、解读 Survival function
The survival function 生存函数
S ( t ) S(t) S(t)
通俗的解释,就是某病人活到时间点 t 的概率。假如病人在大写T的时间点,没有出现Event。此病人活过t时间点的概率。假定 F(t) 是病人没有活过时间点的概率,那么
S ( t ) = 1 − F ( t ) = P ( T > t ) S(t) = 1-F (t)=P (T>t) S(t)=1−F(t)=P(T>t)
生存函数,换言之,就等于时间点大写T(大T应该大于等于0的随机变量)大于某个时间点小写t。
生存函数是一个分布函数,我们求一个概率密度函数。
S ( t ) = P ( T > t ) = ∫ t ∞ f ( x ) d x = 1 − F ( t ) S(t) = P (T>t)=\int_{t}^{\infty} \ f(x)\, dx= 1-F (t) S(t)=P(T>t)=∫t∞ f(x)dx=1−F(t)
2、解读 Hazard function
The hazard function 风险函数
h ( t ) h(t) h(t)
这是一个描述“瞬间死亡率”的函数,具体指观察对象,在生存到t 时刻的瞬时死亡率。区别于S (t) 生存函数表示超过某时间点t1 概率,风险函数描述在时间点t2 ,观察对象的死亡率。
那么,这个瞬间是什么,就是
T < t + d t ∣ T > t T<t+dt |T>t T<t+dt∣T>t
这表示,病人在 T > t 的基础上,也就是在时间t,EVENT没有发生。下一个瞬间t+dt马上就发生。
那么这个概率,就等于
P ( T < t + d t ∣ T > t ) = P ( t < T < t + d t ) P ( T > t ) = f ( t ) d t S ( t ) = h ( t ) d t P(T<t+dt |T>t)=\cfrac {P(t<T<t+dt )}{ P (T>t)} =\cfrac {f(t)dt }{ S(t)} =h(t) dt P(T<t+dt∣T>t)=P(T>t)P(t<T<t+dt)=S(t)f(t)dt=h(t)dt
把最后两项的dt出掉,就得到了我们熟悉的。
f ( t ) S ( t ) = h ( t ) \cfrac {f(t)}{ S(t)} =h(t) S(t)f(t)=h(t)
h(t) 既不是概率密度,也不是累积分布。
3、解读 Kaplan-Meier survival estimate
KM方法是用来估计S (t)的,因为各种各样的原因,实际情况很难准确计算S (t)。
S ( t ) = ∏ i : t i < = t ( 1 − d i n i ) S (t) =\prod_ {i: t_i <= t}( 1- \cfrac {d_i }{n_i} ) S(t)=i:ti<=t∏(1−nidi)
ti 是样本中,每个数据的记录时间,可以肯定的事ti 是离散的,S(t)也必然是离散的。
di 是在ti这个时间点,死亡(event 发生)的人数。
ni 在这个时间点,取出删失后的生存人数。也就是减去删失的,上一个时间点死亡的人数。
可以预见的,在ti 与 ti+1 这个时间段中的t,S (t) 是一个固定值,因为ti是一个离散的数据,所以KM曲线会表现为台阶形。
二、用R来实现
这部分,参考http://www.sthda.com/english/wiki/survival-analysis-basics。
1、K-M 曲线可视化
生存分析的R包,用survial,survminer就可以了
#install.packages(c("survival", "survminer"))
library("survival")
library("survminer")、
data <- lung
# data("lung") 已经不适合这个版本了
包里自带的lung数据集
inst: Institution code
time: Survival time in days
status: censoring status 1=censored, 2=dead
age: Age in years
sex: Male=1 Female=2
ph.ecog: ECOG performance score (0=good 5=dead)
ph.karno: Karnofsky performance score (bad=0-good=100) rated by physician
pat.karno: Karnofsky performance score as rated by patient
meal.cal: Calories consumed at meals
wt.loss: Weight loss in last six months
> head(lung)
inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
1 3 306 2 74 1 1 90 100 1175 NA
2 3 455 2 68 1 0 90 90 1225 15
3 3 1010 1 56 1 0 90 90 NA 15
4 5 210 2