Magdalena Mazurek
14 stycznia 2017
Cel:
Zaznajomienie się (bądź przypomnienie) z podstawowymi pojęciami analizy przeżycia oraz z rodzajami reszt w modelu Coxa.
Motywacje:
Sprawdzenie czy jest możliwe wykorzystanie reszt w modelach wielostanowych, w szczególności w konkurencyjnych ryzykach.
\(T\) - czas do wystąpienia zdarzenia (zgon/nawrót choroby/ progersja choroby), ale …
Występują zatem sytuacje, dla których nie obserwujemy dokładnego czasu zdarzenia \(T\).
Mamy wtedy do czynienia z cenzurowaniem.
Możemy obserwować różne typy cenzurowania, takie jak:
Dla cenzurowania prawostronnego obserwujemy czas do wystąpenia zdarzenia: \[ T = min(\tilde{T}, C) \]
W praktyce obserwujemy pary \((T,\delta)\), gdzie \(\delta=\mathbb{I}(\tilde{T}, C)\) jest wskaźnikiem cenzurowania.
patientID | intens | time | vomit |
---|---|---|---|
1 | 1 | 30 | 1 |
2 | 1 | 50 | 1 |
3 | 1 | 50 | 0 |
4 | 1 | 51 | 1 |
5 | 1 | 66 | 0 |
6 | 1 | 82 | 1 |
Funkcja przeżycia: \(S(t) = \mathbb{P}(\tilde{T} \geq t)\). Uwaga! \(S(0)=1\)
Funkcja hazardu: \(\lambda(t) = \lim\limits_{h \rightarrow 0^+} \frac{\mathbb{P}(t \leq \tilde{T} < t+h | \tilde{T} \geq t)}{h}\).
Zależność występująca pomiędzypowyższymi funkcjami: \[ S(t) = e^{-\int\limits_0^t \lambda(u)du} \]
Załóżmy, że mamy wektor zmiennych niezależnych: \[ \textbf{Z}(t)'=(Z_1(t),Z_2(t),\ldots,Z_p(t)) \] Model Coxa zakłada następującą postać funkcji hazardu: \[ \lambda(t,\textbf{Z}(t))=\lambda_0(t)\cdot e^{\beta'\textbf{Z}(t)} \]
Dla \(\textbf{Z}(t)=\textbf{Z}\) otrzymujemy model proporcjonalnych hazardów.
Interpretacja założenia: Niech \(\textbf{Z}\) będzie zmienną opisującą wielkość guza:
Wówczas funkcja hazardu dla poszczególnych rozmiarów guza wynosi:
Model zakłada, że wzrost \(\textbf{Z}\) o 1 zwiększa hazard o \(e^\beta\) razy.
Wykres skalowanych reszt Schoenfelda dla pewnej funkcji czasu \(g(t)\).
Dla czasów zdarzeń \(t_{(k)}\): \[ \hat{r}_{Sk} = \sum\limits_{i: t_{(i)}=t_{(k)}} \big\{ Z_{(k)}(t_{(k)}) - \overline{Z}(\hat{\beta},t_{(k)}) \big\}^T \] \[ \hat{r}_{Sk}^* = \hat{r}_{Sk} Var^{-1}(\hat{\beta},t_{(k)}) \]
model_PH <- coxph(Surv(futime,fustat)~., data=ovarian)
model_PH_test<-cox.zph(model_PH,transform = "identity")
plot(model_PH_test, df=3, nsmo=10, se=TRUE, var=1)
abline(model_PH$coeff[1], 0, lty=5)
Reszty martyngałowe vis ciągła zmienna niezależna.
\[ M(t) = N(t) - \int\limits_0^t Y(u) \lambda_0 (u) e^{\beta^t Z(u)} du \] gdzie \(N(t)\) to procez zliczający zdarzenia, \(Y(t)\) to proces zbioru ekspozycji na ryzyko zdarzenia.
Jak znaleźć odpowiednie przekształcenie?
model_PH <- coxph(Surv(futime,fustat)~1, data=ovarian)
res_mart <- resid(model_PH)
plot(ovarian$age, res_mart)
lines(lowess(ovarian$age, res_mart, iter=0, f=0.6))
Wykres reszt martyngałowych (lub dewiancji) vis liniowa kombinacja zmiennych.
Reszty oparte na dewiancji dla zmiennych niezależnych stałych w czasie: \[ \hat{r}_{Di} = \text{sign}(\hat{M}_i) \sqrt{-\hat{M}_i - \delta_i \log(\delta_i - \hat{M}_i)} \]
Uwaga! Z reguły reszty są symetrczne i mieszczą się w przedziale \((-2,2)\).
model_PH <- coxph(Surv(survtime, survind) ~ mutation + expression, data=nsclc)
res_dev <- residuals(model_PH,type="deviance")
fit_val <- predict(model_PH,type="lp")
plot(fit_val, res_dev)
Reszty score vis zmienna niezależna.
Reszta “score” dla obserwacji i i zmiennej j: \[ \hat{r}_{U_{ij}} = U_{ij} (\hat{\beta},\infty), \qquad U_{ijk}(\beta) = \int\limits_{t_{(k-1)}}^{t_k} \big\{ Z_{ij}(u) - \overline{Z}_j(\beta,u) \big\} dM_i(u) \]
model_PH <- coxph(Surv(futime,fustat)~., data=ovarian)
score <- resid(model_PH, type="score")
plot(ovarian$age, score[,1], ylab="Score Residuals", xlab="Age")
survival
Postać danych
patnr | time | status | cause | ccr5 |
---|---|---|---|---|
1 | 9.106 | 1 | AIDS | WW |
2 | 11.039 | 0 | event-free | WM |
3 | 2.234 | 1 | AIDS | WW |
4 | 9.878 | 2 | SI | WM |
5 | 3.819 | 1 | AIDS | WW |
Dane przekształcone
patnr | time | status | cause | ccr5 | event | si |
---|---|---|---|---|---|---|
1 | 9.106 | 1 | AIDS | WW | 1 | 2 |
2 | 11.039 | 0 | event-free | WM | 0 | 0 |
3 | 2.234 | 1 | AIDS | WW | 1 | 2 |
4 | 9.878 | 2 | SI | WM | 1 | 1 |
5 | 3.819 | 1 | AIDS | WW | 1 | 2 |
Model PH dal funkcji hazardu
coxph_aids <- coxph(Surv(time, status == 1) ~ ccr5, data = aidssi)
coxph_si <- coxph(Surv(time, status == 2) ~ ccr5, data = aidssi)
Reszty Schoenfelda
model_PH_test<-cox.zph(coxph_aids,transform = "identity")
plot(model_PH_test, df=3, nsmo=10, se=TRUE, var=1)
abline(coxph_aids$coeff[1], 0, lty=5)
Reszty dewiancji
res_dev <- residuals(coxph_aids,type="deviance")
fit_val <- predict(coxph_aids,type="lp")
plot(fit_val, res_dev)
mstate
library(mstate)
tmat <- transMat(list(c(2,3,5,6), c(4,5,6), c(4,5,6), c(5,6), c(), c()),
names=c("Tx", "Rec", "AE", "Rec+AE", "Rel", "Death"))
msebmt <- msprep(
data = ebmt4, trans = tmat,
time = c(NA, "rec", "ae", "recae", "rel", "srv"),
status = c(NA, "rec.s", "ae.s", "recae.s", "rel.s", "srv.s"),
keep = c("match", "proph", "year", "agecl"))
msebmt2 <- expand.covs(msebmt, longnames = FALSE, c("match", "proph", "year", "agecl"))
msebmt2[, c("Tstart", "Tstop", "time")] <- msebmt2[, c("Tstart", "Tstop", "time")]/365.25
knitr::kable(msebmt2[msebmt2$id == 1, (1:9)])
id | from | to | trans | Tstart | Tstop | time | status | match |
---|---|---|---|---|---|---|---|---|
1 | 1 | 2 | 1 | 0.0000000 | 0.0602327 | 0.0602327 | 1 | no gender mismatch |
1 | 1 | 3 | 2 | 0.0000000 | 0.0602327 | 0.0602327 | 0 | no gender mismatch |
1 | 1 | 5 | 3 | 0.0000000 | 0.0602327 | 0.0602327 | 0 | no gender mismatch |
1 | 1 | 6 | 4 | 0.0000000 | 0.0602327 | 0.0602327 | 0 | no gender mismatch |
1 | 2 | 4 | 5 | 0.0602327 | 2.7241615 | 2.6639288 | 0 | no gender mismatch |
1 | 2 | 5 | 6 | 0.0602327 | 2.7241615 | 2.6639288 | 0 | no gender mismatch |
1 | 2 | 6 | 7 | 0.0602327 | 2.7241615 | 2.6639288 | 0 | no gender mismatch |
model <- coxph(Surv(Tstart, Tstop, status)~strata(trans), data = msebmt2, method = "breslow")
model_fit <- msfit(object = model, vartype = "greenwood", trans = tmat)
coxph
.coxph
jest niemożliwe.