Menghasilkan Prediksi Time-to-Event Tunggal dari… – Menuju AI

Menghasilkan Prediksi Time-to-Event Tunggal dari… – Menuju AI

Pengarang: Yael Vilk

Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda sedang membangun produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan untuk menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.

Foto oleh Meritt Thomas di Unsplash

Analisis kelangsungan hidup adalah keluarga metode statistik untuk menganalisis data waktu-ke-peristiwa. Secara tradisional, teknik ini digunakan dalam domain kesehatan dan asuransi, di mana peristiwa yang menarik adalah kematian, rawat inap ulang, dan peristiwa morbid yang serupa. Namun, analisis kelangsungan hidup dapat diterapkan untuk memodelkan periode waktu apa pun, seperti waktu yang dibutuhkan seseorang untuk mendapatkan pekerjaan, sistem yang gagal, atau pelanggan yang churn.

Analisis kelangsungan hidup unik dalam kemampuannya untuk menangani data yang disensor, yaitu data di mana informasi waktu-ke-peristiwa tidak sepenuhnya diungkapkan untuk beberapa subjek. Hal ini dapat terjadi karena alasan yang berbeda. Misalnya, ada kemungkinan subjek keluar dari penelitian sebelum penghentiannya atau bahwa uji coba berakhir sebelum peristiwa yang menarik terjadi untuk beberapa subjek.

Menerapkan teknik analisis kelangsungan hidup yang berbeda menghasilkan fungsi kelangsungan hidup tunggal atau ganda. Fungsi survival menggambarkan probabilitas subjek, atau kelompok, untuk bertahan hidup di masa lalu T. Dalam konteks ini, ‘survival’ berarti menghindari peristiwa yang menarik. Waktu kelangsungan hidup keseluruhan, atau umur, adalah periode waktu antara ‘kelahiran’ – permulaan percobaan, dan ‘kematian’ – ketika peristiwa yang menarik terjadi. Secara alami, fungsinya secara monoton tidak meningkat, karena kelangsungan hidup semakin kecil kemungkinannya seiring waktu.

Berikut adalah fungsi bertahan hidup, misalnya:

impor panda sebagai pd

pd.DataFrame({‘t’: [1, 2, 5, 7, 9, 10, 12, 13]’S

Menurut fungsi kelangsungan hidup ini, ada kemungkinan 90% bahwa peristiwa yang menarik tidak akan terjadi pada waktunya 5.

Fungsi kelangsungan hidup juga berguna untuk membandingkan waktu kelangsungan hidup dari beberapa kelompok dan untuk menggambarkan pengaruh variabel tambahan pada waktu kelangsungan hidup. Ini adalah fungsi yang kuat yang menyimpan banyak informasi, tetapi terkadang, Anda ingin meringkasnya menjadi satu prediksi waktu-ke-peristiwa. Dalam posting ini, saya akan membahas beberapa cara untuk memprediksi umur dari fungsi kelangsungan hidup. Jika Anda ingin mempelajari lebih lanjut tentang analisis kelangsungan hidup secara umum atau bagaimana sebenarnya mendapatkan fungsi kelangsungan hidup dari data Anda, cobalah dokumentasi ‘garis hidup’ perpustakaan python, atau posting blog yang bagus ini.

Mari kita dapatkan beberapa fungsi bertahan hidup.

Kita akan mulai dengan membuat dataset mainan dengan python. Dalam kumpulan data ini, kami memiliki 5 subjek dalam penelitian yang berlangsung selama 20 hari. Kolom “diamati” menyatakan apakah subjek memang pernah mengalami kekambuhan gejala selama penelitian, dan kolom “durasi” menunjukkan hari saat gejala muncul kembali. Seperti yang Anda lihat, data kami tidak disensor: waktu kekambuhan gejala dicatat untuk seluruh sampel. Kami juga telah mendokumentasikan variabel prediktor.

df = pd.DataFrame({“prediktor”: [5, 3.5, 20, 9, 15],
“diamati”: [True, True, True, True, True],
“durasi”: [0, 12, 13, 3, 20]})

Kami akan menggunakan perpustakaan garis hidup agar sesuai dengan model Cox Proportional-Hazards ke data kami. Model ini digunakan untuk menggambarkan pengaruh satu atau beberapa kovariat terhadap kelangsungan hidup.

dari garis hidup, impor CoxPHFitter

cph = CoxPHFitter()
cph.fit(df, “durasi”, “diamati”)

Akhirnya, kami menggunakan model untuk memprediksi fungsi kelangsungan hidup untuk sampel baru dari 2 subjek:

X = pd.DataFrame({“prediktor”: [4, 18]}, indeks=[‘subject1’, ‘subject2’])
X

survival_functions = cph.predict_survival_function(X)
survival_fungsi

Kami sekarang memiliki fungsi kelangsungan hidup untuk setiap mata pelajaran. Tetapi subjek ini tertarik pada intinya: berapa lama sebelum gejalanya kembali?

Menghitung nilai harapan hidup sebagai area di bawah kurva kelangsungan hidup

Ukuran tendensi sentral yang paling umum untuk variabel acak kontinu adalah nilai yang diharapkan. Nilai yang diharapkan dari variabel acak adalah rata-rata dari hasil yang mungkin, dibobot dengan probabilitasnya. Waktu bertahan hidup adalah variabel kontinu (walaupun contoh kecil kita dapat dianggap diskrit), jadi kita perlu mengintegrasikan fungsi pada rentang yang diberikan. Artinya nilai harapan hidup subjek adalah luas daerah di bawah kurva kelangsungan hidup.

Objek bugar regresi Lifelines memiliki metode untuk menghitung nilai harapan dari umur subjek: predict_expectation(). Ini menggunakan aturan trapesium untuk menghitung luas di bawah kurva.

cph.predict_expectation(X)

subjek1 4.648343
subjek2 13.456205
dtype: float64

Dokumentasi memperingatkan bahwa “Jika fungsi kelangsungan hidup tidak konvergen ke 0, maka harapannya benar-benar tak terhingga dan nilai yang dikembalikan tidak berarti/terlalu besar”. Mengapa demikian? Mari kita lihat fungsi kelangsungan hidup subjek no. 2, misalnya. Fungsi kelangsungan hidup yang kami prediksi menunjukkan probabilitas untuk masing-masing durasi model yang dilatih. Untuk jangka waktu terakhir, 20 hari, subjek 2 memiliki probabilitas kelangsungan hidup yang relatif tinggi sebesar 0,25.

impor matplotlib.pyplot sebagai plt

survival_fungsi[‘subject2’].merencanakan()
xlabel = plt.xlabel(“waktu”)
ylabel = plt.ylabel(“probabilitas”)
atas = plt.atas([0, 1])

luas daerah di bawah kurva ini adalah 13,456

Menghitung area di bawah kurva kelangsungan hidup sebenarnya menciptakan bias ke bawah karena kemungkinan kurva berlanjut setelah hari ke-20. Namun, kami tidak memiliki informasi yang cukup untuk menentukan bagaimana fungsi ini berperilaku untuk nilai yang lebih besar dari 20. Mungkin ada kemungkinan besar periode bebas gejala yang lebih lama:

area di bawah kurva ini adalah sekitar 14,7

Tetapi ada juga kemungkinan bahwa peluang untuk ‘bertahan’ turun menjadi nol langsung setelah hari ke-20.

Area di bawah kurva ini adalah sekitar 13,58

Memprediksi median seumur hidup

Kami telah menetapkan bahwa menggunakan nilai yang diharapkan untuk waktu kekambuhan gejala, sementara secara matematis indah, dapat menjadi masalah. Sebagai gantinya, kita dapat menggunakan waktu di mana probabilitas mencapai ambang batas 50% sebagai prediksi kita. Setelah mencapai ambang batas ini, probabilitas bahwa peristiwa tersebut tidak terjadi menjadi lebih rendah daripada kemungkinan bahwa itu telah terjadi untuk setiap titik waktu berikutnya. Menggunakan median, atau persentil lainnya, sederhana dan langsung dan tidak terpengaruh oleh nilai ekstrim. Lifelines mendukung opsi ini secara langsung melalui metode predict_median().

cph.predict_median(X)

subjek1 3.0
subjek2 20.0
Nama: 0.5, dtype: float64

Tidak mengherankan bahwa median menghasilkan prediksi yang berbeda dari nilai yang diharapkan. Perhatikan bahwa secara teknis fungsi untuk subjek no. 2 melewati ambang batas 0,5 pada hari ke-20, tetapi sangat mendekati untuk melewatinya pada hari ke-13. Ini adalah salah satu perangkap dari fungsi bertahan hidup yang relatif kasar.

Meskipun demikian, tidak ada jaminan bahwa fungsi kelangsungan hidup Anda benar-benar mencapai probabilitas 50%! Ketika fungsi kelangsungan hidup Anda memprediksi tingkat kelangsungan hidup yang sangat tinggi, fungsi tersebut mungkin berakhir bahkan sebelum melewati tanda 50%, dan metode predict_median() garis hidup mengembalikan nilai inf. Dalam kasus seperti itu, dapat dikatakan bahwa memprediksi waktu kekambuhan gejala tidak masuk akal karena perkiraan, atau model, tidak mendapatkan informasi yang cukup relevan. Mari lihat:

X2 = pd.DataFrame({“prediktor”: [25]}, indeks=[‘subject3’])
X2

cph.predict_survival_function(X2)

cph.predict_median(X2)

info

Atau, jika peluang untuk bertahan hidup tipis, fungsi dapat dimulai dari probabilitas yang lebih rendah dari 0,5, dan predict_median() akan mengembalikan nol.

X3 = pd.DataFrame({“prediktor”: [-3]}, indeks=[‘subject4’])
X3

cph.predict_survival_function(X3)

cph.predict_median(X3)

0,0

Jika Anda ingin berada di sisi yang aman, tergantung pada kasus penggunaan Anda, Anda dapat menggunakan persentil yang berbeda sebagai nilai ambang probabilitas kelangsungan hidup.

cph.predict_percentile(X, p=0,75)

subjek1 0.0
subjek2 13.0
Nama: 0,75, dtype: float64

Jika Anda selamat dari pos ini (lihat apa yang saya lakukan di sana?), Anda siap untuk mengambil fungsi kelangsungan hidup Anda dan mengubahnya menjadi prediksi yang meyakinkan. Ingatlah bahwa median lebih disukai daripada nilai yang diharapkan ketika fungsi kelangsungan hidup tidak konvergen ke nol, tetapi itu tidak akan menyelamatkan Anda jika fungsinya bahkan tidak melewati 0,5. Semoga beruntung!

Analisis Kelangsungan Hidup: Menghasilkan Prediksi Waktu-ke-Acara Tunggal dari Fungsi Kelangsungan Hidup awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Menuju AI

Author: Jeffrey Hayes