Vamos estudar e avaliar os fatores associados a sobrevivencia dos pacientes a partir do momento que eles entram na UTI com dados provenientes de 200 pacientes internados com cancer no hospital INCA.

library('survival')
library('flexsurv')
library('survminer')
## Loading required package: ggplot2
## Loading required package: ggpubr
## 
## Attaching package: 'survminer'
## The following object is masked from 'package:survival':
## 
##     myeloma
dados<-read.table("UTI.txt",header=T)
head(dados)
##   tempo status sexo idade gptumor desnut comorbi leucopenia
## 1   182      0    M    41    Loco    nao     nao        nao
## 2    66      1    M    24    Loco    nao     nao        nao
## 3   182      0    F    62    Loco    nao     nao        nao
## 4   182      0    F    72    Loco    nao     nao        nao
## 5   182      0    M    66  Hemato    nao     nao        nao
## 6     7      1    M    47     Mtx    nao     nao        nao

Análise não paramétrica

Vamos iniciar então análise não-paramétrica dos dados

Temos uma variável quantitativa na base então primeiro vamos discretizar ela utilizando a mediana como corte. Essa abordagem diminui a precisão por desconsiderar a grandeza dos valores

dados = dados |> dplyr::mutate(idade_fa = ifelse(idade<=median(idade), "Menos que 61", "Mais que 61"))

Iniciando a análise vamos verificar graficamente as curvas de sobrevivência kaplan-meier para cada variável independente

ekm1<- survfit(data=dados,formula = Surv(tempo,status)~sexo,
               conf.type = "log-log", conf.int=0.95)
ggsurvplot(ekm1,legend.title = "Sexo",
           legend.labs = c("Feminino","Masculino"),
           legend = c(0.2, 0.25),
           conf.int=T)+
  xlab("Tempo (dias)")+
  ylab("Sobrevivencia estimada")

ekm2<- survfit(data=dados,formula = Surv(tempo,status)~idade_fa,
               conf.type = "log-log", conf.int=0.95)
ggsurvplot(ekm2,legend.title = "Idade",
           legend.labs = c("Mais que 61","Menos que 61"),
           legend = c(0.2, 0.25),
           conf.int=T)+
  xlab("Tempo (dias)")+
  ylab("Sobrevivencia estimada")

ekm3<- survfit(data=dados,formula = Surv(tempo,status)~desnut,
               conf.type = "log-log", conf.int=0.95)
ggsurvplot(ekm3,legend.title = "Desnutrido",
           legend.labs = c("Não","Sim"),
           legend = c(0.2, 0.25),
           conf.int=T)+
  xlab("Tempo (dias)")+
  ylab("Sobrevivencia estimada")

ekm4<- survfit(data=dados,formula = Surv(tempo,status)~comorbi,
               conf.type = "log-log", conf.int=0.95)
ggsurvplot(ekm4,legend.title = "Comorbidade", 
           legend.labs = c("Não","Sim"),
           legend = c(0.2, 0.25),
           conf.int=T)+
  xlab("Tempo (dias)")+
  ylab("Sobrevivencia estimada")

ekm5<- survfit(data=dados,formula = Surv(tempo,status)~leucopenia,
               conf.type = "log-log", conf.int=0.95)
ggsurvplot(ekm5,legend.title = "Leucopenia",
           legend.labs = c("Não","Sim"),
           legend = c(0.2, 0.25),
           conf.int=T)+
  xlab("Tempo (dias)")+
  ylab("Sobrevivencia estimada")

ekm6<- survfit(data=dados,formula = Surv(tempo,status)~gptumor,
               conf.type = "log-log", conf.int=0.95)
ggsurvplot(ekm6,legend.title = "Tipo de tumor",
           legend.labs = c("Hemato","Loco","Mtx"),
           legend = c(0.2, 0.25),
           conf.int=T)+
  xlab("Tempo (dias)")+
  ylab("Sobrevivencia estimada")

Agora olharemos para os testes de comparação das curvas de sobrevivência de kaplan-meier para cada variável independente afim de verificar suas associações com a variável resposta utilizando as abordagens de logrank e peto.

Como temos uma variável qualitativa com mais de 2 curvas de sobrevivência vamos fazer um teste principal para verificar se há diferença entre os grupos

Teste de logrank

lr_gptumor<-survdiff(Surv(tempo,status)~gptumor, data=dados,rho=0)
lr_gptumor
## Call:
## survdiff(formula = Surv(tempo, status) ~ gptumor, data = dados, 
##     rho = 0)
## 
##                  N Observed Expected (O-E)^2/E (O-E)^2/V
## gptumor=Hemato  33       21     15.6      1.85      2.21
## gptumor=Loco   127       57     74.9      4.27     14.37
## gptumor=Mtx     40       30     17.5      8.93     10.98
## 
##  Chisq= 15.6  on 2 degrees of freedom, p= 4e-04

Teste de Peto

pt_gptumor<-survdiff(Surv(tempo,status)~gptumor, data=dados,rho=1)
pt_gptumor
## Call:
## survdiff(formula = Surv(tempo, status) ~ gptumor, data = dados, 
##     rho = 1)
## 
##                  N Observed Expected (O-E)^2/E (O-E)^2/V
## gptumor=Hemato  33     16.1     11.8      1.58      2.42
## gptumor=Loco   127     41.3     54.6      3.27     13.55
## gptumor=Mtx     40     22.6     13.5      6.04      9.40
## 
##  Chisq= 14.3  on 2 degrees of freedom, p= 8e-04

Usando os dois testes, de logrank e peto, para essa comparação e ao observar o p-valor nós rejeitamos a hipótese nula a nível 5% de significância nos dando evidências de que as curvas de sobrevivências dos 3 grupos são diferentes. Portanto abaixo faremos 3 subtestes para detectar essas diferenças (Gptumor loco x hemato,Gptumor hemato x mtx,Gptumor loco x mtx) além dos teste de comparação para o resto das variáveis.

lr_sexo<-survdiff(Surv(tempo,status)~sexo, data=dados,rho=0)
pt_sexo<-survdiff(Surv(tempo,status)~sexo, data=dados,rho=1)


lr_idade<-survdiff(Surv(tempo,status)~idade_fa, data=dados,rho=0)
pt_idade<-survdiff(Surv(tempo,status)~idade_fa, data=dados,rho=1)

gpt1 = dplyr::filter(dados,gptumor!="Mtx")
gpt2 = dplyr::filter(dados,gptumor!="Loco")
gpt3 = dplyr::filter(dados,gptumor!="Hemato")
lr_gptumor1<-survdiff(Surv(tempo,status)~gptumor, data=gpt1,rho=0)
pt_gptumor1<-survdiff(Surv(tempo,status)~gptumor, data=gpt1,rho=1)


lr_gptumor2<-survdiff(Surv(tempo,status)~gptumor, data=gpt2,rho=0)
pt_gptumor2<-survdiff(Surv(tempo,status)~gptumor, data=gpt2,rho=1)


lr_gptumor3<-survdiff(Surv(tempo,status)~gptumor, data=gpt3,rho=0)
pt_gptumor3<-survdiff(Surv(tempo,status)~gptumor, data=gpt3,rho=1)

lr_desnut<-survdiff(Surv(tempo,status)~desnut, data=dados,rho=0)
pt_desnut<-survdiff(Surv(tempo,status)~desnut, data=dados,rho=1)

lr_comorbi<-survdiff(Surv(tempo,status)~comorbi, data=dados,rho=0)
pt_comorbi<-survdiff(Surv(tempo,status)~comorbi, data=dados,rho=1)

lr_leucopenia<-survdiff(Surv(tempo,status)~leucopenia, data=dados,rho=0)
pt_leucopenia<-survdiff(Surv(tempo,status)~leucopenia, data=dados,rho=1)

comparar = rbind(c(lr_sexo$chisq,lr_sexo$pvalue,pt_sexo$chisq,pt_sexo$pvalue),
                 c(lr_idade$chisq,lr_idade$pvalue,pt_idade$chisq,pt_idade$pvalue),
                 c(lr_gptumor1$chisq,lr_gptumor1$pvalue,pt_gptumor1$chisq,pt_gptumor1$pvalue),       c(lr_gptumor2$chisq,lr_gptumor2$pvalue,pt_gptumor2$chisq,pt_gptumor2$pvalue),       c(lr_gptumor3$chisq,lr_gptumor3$pvalue,pt_gptumor3$chisq,pt_gptumor3$pvalue),
                 c(lr_comorbi$chisq,lr_comorbi$pvalue,pt_comorbi$chisq,pt_comorbi$pvalue),
                 c(lr_leucopenia$chisq,lr_leucopenia$pvalue,pt_leucopenia$chisq,pt_leucopenia$pvalue),
                 c(lr_desnut$chisq,lr_desnut$pvalue,pt_desnut$chisq,pt_desnut$pvalue))

rownames(comparar) = c('Sexo','Idade','Gptumor loco x hemato','Gptumor hemato x mtx','Gptumor loco x mtx','Comorbi','Leucopenia','Desnut')
colnames(comparar) = c('logrank-est','logrank-pvalor','peto-est','peto-pvalor')

comparar
##                       logrank-est logrank-pvalor   peto-est peto-pvalor
## Sexo                    1.6650144   0.1969276469  2.4218076 0.119656786
## Idade                   5.2278616   0.0222278441  6.0524047 0.013887371
## Gptumor loco x hemato   5.1431232   0.0233386252  5.3367700 0.020880126
## Gptumor hemato x mtx    0.6913963   0.4056898656  0.3470285 0.555800084
## Gptumor loco x mtx     14.3971719   0.0001480245 12.9304158 0.000323286
## Comorbi                 2.7750710   0.0957424085  2.4285432 0.119143575
## Leucopenia              8.8275851   0.0029671077  8.9845132 0.002722773
## Desnut                  1.0091821   0.3150988611  2.0421060 0.152997696

Olhando o p-valor das variáveis sexo, idade, comorbi e leucopenia e considerando o teste de logrank a nível 5% de significância nós rejeitamos a hipótese nula para Leucopenia ou seja temos evidências de que há diferença nessa curva de sobrevivência. Não foi o caso para sexo, comorbi nem idade Agora olhando o teste de peto tivemos resultados semelhantes porém desta vez rejeitamos a hipótese nula para Leucopenia e idade, diferentemente do teste de logrank. Novamente não rejeitamos a hipótese nula para sexo e comorbi

Analisando agora os 3 subtestes entre os grupos, nós iremos usar o nível de significância corrigido pelo método de bonferroni para não inflar o nível de significância na realização desses novos testes de hipóteses. Então teremos que \({\alpha}*=\frac{\alpha}{k} = \frac{0.05}{3} = 0.017\) e com isso rejeitamos hipoétese nula apenas no subteste entre os Grupos ‘Loxo x mtx’, logo temos evidências de que existe diferenças entre essas curvas de sobrevivência.Para os Grupos ‘loco x hemato’ e ‘hemato x mtx’ não rejeitamos a hipótese nula, logo temos evidências de que não há diferença nas curvas.

Modelo de regressão paramétrico

Reutilizando resultado anterior e de acordo com a literatura as variáveis com p-valor < 0.25 se mantém para a abordagem dos modelos de regressão. ## Devo olhar o p-valor do grupo tumor por si só ou olhar o p-valor da cada grupo?

Agora iremos verificar se cada variável é significativa

mod1 = flexsurvreg(data=dados,Surv(tempo,status)~sexo,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -2.8e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod2 = flexsurvreg(data=dados,Surv(tempo,status)~idade_fa,dist="gengamma.orig")
mod3 = flexsurvreg(data=dados,Surv(tempo,status)~gptumor,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -7.8e+01 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod4 = flexsurvreg(data=dados,Surv(tempo,status)~comorbi,dist="gengamma.orig")
mod5 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia,dist="gengamma.orig")
mod6 = flexsurvreg(data=dados,Surv(tempo,status)~desnut,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -1.6e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
tidy(mod1)
## # A tibble: 4 × 5
##   term   estimate std.error statistic p.value
##   <chr>     <dbl>     <dbl>     <dbl>   <dbl>
## 1 shape  7.98e- 2  2.52e- 3     NA     NA    
## 2 scale  2.79e-15  6.27e-18     NA     NA    
## 3 k      2.21e+ 1  1.95e+ 0     NA     NA    
## 4 sexoM -6.71e- 1  4.32e- 1     -1.55   0.121
tidy(mod2)
## # A tibble: 4 × 5
##   term                 estimate std.error statistic p.value
##   <chr>                   <dbl>     <dbl>     <dbl>   <dbl>
## 1 shape                7.68e- 2  1.52e- 2     NA    NA     
## 2 scale                7.69e-17  1.01e-15     NA    NA     
## 3 k                    2.42e+ 1  9.50e+ 0     NA    NA     
## 4 idade_faMenos que 61 1.02e+ 0  4.22e- 1      2.42  0.0154
tidy(mod3)
## # A tibble: 5 × 5
##   term         estimate std.error statistic p.value
##   <chr>           <dbl>     <dbl>     <dbl>   <dbl>
## 1 shape        8.22e- 2  2.55e- 3    NA     NA     
## 2 scale        2.38e-15  9.76e-18    NA     NA     
## 3 k            2.24e+ 1  1.99e+ 0    NA     NA     
## 4 gptumorLoco  1.29e+ 0  5.54e- 1     2.32   0.0202
## 5 gptumorMtx  -5.11e- 1  6.44e- 1    -0.794  0.427
tidy(mod4)
## # A tibble: 4 × 5
##   term        estimate std.error statistic p.value
##   <chr>          <dbl>     <dbl>     <dbl>   <dbl>
## 1 shape       7.66e- 2  9.48e- 3     NA     NA    
## 2 scale       1.51e-16  1.23e-15     NA     NA    
## 3 k           2.39e+ 1  6.16e+ 0     NA     NA    
## 4 comorbisim -1.27e+ 0  7.88e- 1     -1.61   0.107
tidy(mod5)
## # A tibble: 4 × 5
##   term           estimate std.error statistic  p.value
##   <chr>             <dbl>     <dbl>     <dbl>    <dbl>
## 1 shape          7.72e- 2  7.42e- 3     NA    NA      
## 2 scale          1.99e-16  1.24e-15     NA    NA      
## 3 k              2.42e+ 1  5.10e+ 0     NA    NA      
## 4 leucopeniasim -1.76e+ 0  6.70e- 1     -2.63  0.00863
tidy(mod6)
## # A tibble: 4 × 5
##   term       estimate std.error statistic p.value
##   <chr>         <dbl>     <dbl>     <dbl>   <dbl>
## 1 shape      7.47e- 2  2.28e- 3     NA     NA    
## 2 scale      3.26e-17  7.26e-20     NA     NA    
## 3 k          2.47e+ 1  2.22e+ 0     NA     NA    
## 4 desnutsim -9.84e- 1  7.86e- 1     -1.25   0.211

Olhando para o p-valor de cada termo e a nível 10% de significância rejeitamos a hipótese nula de que as variáveis idade , leucopenia e (grupo tal) tumor são iguais a zero, logo são significativas para explicar o modelo.

mod_1 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor,dist="gengamma.orig")
mod_2 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade,dist="gengamma.orig")
mod_3 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+gptumor,dist="gengamma.orig")
mod_4 = flexsurvreg(data=dados,Surv(tempo,status)~gptumor+idade,dist="gengamma.orig")

## AIC BIC

aic_bic_2 = rbind(c(mod_1$AIC,mod_1$BIC),
                 c(mod_2$AIC,mod_2$BIC),
                 c(mod_3$AIC,mod_3$BIC),
                 c(mod_4$AIC,mod_4$BIC))

rownames(aic_bic_2) = c("Completo","Sem gptumor","Sem idade","Sem leucopenia")
colnames(aic_bic_2) = c("AIC","BIC")

aic_bic_2
##                     AIC      BIC
## Completo       1198.508 1221.596
## Sem gptumor    1208.127 1224.618
## Sem idade      1206.196 1225.986
## Sem leucopenia 1201.553 1221.343

Observando os AIC e BIC dos modelos com as variáveis significativas observamos que nesse momento o que melhor se ajusta é o completo (com idade, leucopenia e gptumor).

mod_5 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor,dist="gengamma.orig")
mod_6 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+sexo,dist="gengamma.orig")
mod_7 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+comorbi,dist="gengamma.orig")
mod_8 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut,dist="gengamma.orig")

## AIC BIC

aic_bic_3 = rbind(c(mod_5$AIC,mod_5$BIC),
                 c(mod_6$AIC,mod_6$BIC),
                 c(mod_7$AIC,mod_7$BIC),
                 c(mod_8$AIC,mod_8$BIC))

rownames(aic_bic_3) = c("Completo","Com sexo","Com comorbi","Com desnut")
colnames(aic_bic_3) = c("AIC","BIC")

aic_bic_3
##                  AIC      BIC
## Completo    1198.508 1221.596
## Com sexo    1198.632 1225.019
## Com comorbi 1199.250 1225.636
## Com desnut  1198.469 1224.856

Ao retornar no modelo as variáveis anteriormente consideradas não significativas e olhando para os AIC e BIC de cada modelo, nós chegamos a conclusão de que o modelo com a variável desnut melhor se ajusta agora no modelo completo. Voltaremos com ela. Agora nos iremos verificar se alguma das variáveis do nosso modelo completo atual precisa sair.

mod5 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut,dist="gengamma.orig")
mod6 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+desnut,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -2.2e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod7 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+gptumor+desnut,dist="gengamma.orig")
mod8 = flexsurvreg(data=dados,Surv(tempo,status)~idade+gptumor+desnut,dist="gengamma.orig")

## AIC BIC

aic_bic_4 = rbind(c(mod5$AIC,mod5$BIC),
                 c(mod6$AIC,mod6$BIC),
                 c(mod7$AIC,mod7$BIC),
                 c(mod8$AIC,mod8$BIC))

rownames(aic_bic_4) = c("Completo","Sem gptumor","Sem idade","Sem leucopenia")
colnames(aic_bic_4) = c("AIC","BIC")

aic_bic_4
##                     AIC      BIC
## Completo       1198.469 1224.856
## Sem gptumor    1208.384 1228.174
## Sem idade      1206.076 1229.164
## Sem leucopenia 1201.672 1224.760

O AIC e BIC do modelo completo continua sendo o melhor, logo não iremos tirar nenhuma variável do nosso modelo atual (leucopenia, idade gptumor e desnut). Com esse modelo então, iremos testar suas interações

mod9 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut,dist="gengamma.orig")
mod10 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+leucopenia*idade,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -1.1e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod11 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+leucopenia*gptumor,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -1.0e+03 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod12 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+leucopenia*desnut,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -5.0e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod13 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+idade*gptumor,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -1.2e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod14 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+idade*desnut,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -2.8e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod15 = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+gptumor*desnut,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -1.5e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
## AIC BIC

aic_bic_5 = rbind(c(mod9$AIC,mod9$BIC),
                 c(mod10$AIC,mod10$BIC),
                 c(mod11$AIC,mod11$BIC),
                 c(mod12$AIC,mod12$BIC),
                 c(mod13$AIC,mod13$BIC),
                 c(mod14$AIC,mod14$BIC),
                 c(mod15$AIC,mod15$BIC))

rownames(aic_bic_5) = c("Completo","mod10","mod11","mod12","mod13","mod14","mod15")
colnames(aic_bic_5) = c("AIC","BIC")

aic_bic_5
##               AIC      BIC
## Completo 1198.469 1224.856
## mod10    1196.397 1226.082
## mod11    1198.860 1231.843
## mod12    1199.092 1228.777
## mod13    1195.145 1228.128
## mod14    1199.855 1229.540
## mod15    1201.197 1234.180

Testando as initerações pudemos observar que o modelo 13 com a interação de idade e gptumor teve um melhor ajuste. Logo iremos adiciona-lá no nosso modelo. Segue abaixo o ajuste

tidy(mod13)
## # A tibble: 10 × 5
##    term               estimate std.error statistic  p.value
##    <chr>                 <dbl>     <dbl>     <dbl>    <dbl>
##  1 shape              8.65e- 2  3.18e- 3   NA      NA      
##  2 scale              2.36e-14  1.05e-15   NA      NA      
##  3 k                  2.30e+ 1  2.22e+ 0   NA      NA      
##  4 leucopeniasim     -1.44e+ 0  6.77e- 1   -2.13    0.0331 
##  5 idade             -4.62e- 3  2.27e- 2   -0.204   0.838  
##  6 gptumorLoco        5.14e+ 0  1.75e+ 0    2.93    0.00340
##  7 gptumorMtx        -5.95e- 1  1.97e+ 0   -0.303   0.762  
##  8 desnutsim         -1.09e+ 0  7.06e- 1   -1.54    0.124  
##  9 idade:gptumorLoco -6.87e- 2  2.95e- 2   -2.33    0.0199 
## 10 idade:gptumorMtx  -3.19e- 3  3.45e- 2   -0.0927  0.926

Vamos agora verificar qual a melhor distribuição para o nosso modelo

mod_gam = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+idade*gptumor,dist="gengamma.orig")
## Warning in .hess_to_cov(opt$hessian, hess.control$tol.solve,
## hess.control$tol.evalues): Hessian not positive definite: smallest eigenvalue
## is -1.2e+02 (threshold: -1.0e-05). This might indicate that the optimization
## did not converge to the maximum likelihood, so that the results are invalid.
## Continuing with the nearest positive definite approximation of the covariance
## matrix.
mod_exp = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+idade*gptumor,dist="exponential")
mod_weibull = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+idade*gptumor,dist="weibull") 
mod_lnorm = flexsurvreg(data=dados,Surv(tempo,status)~leucopenia+idade+gptumor+desnut+idade*gptumor,dist="lnorm") 


aic_bic_6 = rbind(c(mod_gam$AIC,mod_gam$BIC),
                 c(mod_exp$AIC,mod_exp$BIC),
                 c(mod_weibull$AIC,mod_weibull$BIC),
                 c(mod_lnorm$AIC,mod_lnorm$BIC))

rownames(aic_bic_6) = c("Completo","Exponencial","Weibull","Log-normal")
colnames(aic_bic_6) = c("AIC","BIC")

aic_bic_6
##                  AIC      BIC
## Completo    1195.145 1228.128
## Exponencial 1304.832 1331.218
## Weibull     1211.666 1241.351
## Log-normal  1189.059 1218.743

Ao testar outros modelos vemos que o modelo log-normal é o que tem o melhor AIC-BIC, portanto será nosso modelo final. Iremos realizar então a análise de resíduos do nosso modelo final (desnut não significativo porém AIC menor, mantemos?)

CoxSnell <-coxsnell_flexsurvreg(mod_lnorm)$est
ekm<- survfit (Surv(CoxSnell,dados$status)~1,type="kaplan-meier")
plot(ekm, fun="cumhaz",xlab="Resíduos de Cox-Snell",ylab="Função de risco
acumulado")
abline(0, 1, col="red")

plot(ekm, xlab="Resíduos de Cox-Snell",ylab="Função de sobrevivência")
CoxSnell<-sort(CoxSnell)
exp1<-exp(-CoxSnell)
points(CoxSnell,exp1, col="red",type="o")

De acordo com os gráficos, o modelo esta bem ajustado (ta?)

mod_lnorm
## Call:
## flexsurvreg(formula = Surv(tempo, status) ~ leucopenia + idade + 
##     gptumor + desnut + idade * gptumor, data = dados, dist = "lnorm")
## 
## Estimates: 
##                    data mean  est        L95%       U95%       se       
## meanlog                   NA   4.90e+00   2.35e+00   7.44e+00   1.30e+00
## sdlog                     NA   2.49e+00   2.15e+00   2.89e+00   1.89e-01
## leucopeniasim       9.50e-02  -1.41e+00  -2.77e+00  -4.99e-02   6.94e-01
## idade               5.83e+01  -7.74e-03  -5.28e-02   3.73e-02   2.30e-02
## gptumorLoco         6.35e-01   4.97e+00   1.58e+00   8.35e+00   1.73e+00
## gptumorMtx          2.00e-01  -1.13e+00  -4.98e+00   2.72e+00   1.96e+00
## desnutsim           7.50e-02  -1.17e+00  -2.57e+00   2.24e-01   7.12e-01
## idade:gptumorLoco   3.85e+01  -6.62e-02  -1.23e-01  -8.95e-03   2.92e-02
## idade:gptumorMtx    1.14e+01   6.06e-03  -6.13e-02   7.34e-02   3.44e-02
##                    exp(est)   L95%       U95%     
## meanlog                   NA         NA         NA
## sdlog                     NA         NA         NA
## leucopeniasim       2.44e-01   6.27e-02   9.51e-01
## idade               9.92e-01   9.49e-01   1.04e+00
## gptumorLoco         1.43e+02   4.85e+00   4.24e+03
## gptumorMtx          3.24e-01   6.89e-03   1.52e+01
## desnutsim           3.10e-01   7.68e-02   1.25e+00
## idade:gptumorLoco   9.36e-01   8.84e-01   9.91e-01
## idade:gptumorMtx    1.01e+00   9.41e-01   1.08e+00
## 
## N = 200,  Events: 108,  Censored: 92
## Total time at risk: 19800
## Log-likelihood = -585.5293, df = 9
## AIC = 1189.059
exp(-1.40977)
## [1] 0.2441994
exp(-0.00774)
## [1] 0.9922899
exp(4.96546)
## [1] 143.3745
exp(-1.12781)
## [1] 0.3237415
exp(-1.17147)
## [1] 0.309911
exp(-0.06620)
## [1] 0.9359437
exp(0.00606)
## [1] 1.006078

Sobre a interpretação isoladamente conseguimos interpretar apenas a variável idade. Para pacientes i e j onde ambos