Aplicação: Progressão da Classificação Funcional na
Estenose Mitral Reumática
José Luiz Padilha da Silva
12 de novembro de 2019
Introdução
Os dados são oriundos de uma coorte de 164 pacientes com estenose mitral reumática que foram encaminhados para tratamento no Hospital das Clínicas da Universidade Federal de Minas Gerais, Brasil. Os pacientes foram incluídos antes da intervenção da válvula mitral e, em seguida, eles foram acompanhados no ambulatório a cada 4 meses de acordo com o seu estado clínico.
A estenose mitral é um estreitamento da válvula mitral no coração causada pela doença reumática, o que restringe o fluxo de sangue através da válvula. A principal manifestação clínica da doença é falta de ar, classificada em quatro categorias com base em quanto os pacientes são limitados durante a atividade física. A Classificação Funcional da New York Heart Association (NYHA) fornece uma maneira simples de classificar o grau de falta de ar. Os pacientes sem sintomas e sem limitação de atividade física ordinária são classificados na classe I; limitação leve da atividade física determina a classe II; limitação acentuada determina a classe III; e pacientes com limitações severas que resultam em incapacidade para realizar qualquer atividade física sem desconforto pertencem à classe IV.
Todos os pacientes passaram por valvoplastia mitral percutânea (VMP), que é um tratamento eficaz para esticar a válvula mitral estenosada. Este procedimento é feito através da inserção de um catéter com um balão na sua ponta para abrir a válvula mitral estreitada. Este procedimento faz com que a melhoria da classe funcional na maioria dos pacientes.
O objetivo do estudo é relacionar a evolução longitudinal da classe funcional com preditores como, por exemplo, o ritmo cardíaco, características morfológicas da válvula mitral expressa como um escore ecocardiográfico, a área da válvula mitral, pressão da artéria pulmonar e sucesso do procedimento para abrir a válvula mitral sem complicações. Todas as covariáveis consideradas foram avaliadas no baseline.
Uma característica deste conjunto de dados é a ocorrência de dados ausentes. Alguns valores da resposta não são observados, devido principalmente a complicações no procedimento. Uma covariável de particular interesse, a complacência ventricular, não foi observada para cerca de um terço dos pacientes. Entre as razões de não observar tal preditor incluem características morfológicas da válvula mitral e calcificação valvar. Deste modo, um mecanismo MAR parece razoável para descrever o mecanismo de não resposta. Para esta ilustração consideraremos como variável resposta a indicadora do indivíduo apresentar melhora na classe funcional no tempo fixado de quatro meses. Os dados de complacência e calcificação foram alterados de forma de forma a enfatizar alguns resultados. A proporção de dados ausentes foi mantida.
Análise Exploratória e Ajuste aos Dados Disponíveis
set.seed(100); library(mice); library(ggplot2); load("dados.RData"); summary(dados)
## melhora Sucesso Score_total MVA_pre_planimetry ## 0 :59 Min. :0.0000 Min. : 4.000 Min. :0.4000 ## 1 :95 1st Qu.:1.0000 1st Qu.: 6.000 1st Qu.:0.7975 ## NA's:10 Median :1.0000 Median : 7.000 Median :0.9650 ## Mean :0.7805 Mean : 7.165 Mean :0.9952 ## 3rd Qu.:1.0000 3rd Qu.: 8.000 3rd Qu.:1.1925 ## Max. :1.0000 Max. :12.000 Max. :2.0600
##
## Cn_echo mean_gradiente_PRE RVSP_PRE calcification ## Min. : 0.983 Min. : 3.00 Min. : 21.00 Min. :-0.0271 ## 1st Qu.: 3.910 1st Qu.: 7.00 1st Qu.: 36.88 1st Qu.: 3.9495 ## Median : 4.733 Median :10.00 Median : 45.00 Median : 5.1693 ## Mean : 5.057 Mean :11.09 Mean : 49.28 Mean : 5.3989 ## 3rd Qu.: 6.033 3rd Qu.:14.00 3rd Qu.: 56.00 3rd Qu.: 6.8017 ## Max. :10.485 Max. :32.00 Max. :111.00 Max. :12.2309 ## NA's :56
Como modelo de análise, consideraremos uma regressão logística considerando como resposta a melhora na classificação funcional em função do sucesso do procedimento, escore ecocardiográfico e complacência ventricular. Estas variáveis foram escolhidas por sua associação com a resposta em análises anteriores.
library(tidyverse)
res <- dados %>% group_by(melhora) %>% summarise(n = n(), mean = mean(Sucesso)); res
## # A tibble: 3 x 3 ## melhora n mean ## <fct> <int> <dbl> ## 1 0 59 0.678 ## 2 1 95 0.874 ## 3 <NA> 10 0.5
ggplot(res, aes(x=melhora, y=mean, fill=melhora)) + geom_col() + theme_bw() +
labs(title=("Sucesso do Procedimento")) + guides(fill=FALSE)
0.00 0.25 0.50 0.75 0 1 NA
melhora
mean
Sucesso do Procedimento
round(summary(glm(melhora ~ Sucesso, family = "binomial", data = dados))$coef, 3) ## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.460 0.369 -1.246 0.213 ## Sucesso 1.189 0.416 2.860 0.004
#
res <- dados %>% group_by(melhora) %>% summarise(n = n(), mean = mean(Score_total)); res
## # A tibble: 3 x 3 ## melhora n mean ## <fct> <int> <dbl> ## 1 0 59 7.25 ## 2 1 95 7.06 ## 3 <NA> 10 7.6
ggplot(res, aes(x=melhora, y=mean, fill=melhora)) + geom_col() + theme_bw() +
labs(title=("Escore Total")) + guides(fill=FALSE)
0 2 4 6 0 1 NA
melhora
mean
Escore Total
round(summary(glm(melhora ~ Score_total, family = "binomial", data = dados))$coef, 3) ## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.12 0.833 1.344 0.179 ## Score_total -0.09 0.114 -0.790 0.429 #
res <- dados %>% group_by(melhora) %>% summarise(n = n(), mean = mean(Cn_echo, na.rm = TRUE)); res
## # A tibble: 3 x 3 ## melhora n mean ## <fct> <int> <dbl> ## 1 0 59 4.87 ## 2 1 95 5.27 ## 3 <NA> 10 NaN
ggplot(res, aes(x=melhora, y=mean, fill=melhora)) + geom_col() + theme_bw() +
0 2 4 0 1 NA
melhora
mean
Complacência
round(summary(glm(melhora ~ Cn_echo, family = "binomial", data = dados))$coef, 3) ## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.858 0.632 -1.357 0.175 ## Cn_echo 0.147 0.119 1.242 0.214 #
fit <- glm(melhora ~ Sucesso + Score_total + Cn_echo, family = "binomial", data = dados)
round(summary(fit)$coef, 3)
## Estimate Std. Error z value Pr(>|z|) ## (Intercept) -0.594 1.231 -0.482 0.630 ## Sucesso 0.713 0.492 1.448 0.148 ## Score_total -0.092 0.133 -0.694 0.488 ## Cn_echo 0.115 0.122 0.945 0.345
Imputação Múltipla
dados.imp <- mice(dados, m=50, printFlag = FALSE, method=c("logreg","","","","norm","","",""))
dados.imp ## Class: mids
## Number of multiple imputations: 50 ## Imputation methods:
## melhora Sucesso Score_total
## "logreg" "" "" ## MVA_pre_planimetry Cn_echo mean_gradiente_PRE ## "" "norm" ""
## "" "" ## PredictorMatrix:
## melhora Sucesso Score_total MVA_pre_planimetry Cn_echo
## melhora 0 1 1 1 1 ## Sucesso 1 0 1 1 1 ## Score_total 1 1 0 1 1 ## MVA_pre_planimetry 1 1 1 0 1 ## Cn_echo 1 1 1 1 0 ## mean_gradiente_PRE 1 1 1 1 1
## mean_gradiente_PRE RVSP_PRE calcification
## melhora 1 1 1 ## Sucesso 1 1 1 ## Score_total 1 1 1 ## MVA_pre_planimetry 1 1 1 ## Cn_echo 1 1 1 ## mean_gradiente_PRE 0 1 1
imp1 <- complete(dados.imp, 1) head(imp1)
## melhora Sucesso Score_total MVA_pre_planimetry Cn_echo
## 1 0 0 11 0.90 3.070000 ## 2 1 1 6 0.60 5.254286 ## 3 0 0 7 0.70 5.591195 ## 4 1 1 9 0.80 5.150257 ## 5 0 1 6 1.21 7.569951 ## 6 1 1 6 0.78 3.942086
## mean_gradiente_PRE RVSP_PRE calcification
## 1 8.0 46 2.234706 ## 2 14.0 106 4.250778 ## 3 8.0 40 6.306064 ## 4 10.0 56 4.789178 ## 5 5.5 39 9.145535 ## 6 14.0 57 4.150508 #
res <- imp1 %>% group_by(melhora) %>% summarise(n = n(), mean = mean(Sucesso)); res
## # A tibble: 2 x 3 ## melhora n mean ## <fct> <int> <dbl>
## 1 0 63 0.683
## 2 1 101 0.842
p1 <- ggplot(res, aes(x=melhora, y=mean, fill=melhora)) + geom_col() + theme_bw() +
labs(title=("Sucesso do Procedimento")) + guides(fill=FALSE)
res <- imp1 %>% group_by(melhora) %>% summarise(n = n(), mean = mean(Score_total)); res
## # A tibble: 2 x 3 ## melhora n mean ## <fct> <int> <dbl>
## 1 0 63 7.24
## 2 1 101 7.12
p2 <- ggplot(res, aes(x=melhora, y=mean, fill=melhora)) + geom_col() + theme_bw() +
labs(title=("Escore Total")) + guides(fill=FALSE)
## # A tibble: 2 x 3 ## melhora n mean ## <fct> <int> <dbl>
## 1 0 63 4.83
## 2 1 101 5.88
p3 <- ggplot(res, aes(x=melhora, y=mean, fill=melhora)) + geom_col() + theme_bw() +
labs(title=("Complacência")) + guides(fill=FALSE)
gridExtra::grid.arrange(p1,p2,p3,ncol=3) 0.0 0.2 0.4 0.6 0.8 0 1
melhora
mean
Sucesso do Procedimento
0 2 4 6 0 1melhora
mean
Escore Total
0 2 4 6 0 1melhora
mean
Complacência
#fit.imp <- with(dados.imp, glm(melhora ~ Sucesso + Score_total + Cn_echo, family = "binomial"))
round(summary(pool(fit.imp)), 3)
## estimate std.error statistic df p.value ## (Intercept) -1.520 1.145 -1.327 146.922 0.187 ## Sucesso 0.957 0.428 2.234 140.510 0.027 ## Score_total -0.017 0.121 -0.140 153.105 0.889 ## Cn_echo 0.256 0.107 2.389 134.694 0.018