Sabtu, 04 April 2015

Analisis Survival menggunakan R

Pada postingan kali ini saya ingin memberikan sedikit ilustrasi tentang analisis survival yakni:

1. Pengetahuan tentang dasar-dasar analisis survival,
2. Membiasakan diri dengan data frame, grafik, dan model linear di R, dan
3. Mencoba untuk menerapkan analisis survival menggunakan R.

Saya akan menggunakan R versi terbaru untuk saat ini yaitu (R.3.1.3), sehingga bagi anda yang ingin mencoba atau ingin mensimulasikan program yang terlampir pada tulisan ini dapat menggunakan R versi yang sama atau versi terbaru. Dalam hal ini saya juga akan menggunakan paket (package) yang sudah ada di dalam R itu sendiri seperti halnya:

survival, OIsurv, dan paket KMsurv

Paket "survival" akan digunakan dalam setiap contoh dalam dokumen ini dan paket data yang digunakan dapat ditemukan pada "KMsurv", yang meliputi paket data dari buku ke 5 oleh Klein dan Moeschberger. Fungsi tambahan yang digunakan dapat ditemukan pada "OIsurv". Paket-paket ini dapat diinstal dengan menggunakan install.packages dalam R sebagai berikut:

> install.packages("OIsurv") 

Dengan Instalasi ini akan secara otomatis memuat tiga paket termasuk "survival" dan "KMsurv". Untuk memuat atau mempersiakan paket sehingga dapat digunakan, lakukan pemanggilan paket

> library(OIsurv)                   # pemanggilan paket
Loading required package: survival
Loading required package: splines
Loading required package: KMsurv

Untuk melihat paket data yang tersedia dalam "KMsurv" anda dapat mengunjungi http://cran.r-project.org/web/packages/KMsurv/KMsurv.pdf . Andaikan anda ingin menggunakan salah satu data tersebut, anda dapat mengunakan fungsi "data(data yang anda inginkan)". Sebagai contoh,

> data(aids)
> aids             # menampilkan seluruh data aids
> head(aids)       # menampilkan data aids paling depan saja
 infect induct adult
1   0.00   5.00     1
2   0.25   6.75     1
3   0.75   5.00     1
4   0.75   5.00     1
5   0.75   7.25     1
6   1.00   4.25     1

Selanjutnya, membuat kolom data yang tersedia untuk digunakan sebagai variabel adalah,

> attach(aids)     # membuat kolom data sebagai variabel
> infect           # menampilkan variabel infect

[1] 0.00 0.25 0.75 0.75 0.75 1.00 1.00 1.00 1.00 1.25 1.25 1.25       1.25 1.50 1.50 .... dan seterusnya.

Sebagai programer yang baik anda juga dapat membuat kolom data yang tersedia untuk digunakan sebagai variabel dengan,

> aids$infect
[1] 0.00 0.25 0.75 0.75 0.75 1.00 1.00 1.00 1.00 1.25 1.25 1.25       1.25 1.50 1.50 .... dan seterusnya.

> detach(aids)  # mengembalikan data(aids) ke data awal sebelum observasi dilakukan. Sebagai programer yang baik ada baiknya anda lakukan hal ini di akhir observasi.

Target Survival:  
Surv(time,event), Surv(time,time2,event, type) 

Banyak fungsi dalam paket R untuk mengaplikasikan analisis survival seperti fungsi "Surv ()". Kita akan bahas data survival tersensor dikanan (right censor), data yang belum adanya suatu kejadian baik\buruk pada masa obsevasi usai. Lihat referensi http://www.weibull.com/LifeDataWeb/data_classification.htm untuk deskripsi tipe data survival. Untuk data tersensor dikanan, ada dua argumen yang perlu diperhatikan dalam penggunaan fungsi Surv ():  dengan menunjukkan vektor waktu yang diamati dan disensor.

> data(tongue)
> attach(tongue)
> head(tongue)
  type time delta
1    1    1     1
2    1    3     1
3    1    3     1
4    1    4     1
5    1   10     1
6    1   13     1

Menentukan himpunan bagian dari kelompok pertama dengan menggunakan  [tipe == 1]

> my.surv.object<-Surv(time[type==1],delta[type==1])
> my.surv.object
[1]   1    3    3    4   10   13   13   16   16   24   26   27        28   30   30 
[16] 32   41   51   65   67   70   72   73   77   91   93   96       100  104  157 
[31]167   61+  74+  79+  80+  81+  87+  87+  88+  89+  93+  97+       101+ 104+ 108+
[46]109+ 120+ 131+ 150+ 231+ 240+ 400+
> detach(tongue)

Untuk mengidentifikasi pengamatan yang data tersensor dikanan. Argumen pertama di "Surv()" harus dimasukan sebagai vektor waktu pengamatan dan tersensor dikanan. Vektor indikator yang digunakan dalam argumen kedua untuk menandakan apakah kejadian itu diamati (1) atau tidak (0). Seperti yang anda perhatikan diatas bahwa data yang bertanda (+) adalah data yang tersensor di kanan (hasil belum deketahui saat periode penelitian atau observasi di hentikan).

Anda juga dapat mempertimbangkan data yang terpotong dan tersensor dikanan tetapi dilakukan observasi dibagian kiri perhatikan contoh berikut:

> data(psych)
> attach(psych)
> head(psych)
  sex age time death
1   2  51    1     1
2   2  58    1     1
3   2  55    2     1
4   2  28   22     1
5   1  21   30     0
6   1  19   28     1
> my.surv.object<-Surv(age,age+time,death)
> my.surv.object
 [1](51,52]  (58,59]  (55,57]  (28,50]  (21,51+] (19,47]             (25,57]  (48,59]  (47,61]  (25,61+] (31,62+] (24,57+]             (25,58+] (30,67+] (33,68+] (36,61] (30,61+] (41,63] (43,69]       (45,69]  (35,70+] (29,63+] (35,65+] (32,67] (36,76] (32,71+]
> detach(psych)

Catatan: Ada banyak jenis analisis survival yang bisa anda kreasikan, tetapi mereka tidak tercakup dalam tulisan ini. Selain itu, beberapa fungsi survival di R hanya menerima beberapa jenis data survival.

Estimasi Kaplan-Meier dan batas terbaik (pointwise interval):
survfit(formula, conf.int = 0.95, conf.type = "log")

Estimasi Kaplan-Meier adalah memprediksi maksimum kemungkinan (maximum likelihood estimate)  nonparametrik dari fungsi survival, $S(t).$ Estiamasi ini adalah langkah untuk memprediksi waktu yang diamati, $t_i.$ Dalam formula matematika di bawah ini, diasumsikan $t_i$ sebagai: $0 <t_1 <t_2 < \dots < t_D$. Jika urutan individu dinyatakan dengan waktu $t_i$  pengamatan adalah $di$, dan nilai $Y_i $ merupakan jumlah individu yang berisiko saat $t_i$ (di mana risiko berarti orang yang meninggal pada waktu $t_i$ atau lambat), sehingga perkiraan Kaplan-Meier adalah fungsi survival dan estimasi varians dinyatakan dengan

Batas kekauratan (Confidence Interval) untuk linear sederhana dan "log-log" yang juga disediakan dalam R adalah,

Estimasi Kaplan-Meier adalah "fit" di R dengan menggunakan fungsi "survfit ()". Memprediksi atau estimasi batas kelayakan adalah dengan mengimput fungsi survival terhadap intercept:

> data(tongue)
> attach(tongue)
> my.surv<-Surv(time[type==1],delta[type==1])
> survfit(my.surv~1)
Call: survfit(formula = my.surv ~ 1)
records   n.max n.start  events  median 0.95LCL 0.95UCL 
     52      52      52      31      93      67      NA 

Survfit () juga memiliki sejumlah argumen opsional. Sebagai contoh, tingkat keakuratan memungkinkan untuk diubah (misalnya conf.int = 0.90 untuk 90% batas keakuratan) dengan menggunakan argumen, "conf.int ". Argumen conf.int menjelaskan jenis titik keakuratan. Lebih spesifiknya lagi, hal itu menggambarkan transformasi untuk membangun titik keakuratan. Standarnya adalah "log" $g (t) = log (t),$ yang setara untuk fungsi transformasi. Selain itu anda juga dapat menggunkan fungsi "log-log" $g (t) = log (-log (t))$ sebagai pilihan anda mentrasformasikan kembali fungsi tersebut.

Seperti banyak fungsi dalam R, survfit () adalah salah satu cara untuk mengembalikan fungsi informasi tersembunyi yang dapat diakses. Berikut diperlihatkan beberapa elemen informasi tersembunyi, yang disimpan dalam daftar fungsi survfit (). Untuk ringkasan lengkap dari objek, mengunakan fungsi "str" untuk my.fit dan "summary()".

> my.fit <- survfit(my.surv)
> summary(my.fit)$surv    # estimasi Kaplan-Meier pada setiap t_i
> summary(my.fit)$time    # {t_i}
> summary(my.fit)$n.risk  # {Y_i}
> summary(my.fit)$n.event # {d_i}
> summary(my.fit)$std.err # standar kesalahan K-M estimasi {t_i}
> summary(my.fit)$lower   # batas bawah estimasi
> str(my.fit)             # ringakasan lengkap {my.fit}
> str(summary(my.fit))    # ringakasan lengkap {my.fit}

Fungsi "str" berguna untuk melihat lebih rincian tentang apa yang terkandung dalam daftar fungsi, dan seperti yang dinyatakan di atas, kita dapat mengakses setiap item dalam daftar menggunakan operator $. Estimasi Kaplan-Meier dapat dinyatakann dalam grafik menggunakan fungsi "plot(data yang sudah di estimasi)". Argumen standar dalam fungsi plot dapat digunakan untuk meningkatkan estetika (karakter) grafik: 

> plot(my.fit,main="Kaplan-Meier estimate with 95% confidence bounds",xlab="time",ylab="survival function")

Kadang-kadang perbedaan kelompok yang terkandung dalam sebuah objek tunggal survival. Misalnya, jenis variabel dalam kumpulan data "tongue" menggambarkan propil DNA pasien. Kita dapat memperoleh estimasi Kaplan-Meier untuk masing-masing kelompok dengan regresi objek survival pada jenis variabel:

> my.fit1<-survfit(Surv(time,delta)~type) #fit dengan pemisahan type
> detach(tongue)

Dengan menggunakan code ini kita dapat mempartisi data set dengan memperhatikan type data tersebut. (Hal ini menjadi alasan untuk menggunakan beberapa variabel di sisi kanan persamaan.) Ringkasan my.fit1 akan berisi daftar item tambahan-strata, dapat diakses melalui summary statistik  (my.fit1)$strata yang menunjukkan komponen output sesuai dengan kelompok lain.

Interval Keakuratan Simultan (Simultaneous Confidence Interval) 
confBands(x, confType="plain", confLevel=0.9, type="ep")

Interval kekakuratan, seperti yang diperkenalkan di halaman sebelumnya, berlaku untuk satu titik dalam skala waktu. Sekarang kita mengalihkan perhatian kita keakuratan simultan (untuk jangka pendek atau kurun waktu tertentu), yang berlaku untuk seluruh rentang nilai waktu secara bersamaan. Suatu keakuratan 95% misalnya, akan menangkap seluruh kurva survival yang benar sekitar 19 dari 20 kali. 

Sementara paket yang digunakan fungsi survival tidak memenuhi batasan, jadi dilakukan perhitungan dengan menggunakan "confBands" dari perpustakaan "OIsurv". Argumen pertama adalah objek survival untuk $x,$ dan argumen lainnya memungkinkan kustomisasi. kode untuk "confType" adalah, "log-log", atau "asin-sqrt"; dengan confLevel mungkin 0,90, 0,95, atau 0,99; dan jenisnya mungkin "ep" atau "hall" (Hall-Wellner). Ada juga dua argumen opsional, tL (batas bawah) dan tU (batas atas), yang membatasi dukungan dari batasan keakuratan ini. Batasan kekuaratan dapat ditambahkan ke plot menggunakan fungsi garis.

> data(bmt); attach(bmt)
> my.surv <- Surv(t2[group==1], d3[group==1])
> my.cb<-confBands(my.surv,confLevel=0.95,type="hall")
>plot(survfit(my.surv~1),xlim=c(100,600),xlab="waktu",ylab="Estimasi fungsi Survival",main="Batas keakuratan")
Perhatikan bahwa hasil dari batas keakuratan (atas/bawah) adalah transformasi dari log dengan melanjutkan kode R dibawah ini, yang akan menghasilkan interval batas keakuratan asimetris.
> lines(my.cb$time,my.cb$upper,lty=3,type="s")
> lines(my.cb$time,my.cb$lower,lty=3,type="s")
> legend(100,0.3,legend=c("Etimasi survival K-M","batas atas","batas bawah"),lty=1:3)
> detach(bmt)

Fungsi Kumulatif Resiko (Hazard Function)

Fungsi Kumulatif Resiko dan fungsi kelangsungan hidup (survival) terkait dengan cara berikut untuk Data kontinu:
Estimasi maksimal kemungkinan (MLE) fungsi resiko dapat diperoleh dengan transformasi kebalikan dari Kaplan-Meier Estimasi:   

Anda juga dapat menggunakan cara lain untuk memperkirakan H (t) seperti estimator Nelson-Aalen:

Sementara tidak ada fungsi dalam menghitung paket survival secara otomatis, pengembalian objek dengan ringkasan (survfit ()) dapat digunakan untuk menghitung estimasi:

> data(tongue); attach(tongue)
> my.surv<-Surv(time[type==1],delta[type==1])
> my.fit<-summary(survfit(my.surv~1))
> my.fit
Call: survfit(formula = my.surv ~ 1)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
    1     52       1    0.981  0.0190        0.944        1.000
    3     51       2    0.942  0.0323        0.881        1.000
    4     49       1    0.923  0.0370        0.853        0.998
   10     48       1    0.904  0.0409        0.827        0.988
   13     47       2    0.865  0.0473        0.777        0.963
  .......... dan seterusnya

> H.hat <- -log(my.fit$surv)            
> H.hat <- c(H.hat, tail(H.hat, 1))

Suatu ringkasan plot atau tabel dapat dibuat dengan menggunakan H.hat dengan my.fit$waktu. Estimasi Nelson-Aalen juga dapat dibangun dengan:

> h.sort.of<-my.fit$n.event/my.fit$n.risk
> H.tilde<-cumsum(h.sort.of)
> H.tilde<-c(H.tilde,tail(H.tilde,1))
> plot(c(my.fit$time,250),H.hat,xlab="waktu",ylab="Resiko kumulatif resiko",main="Perbandingan resiko kumulatif",ylim=range(c(H.hat, H.tilde)),type="s")
> points(c(my.fit$time,250),H.tilde,lty=2,type="s",col=2)

> detach(tongue)

Perkiraan rata-rata dan variansi

Median waktu survival adalah waktu $t_{0.5}$ sehingga $S (t_{0. 5}) = 0. 5.$ Hal ini divisualisasikan oleh grafik perkiraan fungsi survival dan menggambar garis horizontal di $0.5.$ Diperkirakan median sama waktu $\hat{ t}_{0.5}$ di mana fungsi dan garis berpotongan. Interval con dence untuk $t_{0. 5}$ diberikan oleh titik di mana garis horizontal ini menyilang  interval batas keakuratan $\hat{ S} (t).$

Rata-rata waktu survival dapat di estimasi dengan 
$$\mu=\int_0^\infty S(t)dt, \quad \hat{\mu}=\int_0^\infty\hat{S}(t)dt$$
Jika $S(t)$ atau $\hat{S}(t)$ tidak konvergen di nol, maka integral divergen. Properti ini menciptakan tantangan untuk banyak data, dan satu resolusi adalah dengan menggunakan nilai terbatas $\tau$ sebagai terikat untuk integral, di mana $\tau$ dapat mewakili waktu survival maksimum dianggap memungkinkan. Pilihan lain yang masuk akal untuk $\tau$ adalah maksimum yang dapat diamati atau disensor waktu. Menggunakan nite $\tau$ hasil dalam statistik baru dan sesuai estimasi: $\mu_\tau= \int_0^\tau S (t)dt.$ Andaikan $t_i, Y_i, d_i,$ dan $D$ adalah sebagaimana dijelaskan dalam Kaplan-Meier, estimasi varians $\hat{\mu}_\tau$ adalah
$$\hat{V}(\hat{\mu}_\tau)=\sum_{i=1}^D\biggr[\int_{t_i}^\tau\hat{S}(t)dt\biggl]^2{d_i\over Y_i(Y_i-d_i)}$$
Median dan 95% interval keakuratan dapat diestimasi dengan fungsi "survfit()":

> data(drug6mp)
> attach(drug6mp)
> head(drug6mp)
 pair remstat t1 t2 relapse
1    1       1  1 10       1
2    2       2 22  7       1
3    3       2  3 32       0
4    4       2 12 23       1
5    5       2  8 22       1

6    6       1 17  6       1
> my.surv<-Surv(t1,rep(1,21))   # semua pasien placebo dioservasi
> survfit(my.surv~1)
Call: survfit(formula=my.surv~1)
records   n.max n.start  events  median 0.95LCL 0.95UCL 
     21      21      21      21       8       4      12 

Menggunakan "print(survfit())" akan menampilkan waktu survival dan standar eror.

> print(survfit(my.surv~1),print.rmean=TRUE)
Call: survfit(formula=my.surv~1)

   records      n.max    n.start     events     *rmean *se(rmean)     median 
     21.00      21.00      21.00      21.00       8.67       1.38       8.00 
   0.95LCL    0.95UCL 
      4.00      12.00 
    * restricted mean with upper limit =  23 
> detach(drug6mp)

Kode "print.rmean =TRUE"  adalah argumen yang digunakan untuk mendapatkan mean dan standard error-nya, dan $\tau$ secara otomatis ditetapkan sebagai terbesar diamati atau disensor waktu. Atau, $\tau$ ditentukan menggunakan argumen "rmean".

Uji dengan dua atau lebih sampel

Diberikan dua atau lebih sampel, apakah ada diferinsial statistik antara waktu survival? kita dapat melakukan analisis dengan formula (hipotesis fungsi resiko) sebagai,

  • $H_0 : h_1(t)=h_2(t)=\cdots=h_n(t)$ untuk semua $ t,$ dan
  • $H_A : h_i(t_0)\ne h_j(t_0)$  untuk setidaknya satu pasangan $i; j$ dan waktu $t_0$
Andaikan,

  • $t_i$ adalah waktu di mana peristiwa yang diamati (menganggap $D$  sebagai waktu),
  • $d_{ik}$ nilai kejadian obbservasi dari grup $k$ pada waktu $t_i$,
  • $Y_{ik}$ nilai subjek dalam grup $k$ terdapat resiko pada $t_i$ (lihat K-M section),
  • $d_i=\sum_{j=1}^n d_{ij},$
  • $Y_i=\sum_{j=1}^n Y_{ij},$ dan
  • $W(t_i)$  menjadi titik berat pengamatan pada waktu $t_i.$
Kemudian Uji hipotesis diatas,  suatu kalkulasi vector $Z$, dimana  elemen $k^{th}$ adalah $$Z_k=\sum_{i=1}^D W(t_i)\biggr[d_{ik}-Y_{ik} {d_i\over Y_i}\biggl]$$
Kovarians matriks $\hat{\sum}$ juga perhitungan data. Di bawah  nol hipotesis uji statistik $X^2=Z'\hat{\sum}^{-1}Z$ melalui  distribusi $\chi^2$ dengan $n$ derajat kebebasan. Dalam hal ini, jika $X^2>\chi_{1-\alpha,df-n}^2,$ data ini memberikan bukti kuat terhadap nol hipotesis dan kita menolak $H_0.$

Fungsi "survdiff" digunakan dalam nol hipotesis ini. Argumen pertama objek survival suatu kategori variabel kovarians adalah biasanya menunjuk variabel kelompok yang sesuai dengan waktu survival. Objek dikembalikan oleh "survdiff ()" memberikan informasi yang berguna.

> data(btrial); attach(btrial)  
> head(btrial)
  time death im
1   19     1  1
2   25     1  1
3   30     1  1
4   34     1  1
5   37     1  1
6   46     1  1
> survdiff(Surv(time,death)~im) # hasil
Call:
survdiff(formula = Surv(time, death) ~ im)

      N Observed Expected (O-E)^2/E (O-E)^2/V
im=1 36       16    20.19     0.869      5.49
im=2  9        8     3.81     4.599      5.49

 Chisq= 5.5  on 1 degrees of freedom, p= 0.0191 

Kode kedua "survdiff ()", rho, menunjuk bobot menurut $\hat{S} (t)^\rho$ dan mungkinkan untuk nilai numerik. Standarnya adalah rho = 0 dan sesuai dengan uji log-rank. Peto & Peto modi fikasi dari perhitungan uji  Gehan-Wilcoxon dengan menggunakan rho=1:

> survdiff(Surv(time,death)~im,rho=1)
Call:
survdiff(formula=Surv(time,death)~im,rho=1)

      N Observed Expected (O-E)^2/E (O-E)^2/V
im=1 36     12.1    14.96     0.558      4.35
im=2  9      5.8     2.91     2.867      4.35

 Chisq= 4.4  on 1 degrees of freedom, p= 0.037 

> detach(btrial)


Untuk memberikan bobot yang lebih besar untuk pertama bagian dari kurva survival, gunakan rho lebih besar dari 0. Untuk memberikan bobot ke bagian akhir dari kurva survival, gunakan rho lebih kecil dari 0. Output dari "survdiff()" adalah umumnya cukup jelas. Suatu $\chi^2$ statistik dihitung bersama dengan nilai-p.

Model resiko proposional Cox konstanta kovariat 
coxph(formula, method)

Model resiko proporsional Cox (Cox PH) kelayakan survival (fit) data dengan kovariat $z $ untuk fungsi resiko dibentuk
$$h(t|s)=h_0(t)exp\{\beta'z\}$$
diman $\beta$ suatu vektor yang tidak diketahui dan $h_0(t)$ adalah resiko baseline nonparametrik. Hal medasar untuk memperkirakan parameter $\beta$ menggunakan kemungkinan parsial:


dimana $R(t_i)$ adalah himpunan resiko pada $t_i$

Kemugkinan resiko terbesar (MLE) $\hat{\beta}$ sebagai suatu vektor adalah asimtotik $N(\beta,I^{-1})$, dimana $I$ adalah menyatakan informasi dari Fihser. Aproksimasi normal ini memungkinkan melakukan uji lokal. Uji lokal adalah memeriksa himpunan bagian unsur-unsur yang terkandung dalam $\beta$, pastikan uji dendan $C\beta=d$ dimana $C$ adalah matriks $q\times p$ dengan semua urutan dan $d$ adalah suatu vektor dengan panjang $q.$  Sebagai contoh anda ingin mencoba uji sederhana untuk $\beta_1=0$ dengan memilih $C_{1 \times p} = (1,0,0,\dots,0)$ dan $d_{1\times 1}=0.$  Secara umum $C$ dan $d$ uji statistik adalah, 
$$X_W^2=\biggl(C\hat{\beta}-d\biggr)'\biggl[C\hat{I^{-1}}C'\biggr]^{-1}\biggl(C\hat{\beta}-d\biggr), $$
dimana nol hipotesis mengguanakan $\chi_q^2.$  Hal ini dikenal sebagai uji Wald. Selain memperoleh uji nilai-p, mungkin ada kepentingan dalam fungsi survival untuk kovariat tertentu. Jika perkiraan fungsi survival dasar $\hat{ S}_0 (t)$ diberikan, maka estimasi fungsi survival bagi suatu individu (obsevasi) dengan kovariat $z_k$ dapat diperoleh 
$$\hat{S}(t|z_k)=\biggl[\hat{ S}_0 (t)\biggr]^{exp(\hat{\beta'}z_k)}$$

Fungsi "coxph ()" menentukan model terbaik Cox PH ke data yang diberikan. Argumen pertama adalah formula, di mana respon adalah objek survival.

> data(burn); attach(burn)
> my.surv<-Surv(T1,D1)
> coxph.fit<-coxph(my.surv~Z1+as.factor(Z11),method="breslow")
> coxph.fit
Call:
coxph(formula=my.surv~Z1+as.factor(Z11),method="breslow")
                  coef exp(coef) se(coef)     z     p
Z1               0.497     1.644    0.208  2.38 0.017
as.factor(Z11)2 -0.877     0.416    0.498 -1.76 0.078
as.factor(Z11)3 -1.650     0.192    0.802 -2.06 0.040
as.factor(Z11)4 -0.407     0.666    0.395 -1.03 0.300

Likelihood ratio test=14.6  on 4 df, p=0.00569  n= 154, number of events= 99 

Dua kovariat telah digunakan dalam contoh ini. Argumen kedua yang terdaftar, metode spesifik bagaimana ikatan ditangani dengan defaultnya adalah "efron" dan pilihan lain "Breslow" dan "exact". banyak informasi yang berguna diperoleh dalam ringkasan "coxph ()", termasuk
  • Memperkiraan $\beta_k$, termasuk standar kesalahan (standar diviasi) dan nilai-p untuk setiap uji $H_0: \beta_k = 0,$
  • Meperkirakan rasio risiko dan selang confidence nya, dan
  • Nilai-p untuk rasio kemungkinan, Wald, dan nilai uji untuk nol hipotesis secara umum, $H_0: \beta_i = 0$ untuk semua $i.$
Bahkan lebih kompleks lagi hipotesis dapat diperiksa menggunakan atribut-atribut lainnya dari model fit ini:

> co<-coxph.fit$coefficients # menampilkan koefisien model
> va<-coxph.fit$var          # estimasi kovarians matriks
> va
             [,1]        [,2]         [,3]         [,4]
[1,] 4.341949e-02 0.007746416 0.0009624982 6.528035e-05
[2,] 7.746416e-03 0.248005461 0.1437885487 1.442857e-01
[3,] 9.624982e-04 0.143788549 0.6439844004 1.435196e-01
[4,] 6.528035e-05 0.144285704 0.1435196176 1.563852e-01
> ll<-coxph.fit$loglik       # estimasi log-likelihood (MLEs)
> ll
[1] -423.3526 -416.0686

Untuk mendapatkan fungsi dasar survival dari model PH Cox, gunakan survfit () untuk coxph ():

> my.survfit.objek<- survfit(coxph.fit)
> my.survfit.objek
Call: survfit(formula = coxph.fit)
records   n.max n.start  events  median 0.95LCL 0.95UCL 
    154     154     154      99      14      12      18 

Pengembalian obejek dengan "survfit ()" memiliki karakteristik khas dan sifat seperti sebelumnya. Misalnya, fungsi survival dasar dapat diplot menggunakan plot () fungsi. Di sini kita akan menjalankan satu tes lokal. Di atas, $Z11$ adalah variabel faktor direpresentasikan sebagai koefisien kedua, ketiga, dan keempat dari koefisien coxph.fit. Saat kita membangun $C$ dan $d,$ maka kita menghitung uji  statistik $X_W^2$. Dalam kode di bawah, diperlihatkan obyek $t_1$ dan $t_2$ dihitung sebagai cara untuk mendapatkan uji statistik.

> C <- matrix(c(0,1,0,0,0,0,1,0,0,0,0,1),nrow=3,byrow=TRUE)
> d <- rep(0, 3)
> t1 <- C %*% co - d
> t2 <- C %*% va %*% t(C)
> XW2 <- c(t(t1) %*% solve(t2) %*% t1)
> pchisq(XW2, 3, lower.tail=FALSE)
[1] 0.1025018
> detach(burn)

Rangkaian fungsi c () digunakan dalam perhitungan XW2 membuat XW2 vektor dari pada matriks $1\times 1$. Nilai-p dari uji ini adalah 0,103, yang berarti Z11 tidak uji statistik yang signifikan untuk tingkat signifikan dari $\alpha= 0.05.$


Model resiko proportional Cox kovariat tergantung waktu

Menggunakan kovariat tergantung waktu dalam R adalah latihan dalam mengorganisasi. Sebelumnya dianggap kovariat adalah atribut yang tidak berubah, seperti perlakuan terhadap kelompok obsevasi atau pengontrolan kelompok atau ras pasien. Saat Ini kita mempertimbangkan tergantung waktu kovariat, seperti intervensi atau faktor lingkungan yang mungkin mengakibatkan perubahan pertengahan studi.

Untuk menggunakan kovariat tergantung waktu di R, kita akan menerapkan pemotongan periode disebelah kiri (melakukan obsevasi sebelum periode selesai) secara bebas. Sebagai contoh, jika ada intervensi untuk pasien $i,$ maka kita membagi pasien $i$ menjadi dua pengamatan terpisah: pra dan pasca-intervensi. Lebih eksplisit, misalkan intervensi pasien terjadi pada waktu $t_i $= 45 dan acara untuk pasien saya diamati pada $t_{kejadian}$= 58. Kita akan membagi catatan pasien ini menjadi dua potongan : 0-45 dan 45-58. kovariat intervensi dapat diberikan nilai berbeda untuk setiap interval. Menerapkan metode memecah waktu di R membutuhkan sedikit ketelitian. Memulai dan mengakhiri untuk masing-masing interval yang dibangun,
dan data tersensor dikanan harus dilacak untuk setiap pasangan dari awal hingga akhir.

Asumsikan data berikut adalah contoh simulasi. Catatan pasien dari klinik penyalahgunaan alkohol diperoleh selama 150 hari setelah pasien sudah dinyatakan sembuh. Hal yang menjadi perhatian adalah kadar alkohol pasien dan empat variabel yang tersedia sebagai berikut: 

  • kejadian (event) =  menjelaskan diamati atau disensor kekambuhan,
  • delta = menjelaskan apakah kejadian diamati (TRUE) atau disensor (FALSE),
  • gender = kovariat waktu-independen, dan 
  • int = menyatakan kovariat tergantung waktu pasien memiliki intervensi, di mana beberapa pasien kambuh sebelum intervensi mereka dijadwalkan dan dinyatakan dengan NA. 
Semua intervensi terjadi setelah pasien dinyatakan sembuh (hari 0). Artinya, kovariat intervensi berubah untuk setiap pasien dari waktu ke waktu, selama mereka tidak kambuh seperti semula. Data ini akan disimpan sebagai data "relapse" dalam paket "OIsurv".

> data(relapse)                #memanggil data base
> relapse                      #menampilkan data
    event delta gender inter
1     150 FALSE      0    84
2      53  TRUE      1    50
3      12  TRUE      1    NA
4     150 FALSE      0    89
5     150 FALSE      1    77

6     135  TRUE      1     7
....... dan seterusnya

Data ini dapat dimodelkan dengan menggunakan dua langkah:
  1. Buatlah catatan hidup yang mungkin termasuk kiri dan kanan pengamatan disensor. kelangsungan hidup catatan setiap pasien dengan intervensi ini dibagi menjadi dua survival: satu sebelum intervensi dan satu setelah. Langkah ini sebagian besar sudah ada dalam pembukuan dan pemrograman R.
  2. Catatan hidup baru dapat dijalankan melalui coxph () fungsi.
Pertama-tama menginisialisasi vektor baru untuk mewakili variabel catatan hidup. Variabel $t_1$ dan $t_2$ merupakan awal dan akhir, masing-masing $d$ merupakan apakah kambuh yang diamati (TRUE) atau benar-disensor (FALSE), $g$ merupakan jenis kelamin, dan saya mewakili apakah pasien menjalani perawatan intervensi (kita harus berhati-hati untuk tidak menimpa variabel ini dalam satu lingkaran).

> N<-dim(relapse)[1]       # menanyakan R berapa banyak data
> t1<-rep(0,N+sum(!is.na(relapse$int))) #inisial waktu dimulai 0
> t2<-rep(-1,length(t1))   # membangun vektor untuk akhir waktu
> d<-rep(-1,length(t1))    # apakah data disensor
> g<-rep(-1,length(t1))    # jenis kelamin kovariate
> i<-rep(FALSE,length(t1)) # inisialisasi intervensi pada FALSE

Selanjutnya, setiap pasien diperiksa apakah mereka memiliki intervensi. Jika mereka tidak, maka rekor mereka hanya disalin ke variabel baru yang akan digunakan. Jika ada intervensi, observasi dibagi menjadi dua bagian: periode sebelum intervensi dan periode setelah intervensi. Periode berikut adalah setelah intervensi yang tersisa-dipotong untuk waktu intervensi.

> j<-1
> for(ii in 1:dim(relapse)[1]){if(is.na(relapse$int[ii]))
{ # bukan intervensi, copy survival rekord
t2[j]<-relapse$event[ii]
d[j]<-relapse$delta[ii]
g[j]<-relapse$gender[ii]
j<- j+1
} else {                     # intervensi, catatan perpecahan
g[j+0:1]<-relapse$gender[ii] # jenis kelamin sama setiap waktu
d[j] <- 0                    # bukan relapse pra-intervensi
d[j+1] <- relapse$delta[ii]  # relapse terjadi pasca-intervensi?
i[j+1] <- TRUE # intervensi kovariat, pasca-intervensi
t2[j] <- relapse$int[ii]-1   # akhir pra-intervensi
t1[j+1] <- relapse$int[ii]-1 # awal pasca-intervensi
t2[j+1] <- relapse$event[ii] # akhir of pasca-intervensi
j <- j+2                     # penambahan dua rekord
}
}

Arti dari variabel adalah sebagai berikut: 
  • $t_1$ merupakan awal setiap interval,
  • $t_2$ akhir setiap interval,
  • $e$  menunjukkan jika acara diamati,
  • $g$ adalah kovariat gender, dan
  • $i$ adalah indikator variabel untuk apakah interval ini dikaitkan dengan pasca-intervensi pasien.
Sementara banyak pasien memiliki waktu bervariasi kovariat (yaitu, intervensi), masing-masing interval baru memiliki kovariat yang tidak berubah, yang memungkinkan untuk objek survival dan Model PH Cox yang akan dibangun:

> mySurv<-Surv(t1,t2,d)
> myCPH<-coxph(mySurv~g+i)

Contoh ini adalah kasus sederhana; tergantung pada kovariat waktu tunggal, dan hal itu paling banyak berubah setiap kasus. Dalam beberapa kasus, mungkin ada banyak kovariat waktu bervariasi, bahkan ada juga yang berubah setiap satuan waktu. Dalam sebagian besar kasus ini, metode yang sama dapat digunakan. Setiap kali perubahan kovariat dari satu satuan waktu ke depan, membagi interval menjadi dua dan menggunakan pemotongan waktu observasi data tersensor dikanan  seseuai yang diperlukan. Untuk lebih jelas lagi silahkan anda membaca kembali pada bagian "Target Survival" diatas.

Model kesalahan percepatan waktu 
survreg(formula, dist='weibull')

Suatu model kesalahan percepatan waktu atau Accelerated failure-time (AFT) models adalah model parametrik dengan kovariat dan kesalahan waktu. Berikut fungsi kelangsungan hidup bentuk $S (x|Z) = S_0 (x*exp [\theta' Z]),$ dimana $S_0$ adalah fungsi untuk tingkat survival awal. Istilah $exp[\theta'Z]$ disebut sebagai faktor akselerasi. Model AFT menggunakan kovariat untuk menempatkan orang pada skala waktu berbeda. Perhatikan skala dengan kovariat $S(t|Z)$ melalui $exp [\theta'Z]$. Model AFT dapat ditulis dalam bentuk log-linear, dimana log waktu kegagalan (disebut $logX$) berhubungan linier dengan rata-rata $\mu$, faktor akselerasi, dan standar kesalahan dengan istilah $\sigma W$:
$$log X= \mu-\theta'Z+\sigma W$$

Fungsi "survreg ( )"  dalam paket survival digunakan untuk pemodelan AFT. Argumen pertama adalah rumus, di mana objek kemunduran survival pada prediksi. Argumen "dist" memiliki beberapa pilihan untuk menggambarkan model parametrik digunakan ("weibull", "eksponensial", "gaussian", "logistik", "lognormal", atau "loglogistic").

> data(larynx)
> attach(larynx)
> srFit<-survreg(Surv(time,delta)~as.factor(stage)+age, dist="weibull")
> summary(srFit)

Call:
survreg(formula = Surv(time, delta) ~ as.factor(stage) + age, 
    dist = "weibull")
                    Value Std. Error      z        p
(Intercept)        3.5288     0.9041  3.903 9.50e-05
as.factor(stage)2 -0.1477     0.4076 -0.362 7.17e-01
as.factor(stage)3 -0.5866     0.3199 -1.833 6.68e-02
as.factor(stage)4 -1.5441     0.3633 -4.251 2.13e-05
age               -0.0175     0.0128 -1.367 1.72e-01
Log(scale)        -0.1223     0.1225 -0.999 3.18e-01

Scale= 0.885 

Weibull distribution
Loglik(model)= -141.4   Loglik(intercept only)= -151.1
        Chisq= 19.37 on 4 degrees of freedom, p= 0.00066 
Number of Newton-Raphson Iterations: 5 
n= 90 

Pada output, (Intercept) dan Log (skala) sesuai dengan perkiraan $\mu$ dan $log\sigma$. Estimasi yang lainnya akan sesuai dengan koefisien kovariat. Kita juga mungkin mempertimbangkan model eksponensial:

> srFitExp <- survreg(Surv(time, delta) ~ as.factor(stage) + age, dist="exponential")
> summary(srFitExp)

Call:
survreg(formula = Surv(time, delta) ~ as.factor(stage) + age, 
    dist = "exponential")
                    Value Std. Error      z        p
(Intercept)        3.7550     0.9902  3.792 1.49e-04
as.factor(stage)2 -0.1456     0.4602 -0.316 7.52e-01
as.factor(stage)3 -0.6483     0.3552 -1.825 6.80e-02
as.factor(stage)4 -1.6350     0.3985 -4.103 4.08e-05
age               -0.0197     0.0142 -1.388 1.65e-01

Scale fixed at 1 

Exponential distribution
Loglik(model)= -141.9   Loglik(intercept only)= -151.1
        Chisq= 18.44 on 4 degrees of freedom, p= 0.001 
Number of Newton-Raphson Iterations: 4 
n= 90 

Ketika $\sigma$ = 1, model Weibull setara dengan model eksponensial. Anda dapat mempertimbangkan dua strategi ini untuk memilih model terbaik:
  • Uji rasio kemungkinan, yang mengevaluasi nol hipotesis $\sigma$= 1 melawan dua sisi alternatif, dan
  • Pemeriksaan signifikansi dari koefisien Log (skala)  (lihat output ringkasan (srFit)).
Dalam contoh ini, kedua pendekatan menghasilkan kesimpulan yang sama: tidak ada alasan yang memadai untuk menolak hipotesis $\sigma$= 1 $(H_0).$ Untuk alasan ini, akan saya perlihatkan model eksponesial sederhan. Jika tertarik anda dapat menjelajahi banyak komponen yang disimpan dalam "survreg ( )" berikut:

> srFitExp$coeff  # koefisien kovariat
> srFitExp$icoef  # koefisien intercept and skala 
> srFitExp$var    # matriks varians-kovarians 
> srFitExp$loglik # log-likelihood

Akhirnya, sebagai programer yang baik jangan pernah lupa untuk melepaskan kumpulan data.

> detach(larynx)



Referensi

  1. Terry Therneau and original Splus\R port by Thomas Lumley (2011). survival: Survival analysis, including penalised likelihood. R package version 2.36-10. http://CRAN.R-project.org/package=survival.
  2. R Development Core Team (2010). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org.
  3. David M Diez (2012). OIsurv: Supplement to survival analysis tutorial. R package version 1.0. http://CRAN.R-project.org/package=OIsurv
  4. Original by Klein, Moeschberger and modi cations by Jun Yan (2010). KMsurv: Data sets from Klein and Moeschberger (1997), Survival Analysis. R package version 0.1-4. http://CRAN.R-project.org/package=KMsurv.
  5. Klein, John P., and Melvin L. Moeschberger. Survival Analysis: Techniques for Censored and Truncated Data. New York: Springer, 2003.
  6. Fox, John 2002. Cox Proportional-Hazards Regression for Survival Data. Appendix to An R and S-PLUS Companion to Applied Regression.



Sabtu, 21 Februari 2015

Statistik Dasar dalam R

Pernahkan anda bertanya-tanya bagaimana untuk menyelesaikan tugas statistik anda dengan sangat cepat?. Atau anda hanya ingin cara cepat untuk memverifikasi perhitungan membosankan anda dalam tugas kelas statistik. Jawabannya ada di sini yaitu dengan memecahkan latihan statistik dengan R.

Di sini, anda akan menemukan masalah statistik yang mirip dengan permasalahan dalam buku teks perguruan tinggi populer. Dengan modifikasi sederhana dan contoh kode dapat diubah menjadi jawaban pekerjaan rumah anda. Dalam tambahan untuk membantu dengan pekerjaan rumah anda, tutorial ini akan memberi anda seperti halnya bekerja dengan software statistik secara umum, dan akan terbukti sangat berharga dalam keberhasilan karir anda.

Namun demikian, bahkan jika anda tidak terlalu akrab dengan R, anda dapat membaca kembali halaman Pengenalan R. Lalu pergi langsung ke tutorial statistik, dan hanya datang kembali untuk referensi yang diperlukan. 

1. Data Kualitatif

Hal terpenting yang perlu diperhatikan dalam statistik adalah pengambilan data sample. Data sampel merupakan bagian dari populasi yang ingin diteliti; dipandang sebagai suatu pendugaan terhadap populasi, namun bukan populasi itu sendiri. Sampel dianggap sebagai perwakilan dari populasi yang hasilnya mewakili keseluruhan gejala yang diamati. Ukuran dan keragaman sampel menjadi penentu baik tidaknya sampel yang diambil. 

Sebagai latihan akan digunakan kumpulan data milik paket MASSA dan harus dipanggil dari dalam R sebelum digunakan.

> library(MASS)                     # memuat paket MASSA
> painters 


                Composition Drawing Colour Expression School
Da Udine                 10       8     16          3      A
Da Vinci                 15      16      4         14      A
Del Piombo                8      13     16          7      A
Del Sarto                12      16      9          8      A
Fr. Penni                 0      15      8          0      A
Guilio Romano            15      16      4         14      A
Michelangelo              8      17      4          8      A
Perino del Vaga          15      16      7          6      A
Perugino                  4      12     10          4      A
Raphael                  17      18     12         18      A
F. Zucarro               10      13      8          8      B
Fr. Salviata             13      15      8          8      B
Parmigiano               10      15      6          6      B
.................

Andaikan anda ingin mengambil salah satu variabel dari data yang ada langkah pertama adalah mengetahui nama setiap variabel data tersebut.

>  names(painters)                  # memuat nama variabel data
[1] "Composition" "Drawing"     "Colour"      "Expression"  "School"

> painters$School                   # memuat data variabel sekolah
 [1] A A A A A A A A A A B B B B B B C C C C C C D D D D D D D D D D      E E E E
[37] E E E F F F F G G G G G G G H H H H
Levels: A B C D E F G H


Frekuensi Distribusi  Data yang Kualitatif 

Distribusi frekuensi dari variabel data  adalah ringkasan terjadinya kumpulan data dengan kategori yang tidak saling tumpang tindih. Sebagai contoh yakni kumpulan data pelukis diatas, frekuensi distribusi variabel "School" adalah ringkasan dari sejumlah pelukis di sekolah masing-masing.

Contoh:

Carilah distribusi frekuensi sekolah pelukis di kumpulan  pelukis data tersebut.

Solusi:

Terapkan fungsi tabel untuk menghitung distribusi frekuensi variabel "Sekolah" .

> library(MASS)                  # memuat paket MASSA 
> sekolah = painters$School      # sekolah pelukis
> frekuensi = table(sekolah)     # menerapkan fungsi tabel
> frekuensi                      # Menampilkan frekuensi sekolah
sekolah         
 A  B  C  D  E  F  G  H 
10  6  6 10  7  4  7  4 

Anda juga dapat menerapkan fungsi cbind untuk mencetak hasil dalam format kolom.

>  cbind(frekuensi)
  frekuensi
A        10
B         6
C         6
D        10
E         7
F         4
G         7
H         4

Soal Latihan
Cari distribusi frekuensi skor komposisi pelukis.
Cari program sekolah yang memiliki pelukis paling banyak.


Relatif Frekuensi  Distribusi Data Kualitatif