top of page
  • Foto do escritorFernanda Kelly

A estatística está em tudo: Análise de sobrevida

Acredita que esse foi um assunto que eu sempre corri na graduação? E ainda batia no peito para dizer que eu NUNCA (e a fala era com todas as minhas forças e convicção tá?) ia trabalhar com saúde e menos ainda cursar a disciplina Análise de Sobrevivência com o meu querido professor Márcio Augusto. A única fala que se tornou verdade aí foi a parte de não cursar a disciplina Análise de Sobrevivência e, ainda assim, cá estou para dissertar um pouquinho do que aprendi sobre Análises de Sobrevida na área da saúde.


A primeira dúvida que eu tive foi,


Análise de sobrevivência é diferente de Análise de sobrevida?

Não, não é diferente. São apenas nomes diferentes para se referir a mesma coisa: Área que tem como propósito estudar/analisar o tempo de duração esperado até a acorrência de um ou mais desfechos de interesse. E como sou cria de séries temporais, questionei,


Como assim tempo de duração? É Séries Temporais?

Na época, eu não tinha muita noção de epidemiologia e, por isso, acho que o meu questionamento era válido naquele momento. Por isso, se você tem o mesmo questionamento, vou lhe poupar o tempo de pesquisa, então desmistificando, a relação do tempo em análise de sobrevida não é a mesma relação de tempo de séries temporais. Veja que em séries temporais a série deve ser no minímo longa e com muitas observações, já o tempo da sobrevida é um tempo pontual.


Tempo pontual?

Sim! Vamos criar um cenário para melhor compreensão. Atualmente estamos passando por uma vacinação em massa para prevenção e/ou redução de sintomas graves do Coronavírus (COVID-19) e, consequentemente, muito se fala sobre reações da vacina, duração de sintomas da COVID-19, eventos adversos como dor no local da injeção e vários outros fatores relacionados a vacina e a COVID-19. Mas, uma pergunta que não tem quem não fez ao longo desses três anos de pandemia foi,


Foi forte? Quanto tempo você ficou ruim? Internou? Vixi...

O tempo que esse indivíduo ficou ruim é o tempo de duração de sintomas. Esse tempo é pontual. Se perguntamos a ele hoje e essa resposta é 15 dias, amanhã essa resposta também deve ser 15 dias.


E se ele falar 11 dias?

Nesse caso vamos tratar como viés de memória e não perguntar mais. Brincadeira viu? Essa diferença em dias é um viés de memória e vai do pesquisador como tratar esse viés. No entanto, o tempo de duração de sintomas é um tempo pontual. Se o interesse do pesquisador for prever a internação através de séries temporais, teríamos que dispor de alguma observação de interesse que de alguma forma fosse coletada por um período de tempo.


Mas nesse caso não seria Análise de dados Longitudinais?

Agora vou ter que apelar para o querido professor Caio Azevedo do IME - Unicamp que explica assim,


Dados longitudinais: uma ou mais de uma variável medida de muitos indivíduos ao longo de (poucas) condições (mesmo sendo o tempo, profundidade).

Séries temporais: uma ou mais de uma variável medida de poucos (ou somente um) indivíduo(s) (que também podem fazer papel de variável) ao longo de muitos instantes no tempo.


É complicado? É, mas não tem como correr desses questionamentos na vida real e, como aqui é só um post sobre Análise de sobrevida, nós vamos correr sim e sem olhar para trás.


Então, o que é Análise de Sobrevida?

A análise de sobrevivência será utilizada quando o tempo for o objeto de interesse, seja este interpretado como o tempo até a ocorrência de um evento ou o risco de ocorrência de um evento por unidade de tempo. Em análise de sobrevivência, a variável resposta é, geralmente, o tempo até a ocorrência de um evento de interesse. Esse tempo é denominado tempo de falha, que é o mesmo tempo que venho denominando por tempo pontual. Logo, o tempo de falha observado ou de interesse pode ser descrito como o tempo de sobrevivência de pacientes, tempo até a cura, tempo de desemprego de certa categoria profissional, tempo em que um cliente permanece fiel a certo produto e por aí vai.


De acordo com esses exemplos de tempo aí fer, percebi que sobrevida não é utilizado somente na área da saúde, certo?

Certissíme! Essa análise é muito rica e para quem sabe utilizá-la corretamente saí na frente de muitos modelos de Machine Learning por aí e claro, as vezes temos nomes diferentes para a mesma análise dependendo da área. Por exemplo, na engenharia essa análise é chamada de confiabilidade. Mas vamos concentrar no que importa...


Como eu faço essa análise?

Primeiro vamos falar de um pacote muito conhecido nessa área que é o pacote Survival. Ele contém as principais rotinas de análise de sobrevivência, incluindo a definição de objetos Surv, curvas Kaplan-Meier e Aalen-Johansen (multiestado), modelos Cox e modelos paramétricos de tempo de falha acelerada. É simplesmente o monstro da análise de sobrevida e, por isso, vamos juntes nos horrorizar por tamanha excelência.


O Survival aborda dois grandes temas dessa área: curvas Kaplan-Meier e modelos Cox ou modelo de taxas de falhas proporcionais, que normalmente andam de mãos dadas em várias (quase todas) análises desse tipo. E como atualmente esses são os modelos mais populares na análise de dados de sobrevida na área clínica/biológica, é neles que vamos focar.

O modelo de regressão de Cox é caracterizado pelos coeficientes betas que medem os efeitos das covariáveis sobre a função de taxa de falha e nós queremos fazer inferência nos coeficientes betas a partir das observações amostrais.


Se tem o nome regressão tem pressupostos né?

Com o objetivo de encontrar um modelo mais flexível, Cox propôs em 1972 um modelo, denominado modelo de risco proporcional de Cox. O princípio básico deste modelo para estimar o efeito das covariáveis é a proporcionalidade dos riscos ao longo de todo o tempo de observações, e é aí que Kaplan-Meier entra na jogada. E ele entra devido a uma palavrinha do modelo: risco proporcional. Vou te explicar o porquê...


Vamos voltar ao exemplo de duração de sintomas da COVID-19 e considerar os gêneros feminino e masculino. De acordo com o princípio da proporcionalidade o risco no tempo t para pacientes do gênero feminino é proporcional ao risco, no mesmo tempo, para pacientes do gênero masculino.


Conseguiu entender essa proporcionalidade?

Não? Vamos de exemplo com visualização. No pacote survival você vai encontrar alguns bancos de dados bem interesseantes sobre o tema, mas aqui vamos utilizar o cgd que se refere a Doença Granulotâmica Crônica no português. O banco de dados cgd é composto por 203 observações e 16 variáveis. Os dados são de um estudo controlado por placebo de interferon gama na doença granulotômica crônica (CGD). Contém os dados sobre o tempo de infecções graves observadas até o final do estudo para cada paciente.


install.packages("survival")
library(survival)
dados_cgd <- survival::cgd

Vamos utilizar as seguintes variáveis:

  • treatment que indica placebo ou gamma interferon (rIFN-g)

  • sex que indica o gênero (female ou male)

  • age que indica a idade do paciente

  • tstart, tstop que indicam início e fim de cada intervalo de tempo em dias

  • status que indica 1 quando o participante termina com uma infecção e 0 quando o participante não termina com uma infecção

É muito importante ressaltar aqui que nesse primeiro exemplo nós estamos trabalhando com um ponto em específico do tratamento e não o caso longitudinal. O caso longitudinal vou explicar mais a frente o que seria ele, mas agora foca lá no tempo pontual.


O nosso interesse é entender se o tempo de tratamento intefere ou não em o paciente adquirir uma infecção ou não de acordo com o gênero. Aqui nós precisamos verificar se o risco de adquirir infecção ao longo do tempo é proporcional ao gênero e pra isso vamos utilizar o tal do Kaplan-Meier.


#verificar a proporcionalidade
exemplo_1 <- survival::survfit(Surv(tstop, status) ~ sex,
                               data = dados_cgd)

ggplot2::autoplot(exemplo_1, conf.int = F) +
  labs(x="Tempo de Duração do Tratamento (Dias)",
       y="Probabilidade de Sobrevivência",
       title="Kaplan-Meier Unidade de tratamento", colour="Gênero")

O produto do código acima é este espetacular gráfico abaixo.



Uma interpretação visual que nós temos a partir desse gráfico é a censura. A censura nada mais é que que esses pontinhos pretos ao longo das linhas, que representa que o estudo terminou e não observou-se a falha, ou seja, não adquiriu infecção durante o estudo. Voltando ao exemplo...


Há proporcionalidade?

Entre 250 e 390 dias podemos observar que claramente não há proporcionalidade entre o gênero female e o male. O ideal seria que as linhas de risco estivesem próximas e, por isso, nós utilizamos do Kaplan-Meier para nos ajudar nessa identificação. E é claro que a visualização nos ajuda MUITO nessa sinuca de bico que ficamos e, por isso, vou te indicar mais uma forma (bem melhor) de visualização do Kaplan-Meier.


install.packages("survminer")
library(survminer)
survminer::ggsurvplot(exemplo_1, data = dados_cgd,
                      pval = TRUE, conf.int = TRUE,
                      risk.table = TRUE, 
                      risk.table.col = "strata", 
                      linetype = "strata", 
                      ggtheme = theme_bw(), 
                      palette = c("#E7B800", "#2E9FDF"))

O produto do código acima é este sensacional e grandioso gráfico abaixo.



E como este gráfico é sensacional e grandioso, em seus parâmetros conseguimos indicar que queremos o p-value do teste de hipótese do teste log-rank. Esse teste compara a distribuição da ocorrência dos eventos observados em cada estrato com a distribuição que seria esperada se a incidência fosse igual. Logo, de acordo com o gráfico, nós não rejeitamos a hipótese nula, ou seja, não há diferença entre os estratos (gêneros) quando estamos falando de adquirir infecção ao longo do tratamento.


É muita informação?

Vou ter que concordar contigo que é sim, mas estudar Análise de sobrevida sem estudar Kaplan-Meier e teste Log-rank não é estudar Análise de sobrevida. Entender o que cada um faz é crucial e faz de você uma pessoa diferenciada no mercado.


Vamos para a modelagem?

Claro! E vou te dizer que a modelagem é a parte mais fácil de todo esse esquema. Olha aí...


########################
#    MODELO AJUSTADO   #
########################
modelo_Ajustado <- survival::coxph(Surv(tstop, status) ~ sex+ age+ treat,
                                   data = dados_cgd, x = T)
base::summary(modelo_Ajustado)

A saída para interpretação está abaixo.


Call:
survival::coxph(formula = Surv(tstop, status) ~ sex + age + treat, 
    data = dados_cgd, x = T)

  n= 203, number of events= 76 

                coef exp(coef) se(coef)      z Pr(>|z|)    
sexfemale    0.04689   1.04801  0.33343  0.141 0.888161    
age         -0.02349   0.97678  0.01350 -1.739 0.081955 .  
treatrIFN-g -0.92742   0.39557  0.26330 -3.522 0.000428 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

            exp(coef) exp(-coef) lower .95 upper .95
sexfemale      1.0480     0.9542    0.5452    2.0146
age            0.9768     1.0238    0.9513    1.0030
treatrIFN-g    0.3956     2.5280    0.2361    0.6627

Concordance= 0.631  (se = 0.034 )
Likelihood ratio test= 16.94  on 3 df,   p=7e-04
Wald test            = 15.36  on 3 df,   p=0.002
Score (logrank) test = 16.2  on 3 df,   p=0.001

Nessa modelagem a nossa interpretação é por risco relativo, por isso há o exp(coef) na saída acima. Veja em Pr(>|z|) que, ao nível de 95% de significância, somente o tratamento é significativo. A interpretação do estimador é a seguinte,


O risco de infecção em pacientes cujo o tratamento foi placebo é de 0.39 vezes o risco daqueles pacientes que tiveram tratamento a base de gamma interferon. Além disso, podemos afirmar com 95% de confiança que esse risco varia entre 0.23 e 0.66.


Atente-se que o efeito das covariáveis é de acelerar ou desacelerar a função de taxa de falha/risco.


Vamos fazer um Kaplan-Meier dos tratamentos avaliados?

Segue o código.

exemplo_2 <- survival::survfit(Surv(tstop, status) ~ treat,
                               data = dados_cgd)

survminer::ggsurvplot(exemplo_2, data = dados_cgd,
                      pval = TRUE, conf.int = TRUE,
                      risk.table = TRUE, 
                      risk.table.col = "strata", 
                      linetype = "strata", 
                      ggtheme = theme_bw(), 
                      palette = c("#E7B800", "#2E9FDF"))

O produto desse gráfico se encontra abaixo. O link entre o resultado da modelagem e a Kaplan-Meier eu vou deixar pra você, tipo aquelas demostrações de cálculo 1, sabe? Só que dessa vez é mais fácil. Mas se você tiver dúvida comenta aí que eu te ajudo.




Agora, tem uma coisinha que quero MUITO que você saia desse post com ela na cabeça e de cor e salteado...


O exemplo que nós utilizamos aqui não leva em conta se ao longo do tempo ele está recebendo doses diferentes do tratamento em questão. Mas, se um dia você for trabalhar com análise de sobrevivência com interesse em algum desfecho e esse desfecho está atrelado a um acompanhamento de administração de medicamento diferente ao longo do tempo, essa NÃO é a forma correta de analisar.


E qual é a forma correta Fer?

Como já trabalhamos com o banco de dados cgd, agora vamos trabalhar com o banco de dados cgd0. O conjunto de dados cgd0 está na forma encontrada nas referências, com uma linha por paciente e sem recodificação das variáveis. O conjunto de dados cgd0 foi convertido no formato (iniciar, parar] com uma linha por evento e covariáveis, com o centro recodificado como fatores para incluir rótulos significativos.


dados_cgd0 <- survival::cgd0

Neste banco de dados vamos ter tempos de 1 a 7. Esses tempos contam, em dias, o tempo até a infecção, ou seja, se o participante tiver duas infecções, na linha respectiva ao seu ID teremos o tempo 1 e o tempo 2 preenchidos. Abre o banco de dados que utilizamos anteriormente e faça a comparação entre eles, isso vai te ajudar a diferenciar a tratativa de cada caso.


O que precisamos fazer?

Precisamos transformar isso em um conjunto de dados que tenha sobrevivência em uma forma de processo de contagem. Cada linha do banco de dados resultante representa um intervalo de tempo, por exemplo, se o participante teve duas infecções, o tempo deve ser (time1, time2]. Atente-se que o lado está aberto a esquerda e fechado a direita.


Para construir essa ideia no R, nós vamos precisar de uma função do pacote survival denominada tmerge. Ela existe porquê essa tarefa que pretendemos fazer é comum na análise de sobrevivência onde é necessário a criação de conjuntos de dados start,stop que possuem vários intervalos para cada participante, juntamente com os valores de covariáveis que se aplicam a esse intervalo. Esta função auxilia na criação de tais conjuntos de dados.


Vamos lá?

A primeira missão é a construção desse novo banco de dados.


new_cgd0 <- survival::tmerge(data1 = dados_cgd0[, 1:13], data2 = dados_cgd0, id=id, tstop=futime) %>% 
           survival::tmerge(dados_cgd0, id=id, infect = event(etime1))  %>%
           survival::tmerge(dados_cgd0, id=id, infect = event(etime1))  %>%  
           survival::tmerge(dados_cgd0, id=id, infect = event(etime2))  %>%  
           survival::tmerge(dados_cgd0, id=id, infect = event(etime3))  %>%  
           survival::tmerge(dados_cgd0, id=id, infect = event(etime4))  %>%  
           survival::tmerge(dados_cgd0, id=id, infect = event(etime5))  %>%  
           survival::tmerge(dados_cgd0, id=id, infect = event(etime6))  %>% 
           survival::tmerge(dados_cgd0, id=id, infect = event(etime7))    
  
new_cgd0 <-  survival::tmerge(new_cgd0, new_cgd0, id, enum = cumtdc(tstart))

Aqui nós temos que conversar sobre a variável enum. Essa variável é uma variável de contagem, em que começa em 0 para participante e se torna 1 no momento do evento e, como ela é cum, esse evento é cumulativo caso exista mais de um evento. É importante que você faça essa avaliação no banco de dados e entenda o processo dessa variável.


Após a construção do banco de dados, nós podemos observar que há as seguintes novas variáveis:


  • tstart que indica o tempo inicial

  • tstop que indica o tempo final

  • infec que indica os eventos de infecções

Agora é o momento de correr para o abraço?

Sim! Vamos modelar. Veja que temos alguns parâmetros a mais na fórmula dessa vez.


modelo_Tempo <- survival::coxph(Surv(tstart, tstop, infect) ~ sex + age + 
                                treat, data = new_cgd0, cluster = id)
base::summary(modelo_Tempo)

A saída para interpretação está abaixo.


Call:
survival::coxph(formula = Surv(tstart, tstop, infect) ~ sex + 
    age + treat, data = new_cgd0, cluster = id)

  n= 203, number of events= 76 

          coef exp(coef) se(coef) robust se      z Pr(>|z|)    
sex   -0.08275   0.92058  0.33098   0.36614 -0.226 0.821189    
age   -0.03002   0.97043  0.01330   0.01415 -2.122 0.033876 *  
treat -1.11911   0.32657  0.26130   0.31018 -3.608 0.000309 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

      exp(coef) exp(-coef) lower .95 upper .95
sex      0.9206      1.086    0.4492    1.8868
age      0.9704      1.030    0.9439    0.9977
treat    0.3266      3.062    0.1778    0.5998

Concordance= 0.664  (se = 0.04 )
Likelihood ratio test= 25.96  on 3 df,   p=1e-05
Wald test            = 16.55  on 3 df,   p=9e-04
Score (logrank) test = 24.84  on 3 df,   p=2e-05,   Robust = 11.16  p=0.01

  (Note: the likelihood ratio and score tests assume independence of
     observations within a cluster, the Wald and robust score tests do not).

A interpretação é idêntica a anterior. Para saber mais sobre esse método, clica aqui. Lhe desejo paciência e muita inteligência nesse estudo. Qualquer dúvida me chama que a gente conversa sobre ele.


Então, o que fica de aprendizado?

O aprendizado é que nem tudo que reluz é ouro. Você tem que entender do negócio e saber na ponta da língua o que deve ou não ser considerado em sua análise de sobrevida. Mas, se você parar pra pensar, a Análise de sobrevida não é complicada, ela só é trabalhosa.


Gostou?

Se sim, vou te deixar um desafio de vida real.


1° desafio: Tente construir o banco de dados cgd0 a partir do banco de dados cgd.


Com toda certeza, se você for trabalhar com esse método, o data wrangling tem que estar tinindo por aí.


Bons estudos!


Fernanda Kelly R. Silva | Estatística

Posts recentes

Ver tudo
bottom of page