การ Fit ตัวประมาณ Kaplan-Meier

Survival Analysis ด้วย Python

Shae Wang

Senior Data Scientist

ตัวประมาณ Kaplan-Meier คืออะไร?

สถิติแบบ non-parametric ที่ ประมาณค่าฟังก์ชันการรอดชีพ ของข้อมูล time-to-event

  • รู้จักในชื่ออื่นว่า
    • product-limit estimator
    • K-M estimator
  • Non-parametric: สร้าง survival curve จากข้อมูลจริงโดยไม่สมมติการกระจายล่วงหน้า
Survival Analysis ด้วย Python

หลักการทางคณิตศาสตร์

นิยาม:

  • $t_i$: ช่วงเวลา
  • $d_i$: จำนวนเหตุการณ์ที่เกิดขึ้น ณ เวลา $t_i$
  • $n_i$: จำนวนบุคคลที่รอดชีพมาจนถึงเวลา $t_i$

 

ฟังก์ชันการรอดชีพ $S(t)$ ประมาณได้ด้วย: $$S(t)=\prod_{i:t_i\leq t}\bigg(1-\frac{d_i}{n_i}\bigg)$$

Survival Analysis ด้วย Python

เหตุใดจึงเรียกว่า product-limit estimator?

สมมติมีเหตุการณ์เกิดขึ้น 3 ช่วงเวลา: 1, 2, 3

อัตราการรอดชีพที่ $t=2$: $$S(t=2)=\bigg(1-\frac{d_1}{n_1}\bigg)*\bigg(1-\frac{d_2}{n_2}\bigg)$$

อัตราการรอดชีพที่ $t=3$: $$S(t=3)=S(t=2)*\bigg(1-\frac{d_3}{n_3}\bigg)$$

อัตราการรอดชีพ ณ เวลา t เท่ากับผลคูณของโอกาสรอดชีพ ณ เวลา t และทุกช่วงเวลาก่อนหน้า

Survival Analysis ด้วย Python

ข้อสมมติที่ควรคำนึงถึง

  • เหตุการณ์ชัดเจน: เหตุการณ์ที่สนใจเกิดขึ้น ณ เวลาที่ระบุได้แน่ชัด
  • ความน่าจะเป็นในการรอดชีพเทียบกันได้ทุกกลุ่ม: ความน่าจะเป็นในการรอดชีพของแต่ละบุคคลไม่ขึ้นกับช่วงเวลาที่เข้าร่วมการศึกษา
  • การ censoring ไม่มีผลต่อข้อมูล: การสังเกตที่ถูก censor มีโอกาสรอดชีพเท่ากับการสังเกตที่ยังติดตามอยู่
Survival Analysis ด้วย Python

ตัวประมาณ Kaplan-Meier ด้วย lifelines

from lifelines import KaplanMeierFitter

KaplanMeierFitter: คลาสจากไลบรารี lifelines

kmf = KaplanMeierFitter()
kmf.fit(durations, event_observed)
Survival Analysis ด้วย Python

ตัวอย่างปัญหาสินเชื่อบ้าน

ชื่อ DataFrame: mortgage_df

id duration paid_off
1 25 0
2 17 1
3 5 0
... ... ...
100 30 1
Survival Analysis ด้วย Python

ตัวอย่างปัญหาสินเชื่อบ้าน

ชื่อ DataFrame: mortgage_df

id duration paid_off
1 25 0
2 17 1
3 5 0
... ... ...
100 30 1
from lifelines import KaplanMeierFitter
mortgage_kmf = KaplanMeierFitter()
mortgage_kmf.fit(duration=mortgage_df["duration"], 
        event_observed=mortgage_df["paid_off"])
<lifelines.KaplanMeierFitter:"KM_estimate", 
fitted with 100 total observations, 
18 right-censored observations>
Survival Analysis ด้วย Python

การใช้งานตัวประมาณ Kaplan-Meier

ระยะเวลามัธยฐานของสินเชื่อบ้านที่ยังค้างชำระคือเท่าใด?

print(mortgage_kmf.median_survival_time_)
4.0

ความน่าจะเป็นที่สินเชื่อบ้านจะยังค้างชำระในแต่ละปีหลังเริ่มสัญญาคือเท่าใด?

print(mortgage_kmf.survival_function_)
          KM_estimate
timeline             
0.0          1.000000
1.0          0.983267
2.0          0.950933
3.0          0.892328
Survival Analysis ด้วย Python

การใช้งานตัวประมาณ Kaplan-Meier

ความน่าจะเป็นที่สินเชื่อบ้านจะยังไม่ถูกชำระหมดภายในปีที่ 34 หลังเริ่มสัญญาคือเท่าใด?

mortgage_kmf.predict(34)
0.037998
Survival Analysis ด้วย Python

ข้อดีและข้อจำกัด

ข้อดี
  • แปลความน่าจะเป็นในการรอดชีพได้ง่าย
  • ใช้ได้กับข้อมูล time-to-event ทุกประเภท
  • มักเป็นโมเดลแรกที่ทดลองใช้กับข้อมูล time-to-event
ข้อจำกัด
  • Survival curve ไม่เรียบ
  • หากข้อมูลถูก censor ตั้งแต่ 50% ขึ้นไป จะคำนวณ .median_survival_time_ ไม่ได้
  • ไม่เหมาะสำหรับวิเคราะห์ผลของ covariate ต่อฟังก์ชันการรอดชีพ
Survival Analysis ด้วย Python

มาฝึกกันเถอะ!

Survival Analysis ด้วย Python

Preparing Video For Download...