No texto a seguir, foi aplicada técnicas de análise de sobrevivência de dados de sobrevida de pacientes acometidos pela doença de chagas do Hospital das Clínicas da Faculdade de Medicina da Universidade Federal de Minas Gerais.
head(dados)
# A tibble: 6 × 12
Tempo Obito Sexo Idade Classe_Funcional IAM Rochagan Beta_Bloqueador Bnp
<dbl> <dbl> <fct> <dbl> <fct> <fct> <fct> <fct> <dbl>
1 6.38 0 Femin… 59 3 Nao Nao Sim NA
2 6.38 0 Femin… 60 1 Nao Nao Nao NA
3 5.46 0 Femin… 55 3 Nao Nao Nao NA
4 6.25 0 Femin… 72 1 Nao Nao Nao NA
5 8.44 0 Femin… 48 3 Nao Sim Nao 544
6 7.77 0 Mascu… 88 3 Sim Nao Nao NA
# ℹ 3 more variables: Anticorpos <dbl>, ECG_Result <fct>, FE <dbl>
Tratamento de Dados
Na base de dados há dados faltantes. Dados faltantes serão sempre um problema, não há métodos perfeitos para a substituição de dados faltantes. Como pode ser visto abaixo, colunas como Idade, Bnp e FE ficam fortemente afetadas pela falta de dados:
Tempo Tem 7 Linhas Nulas
Obito Tem 0 Linhas Nulas
Sexo Tem 0 Linhas Nulas
Idade Tem 205 Linhas Nulas
Classe_Funcional Tem 8 Linhas Nulas
IAM Tem 1 Linhas Nulas
Rochagan Tem 0 Linhas Nulas
Beta_Bloqueador Tem 13 Linhas Nulas
Bnp Tem 599 Linhas Nulas
Anticorpos Tem 16 Linhas Nulas
ECG_Result Tem 27 Linhas Nulas
FE Tem 302 Linhas Nulas
Neste caso, opta-se por não seguir com FE e Bnp, devido ao seu alto valor de dados faltantes. Idade permance devida a sua importância apriorística para a análise. Além disso, opta-se por excluir as demais linhas, assumindo que esses dedos faltantes tem um padrão aleatório e sua remoção não gerará dados enviesados.
dados <-na.omit(subset(dados, select=-c(Bnp, FE)))
cat("Novo Dataset: ", nrow(dados), " Antes Eram:", N)
Novo Dataset: 744 Antes Eram: 1000
Analisando valor das variáveis:
par(mfrow =c(3,4), tck =0)for (column incolnames(dados)) {if (column =="Tempo"){cat(sum(dados$Tempo==0), "Linhas com valor 0 na Coluna Tempo (Modelo Exponencial não permite) \n")hist(dados$Tempo) }else {if (column =="Anticorpos"){hist(dados$Anticorpos) }else {if (column =="Idade"){hist(dados$Idade) }else {barplot(table(dados[column]),main=column)}} }}
0 Linhas com valor 0 na Coluna Tempo (Modelo Exponencial não permite)
Os valores estão de acordo ao que foi documentado no dicionário de dados, então pode-se seguir com a analise.
Análise exploratória
Estimando um Kaplan-Meier sem o uso de covariáveis e plotando o modelo:
ekm <-survfit(Surv(Tempo, Obito) ~1, data = dados)ggsurvplot(ekm)
Analisando covariáveis qualitativas:
Plotando um Kaplan-Meier condicionado as variáveis qualitativas
ekm_1 <-survfit(Surv(Tempo, Obito) ~ Sexo, data = dados)ekm_2 <-survfit(Surv(Tempo, Obito) ~ Classe_Funcional, data = dados)ekm_3 <-survfit(Surv(Tempo, Obito) ~ IAM, data = dados)ekm_4 <-survfit(Surv(Tempo, Obito) ~ Rochagan, data = dados)ekm_5 <-survfit(Surv(Tempo, Obito) ~ Beta_Bloqueador, data = dados)ekm_6 <-survfit(Surv(Tempo, Obito) ~ ECG_Result, data = dados)splots <-list()splots[[1]] <-ggsurvplot(ekm_1, title ="Sexo", conf.int =TRUE)splots[[2]] <-ggsurvplot(ekm_2, title ="Classe_Funcional", conf.int =TRUE)splots[[3]] <-ggsurvplot(ekm_3, title ="IAM", conf.int =TRUE)splots[[4]] <-ggsurvplot(ekm_4, title ="Rochagan", conf.int =TRUE)splots[[5]] <-ggsurvplot(ekm_5, title ="Beta Bloqueador", conf.int =TRUE)splots[[6]] <-ggsurvplot(ekm_6, title ="ECG_Result", conf.int =TRUE)arrange_ggsurvplots(splots, ncol =3, nrow =2, )
Todas as variáveis qualitativas pareceram promissoras para a análise. A Classe_Funcional parece ter uma diferençar entre o nível 1 e os demais, mas uma semalhança entre 2, 3 e 4.
Estudo do efeito das covariáveis quantitativas:
Analisando Anticorpos e Idade (quebrando as variáveis em 3 níveis):
ekm_7 <-survfit(Surv(Tempo, Obito) ~cut_interval(Anticorpos, 3), data = dados)ekm_8 <-survfit(Surv(Tempo, Obito) ~cut_interval(Idade, 3), data = dados)splots <-list()splots[[1]] <-ggsurvplot(ekm_7, title ="Anticorpos", conf.int =TRUE)splots[[2]] <-ggsurvplot(ekm_8, title ="Idade", conf.int =TRUE)arrange_ggsurvplots(splots, ncol =2, nrow =1)
Anticorpos não pareceram tão promissores quanto Idade como variáveis significativas.
Modelos de regressão paramétricos
m0ex <-survreg(Surv(Tempo, Obito) ~ ., dist ="exponential", data = dados)m0we <-survreg(Surv(Tempo, Obito) ~ ., dist ="weibull", data = dados)m0ln <-survreg(Surv(Tempo, Obito) ~ ., dist ="lognormal", data = dados)summary(m0ex)
Call:
survreg(formula = Surv(Tempo, Obito) ~ ., data = dados, dist = "exponential")
Value Std. Error z p
(Intercept) 6.41e+00 7.99e-01 8.02 1.1e-15
SexoFeminino 7.56e-01 2.00e-01 3.79 0.00015
Idade -2.64e-02 8.08e-03 -3.26 0.00110
Classe_Funcional2 -6.93e-01 3.06e-01 -2.26 0.02353
Classe_Funcional3 -2.76e-01 2.15e-01 -1.28 0.19888
Classe_Funcional4 1.53e+01 3.36e+03 0.00 0.99636
IAMSim -5.28e-01 3.19e-01 -1.66 0.09781
RochaganSim 3.35e-01 2.87e-01 1.17 0.24303
Beta_BloqueadorSim -6.31e-01 2.03e-01 -3.11 0.00190
Anticorpos -8.40e-03 4.38e-02 -0.19 0.84801
ECG_ResultMaiores -1.28e+00 2.83e-01 -4.51 6.4e-06
Scale fixed at 1
Exponential distribution
Loglik(model)= -487.9 Loglik(intercept only)= -537.9
Chisq= 100.02 on 10 degrees of freedom, p= 5.4e-17
Number of Newton-Raphson Iterations: 16
n= 744
chisq df p
Idade 0.790 1 0.37
Sexo 0.016 1 0.90
Classe_Funcional 0.919 3 0.82
Beta_Bloqueador 0.169 1 0.68
ECG_Result 1.706 1 0.19
GLOBAL 3.446 7 0.84
Nesse caso, nenhuma das covariáveis fugiu da suposição de proporcionalidade na razao da taxa de falhas. Pode-se fazer uma análise de Schoenfeld para confirmar isto.
Avaliação dos resíduos de Schoenfeld
ggcoxzph(zph1[1:2])
ggcoxzph(zph1[3:4])
ggcoxzph(zph1[5])
A hipótese de proporcionalidade não é rejeitada, sendo este o modelo final de cox.
Discussões e Resultados:
Intervalos de Confiança e Interpretação de Coeficientes do Modelo de Cox:
Nesse caso, temos que, por exemplo, que o sexo feminino está relacionado com uma redução de risco de 57,5% de morte. Analisando a mesma variável no modelo lognormal:
Para o modelo lognormal o coeficiente da covariável idade foi POSITIVA, com sinal oposto ao modelo de COX. Isso acontece porque o modelo lognormal modela o TEMPO ATÉ A FALHA (no caso, morte do paciente chagásico). Ou seja, quanto maior a idade, menor o tempo até a morte do paciente. Já o modelo de COX modela o RISCO da falha. Isso é, quanto maior a idade, maior o RISCO de morte.
Para o modelo lognormal, pode ser interpretado em função de tempos medianos. Nesse caso sexo feminino está relacionado com um tempo mediano de falha 53% maior que sexo masculino. Isso é para o modelo de Cox, mulheres tem um risco menor de morte, para o modelo lognormal mulheres tem um tempo de vida mediano maior.