Exemplo 7.7 - Estudo sobre doença coronária arterial

Introdução

  • Variável Resposta (Y): Presença ou ausência de Doença Coronária Arterial.

  • Variável Preditrora (Sexo): Sexo do paciente (0 = feminino, 1 = masculino).

  • Variável Preditrora (ECG): Resultado do eletrocardiograma, com base na depressão do segmento ST (0 se < 0,1 e 1 se >= 0,1).

O objetivo é ajustar um modelo de regressão logística para estimar a probabilidade de um paciente apresentar a doença (\(Y=1\)) com base em suas características (vetor \(\mathbf{x}_i\)). Ou seja, modelar a probabilidade condicional:

\[p(\mathbf{x}_i) = P(Y=1|\mathbf{x}_i)\]

Preparação e Estruturação dos Dados

# dados
dados_7.7 <- data.frame(
  Sexo = factor(c("Feminino", "Feminino", "Masculino", "Masculino")),
  ECG = factor(c("< 0,1 ST", "$\\geq$ 0,1 ST", "< 0,1 ST", "$\\geq$ 0,1 ST")),
  Doenca_Presente = c(4, 8, 9, 21),
  Doenca_Ausente = c(11, 10, 9, 6)
)

knitr::kable(dados_7.7, caption = "Dados do Estudo de Doença Coronária Arterial")
Dados do Estudo de Doença Coronária Arterial
Sexo ECG Doenca_Presente Doenca_Ausente
Feminino < 0,1 ST 4 11
Feminino \(\geq\) 0,1 ST 8 10
Masculino < 0,1 ST 9 9
Masculino \(\geq\) 0,1 ST 21 6

Ajuste do Modelo

Foi ajustado um modelo linear generalizado (GLM) da família binomial com função de ligação logística. O modelo avalia os efeitos principais de Sexo e ECG na probabilidade de ter a doença.

# modelo
modelo_7.7 <- glm(cbind(Doenca_Presente, Doenca_Ausente) ~ Sexo + ECG, 
              data = dados_7.7, 
              family = binomial(link = "logit"))

summary(modelo_7.7)
## 
## Call:
## glm(formula = cbind(Doenca_Presente, Doenca_Ausente) ~ Sexo + 
##     ECG, family = binomial(link = "logit"), data = dados_7.7)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)  
## (Intercept)    -0.1202     0.4174  -0.288   0.7734  
## SexoMasculino   1.2770     0.4980   2.564   0.0103 *
## ECG< 0,1 ST    -1.0545     0.4980  -2.118   0.0342 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 11.98346  on 3  degrees of freedom
## Residual deviance:  0.21409  on 1  degrees of freedom
## AIC: 19.309
## 
## Number of Fisher Scoring iterations: 3
  • Coeficientes (Coefficients): Os valores na coluna Estimate estão na escala de log-chance (logit).

    • O (Intercept) (-1.1747) representa a log-chance de ter a doença para o grupo de referência: mulheres com ECG < 0,1 ST.

    • O coeficiente SexoMasculino (1.2770) é estatisticamente significativo (p = 0.0103). Isso indica que, mantendo o ECG constante, ser do sexo masculino aumenta a log-chance de ter a doença em 1.2770 em comparação com ser do sexo feminino.

    • O coeficiente ECG>= 0,1 ST (1.0545) também é estatisticamente significativo (p = 0.0342). Isso significa que, mantendo o sexo constante, ter um ECG >= 0,1 ST aumenta a log-chance da doença em 1.0545 em comparação com um ECG < 0,1 ST.

  • AIC: 19.309

Razão de Chances (Odds Ratios)

A razão de chances nos diz o quanto a chance de ter a doença é multiplicada para cada grupo em comparação com o grupo de referência.

# odds ratio
coeficientes_7.7 <- coef(modelo_7.7)
odds_ratios_7.7 <- exp(coeficientes_7.7)
conf_int_or_7.7 <- exp(confint(modelo_7.7))

tabela_resultados_7.7 <- data.frame(
  Log_Chance = coeficientes_7.7,
  Razao_de_Chances = odds_ratios_7.7,
  IC_2.5 = conf_int_or_7.7[, 1],
  IC_97.5 = conf_int_or_7.7[, 2]
)

knitr::kable(
  round(tabela_resultados_7.7, 3), 
  caption = "Log-Chance, Razão de Chances e Intervalos de Confiança (95%)")
Log-Chance, Razão de Chances e Intervalos de Confiança (95%)
Log_Chance Razao_de_Chances IC_2.5 IC_97.5
(Intercept) -0.120 0.887 0.385 2.014
SexoMasculino 1.277 3.586 1.379 9.838
ECG< 0,1 ST -1.054 0.348 0.127 0.909
  • SexoMasculino: A razão de chances é de 3.586. Isso significa que a chance de um homem ter a doença coronária é aproximadamente 3,6 vezes a chance de uma mulher, mantendo o resultado do ECG constante. O intervalo de confiança de 95% [1.379, 9.838] não contém o valor 1, o que reforça a significância estatística deste preditor.

  • ECG>= 0,1 ST: A razão de chances é de 2.871. A chance de um paciente com ECG >= 0,1 ST ter a doença é quase 2,9 vezes a chance de um paciente com ECG < 0,1 ST, mantendo o sexo constante. O intervalo de confiança de 95% [1.100, 7.848] também não contém o 1, validando sua significância.

Probabilidades Preditas pelo Modelo

Usamos o modelo ajustado para calcular a probabilidade predita de ter a doença para cada um dos quatro grupos do estudo.

# predict
dados_7.7$Probabilidade_Predita <- round(predict(modelo_7.7, type = "response"), 4)

knitr::kable(
  dados_7.7, 
  caption = "Probabilidades de Doença Preditas pelo Modelo"
)
Probabilidades de Doença Preditas pelo Modelo
Sexo ECG Doenca_Presente Doenca_Ausente Probabilidade_Predita
Feminino < 0,1 ST 4 11 0.2360
Feminino \(\geq\) 0,1 ST 8 10 0.4700
Masculino < 0,1 ST 9 9 0.5255
Masculino \(\geq\) 0,1 ST 21 6 0.7607

A coluna Probabilidade_Predita mostra o risco estimado para cada grupo: * O grupo de menor risco é o de mulheres com ECG < 0,1 ST, com uma probabilidade de 23.6% de ter a doença. * O risco aumenta para todos os outros grupos, chegando ao máximo no grupo de homens com ECG >= 0,1 ST, cuja probabilidade de ter a doença é estimada em 76.1%.

Conclusão

A análise de regressão logística demonstrou que tanto o sexo quanto o resultado do ECG são preditores estatisticamente significativos para a presença de doença coronária arterial nesta amostra. O modelo indica que ser do sexo masculino e apresentar um nível de depressão do segmento ST igual ou superior a 0,1 no ECG estão associados a um aumento substancial na chance e na probabilidade de ter a doença.

Exemplo 7.12 - Estudo sobre Tratamento de Infecções Urinárias

Introdução

Para a análise dos dados, foram definidas as variáveis a seguir, com a finalidade de considerar no modelo de regressão logística as variáveis categóricas diagnóstico de infecção urinária (\(X_1\)) e tratamento (\(X_2\)).

A variável para o diagnóstico da infecção é definida como:

\[ X_1 = \begin{cases} 1 & \text{se infecção urinária complicada} \\ 0 & \text{se infecção urinária não complicada} \end{cases} \]

Para a variável tratamento, que possui três categorias (A, B, C), foram criadas duas variáveis fictícias, usando o tratamento C como categoria de referência:

\[ X_{21} = \begin{cases} 1 & \text{se tratamento A} \\ 0 & \text{caso contrário} \end{cases} \quad \text{e} \quad X_{22} = \begin{cases} 1 & \text{se tratamento B} \\ 0 & \text{caso contrário} \end{cases} \]

Desse modo, a combinação de referência fica descrita pelas categorias infecção urinária não complicada e tratamento C, associadas, respectivamente, aos valores \(X_1=0\) e (\(X_{21}=0, X_{22}=0\)).

Preparação e Estruturação dos Dados

dados_7.12 <- data.frame(
  Diagnostico = rep(c("Complicada", "Nao_complicada"), each = 3),
  Tratamento = rep(c("A", "B", "C"), times = 2),
  Cura_Sim = c(78, 101, 68, 40, 54, 34),
  Cura_Nao = c(28, 11, 46, 5, 5, 6)
)

knitr::kable(dados_7.12, caption = "Dados do Estudo de Infecção Urinária")
Dados do Estudo de Infecção Urinária
Diagnostico Tratamento Cura_Sim Cura_Nao
Complicada A 78 28
Complicada B 101 11
Complicada C 68 46
Nao_complicada A 40 5
Nao_complicada B 54 5
Nao_complicada C 34 6

As variáveis Diagnostico e Tratamento são convertidas para o tipo factor. É crucial definir os níveis de referência para a correta interpretação do modelo. Conforme o problema, definimos: - Diagnóstico: “Nao_complicada” como referência. - Tratamento: “C” como referência.

dados_7.12$Diagnostico <- factor(dados_7.12$Diagnostico, levels = c("Nao_complicada", "Complicada"))
dados_7.12$Tratamento <- factor(dados_7.12$Tratamento, levels = c("C", "A", "B"))

str(dados_7.12)
## 'data.frame':    6 obs. of  4 variables:
##  $ Diagnostico: Factor w/ 2 levels "Nao_complicada",..: 2 2 2 1 1 1
##  $ Tratamento : Factor w/ 3 levels "C","A","B": 2 3 1 2 3 1
##  $ Cura_Sim   : num  78 101 68 40 54 34
##  $ Cura_Nao   : num  28 11 46 5 5 6

Ajuste do Modelo

Ajustamos um modelo de regressão logística para estimar a probabilidade de cura. A variável resposta é a matriz de contagens de sucesso e fracasso cbind(Cura_Sim, Cura_Nao). O modelo avalia os efeitos principais das variáveis preditoras.

# modelo
modelo_7.12 <- glm(
  cbind(Cura_Sim, Cura_Nao) ~ Diagnostico + Tratamento,
  data = dados_7.12,
  family = binomial(link = "logit")
)

summary(modelo_7.12)
## 
## Call:
## glm(formula = cbind(Cura_Sim, Cura_Nao) ~ Diagnostico + Tratamento, 
##     family = binomial(link = "logit"), data = dados_7.12)
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)             1.4184     0.2987   4.749 2.05e-06 ***
## DiagnosticoComplicada  -0.9616     0.2998  -3.208  0.00134 ** 
## TratamentoA             0.5847     0.2641   2.214  0.02683 *  
## TratamentoB             1.5608     0.3160   4.940 7.82e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 44.4726  on 5  degrees of freedom
## Residual deviance:  2.5147  on 2  degrees of freedom
## AIC: 34.938
## 
## Number of Fisher Scoring iterations: 4
  • (Intercept) (\({\beta_0 = 1.4184}\)): Este é o log-odds de cura para o grupo de referência: pacientes com infecção não complicada que receberam o tratamento C. O valor é positivo e altamente significante (\(p < 0.001\)), indicando que a chance de cura neste grupo já é alta.

  • DiagnosticoComplicada (\({\beta_1 = -0.9616}\)): Pacientes com infecção complicada têm um log-odds de cura -0.9616 menor do que aqueles com infecção não complicada, mantendo o tratamento constante. O efeito é estatisticamente significante (\(p = 0.00134\)), confirmando que uma infecção complicada reduz a chance de cura.

  • TratamentoA (\({\beta_2 = 0.5847}\)): O tratamento A aumenta o log-odds de cura em 0.5847 em comparação com o tratamento C. Este efeito é estatisticamente significante (\(p = 0.02683\)).

  • TratamentoB (\({\beta_3 = 1.5608}\)): O tratamento B aumenta o log-odds de cura em 1.5608 em comparação com o tratamento C. Este é o maior coeficiente e é altamente significante (\(p < 0.001\)), sugerindo que o tratamento B é o mais eficaz.

Razão de Chances (Odds Ratios)

O OR nos informa o quanto a chance de um evento (cura) muda com a alteração de um preditor.

#odds ratio
coeficientes_7.12 <- coef(modelo_7.12)
odds_ratios_7.12 <- exp(coeficientes_7.12)
conf_int_or_7.12 <- exp(confint(modelo_7.12))

tabela_resultados_7.12 <- data.frame(
  Log_Chance = coeficientes_7.12,
  Razao_de_Chances = odds_ratios_7.12,
  IC_2.5 = conf_int_or_7.12[, 1],
  IC_97.5 = conf_int_or_7.12[, 2]
)

knitr::kable(
  round(tabela_resultados_7.12, 3), 
  caption = "Log-Chance, Razão de Chances e Intervalos de Confiança (95%)"
)
Log-Chance, Razão de Chances e Intervalos de Confiança (95%)
Log_Chance Razao_de_Chances IC_2.5 IC_97.5
(Intercept) 1.418 4.131 2.359 7.659
DiagnosticoComplicada -0.962 0.382 0.206 0.672
TratamentoA 0.585 1.795 1.074 3.031
TratamentoB 1.561 4.762 2.615 9.086
  • DiagnosticoComplicada (OR = 0.382): A chance de um paciente com infecção complicada ser curado é apenas 38.2% da chance de um paciente com infecção não complicada (uma redução de 61.8% na chance de cura). O intervalo de confiança [0.206, 0.672] está totalmente abaixo de 1, reforçando a significância deste resultado.

  • TratamentoA (OR = 1.795): A chance de cura com o tratamento A é 1.8 vezes (ou 80% maior que) a chance de cura com o tratamento C. O intervalo de confiança [1.074, 3.031] não contém o valor 1, o que confirma que o tratamento A é significativamente melhor que o C.

  • TratamentoB (OR = 4.762): A chance de cura com o tratamento B é 4.76 vezes maior que a chance de cura com o tratamento C. Este é um efeito muito forte e, com um intervalo de confiança de [2.615, 9.086], é claramente o tratamento mais eficaz entre os três.

Probabilidades Preditas pelo Modelo

Com o modelo ajustado, podemos calcular a probabilidade de cura predita para cada uma das seis combinações de diagnóstico e tratamento.

dados_7.12$Probabilidade_Predita <- round(predict(modelo_7.12, type = "response"), 4)

knitr::kable(
  dados_7.12, 
  caption = "Probabilidades de Cura Preditas pelo Modelo"
)
Probabilidades de Cura Preditas pelo Modelo
Diagnostico Tratamento Cura_Sim Cura_Nao Probabilidade_Predita
Complicada A 78 28 0.7391
Complicada B 101 11 0.8826
Complicada C 68 46 0.6123
Nao_complicada A 40 5 0.8811
Nao_complicada B 54 5 0.9516
Nao_complicada C 34 6 0.8051

As probabilidades preditas demonstram o impacto combinado dos fatores. A maior probabilidade de cura (95.2%) ocorre no cenário mais favorável (infecção não complicada com tratamento B), enquanto a menor (61.2%) ocorre no cenário mais desfavorável (infecção complicada com tratamento C).

Conclusão

  1. O tipo de diagnóstico é um preditor fundamental: Infecções complicadas apresentam uma chance de cura significativamente menor em comparação com as não complicadas.

  2. A escolha do tratamento tem um impacto substancial na cura: Os tratamentos não possuem a mesma eficácia.

  3. O tratamento B é o mais eficaz: Ele aumenta a chance de cura em quase 5 vezes em relação ao tratamento C. O tratamento A também é superior ao C, mas seu efeito é mais modesto.

Exemplo 7.18 - Estudo sobre bronquite (BRC)

Introdução

Nota-se, nesse estudo, que tanto a variável resposta quanto as demais são dicotômicas ou foram dicotomizadas. Sendo assim, o modelo de regressão logística com as três variáveis descritas, bem como as interações entre elas, será utilizado para a análise desses dados.

Considerando, então, o modelo de regressão logística, bem como o nível de significância \(\alpha = 0,10\), tem-se evidências, a partir dos resultados mostrados na Tabela 7.19 (não mostrada aqui), de efeito não significativo tanto da interação tripla quanto da interação dupla \(X_2 \times X_3\) (ses*idade) na presença das outras duas interações duplas, com respectivos valores \(p\) iguais a 0,8602 e 0,9763.

Em contrapartida, há evidências de efeito significativo (valor \(p = 0,005\)) da interação \(X_1 \times X_3\) (smk*idade) na presença de \(X_1 \times X_2\) (smk*ses) e também da interação \(X_1 \times X_2\) = smk*ses (valor \(p = 0,0775\)).

Preparação e Estruturação dos Dados

  • smk: Status de fumo (0 = não fumante, 1 = fumante).

  • ses: Status socioeconômico (0 = alto, 1 = baixo).

  • idade: Faixa etária (0 = < 40 anos, 1 = >= 40 anos).

  • sim / nao: Contagem de indivíduos com e sem bronquite, respectivamente.

# dados
dados_7.18 <- data.frame(
  smk = factor(c(0, 0, 0, 0, 1, 1, 1, 1)),
  ses = factor(c(1, 1, 0, 0, 1, 1, 0, 0)),
  idade = factor(c(0, 1, 0, 1, 0, 1, 0, 1)),
  sim = c(38, 48, 28, 40, 84, 102, 47, 59),
  nao = c(73, 86, 67, 84, 89, 46, 96, 53)
)

knitr::kable(dados_7.18, caption = "Dados do Estudo de Bronquite (BRC)")
Dados do Estudo de Bronquite (BRC)
smk ses idade sim nao
0 1 0 38 73
0 1 1 48 86
0 0 0 28 67
0 0 1 40 84
1 1 0 84 89
1 1 1 102 46
1 0 0 47 96
1 0 1 59 53

Ajuste do Modelo Logístico

Foi ajustado um modelo de regressão logística binomial. Após a análise de diferentes modelos (não mostrada aqui), o modelo final escolhido foi aquele que inclui os efeitos principais e as interações duplas entre fumo e status socioeconômico (smk:ses) e entre fumo e idade (smk:idade).

# modelo
modelo_inter_duplas_7.18 <- glm(cbind(sim, nao) ~ smk*ses + smk*idade, 
                                data = dados_7.18, 
                                family = binomial(link = "logit"))

summary(modelo_inter_duplas_7.18)
## 
## Call:
## glm(formula = cbind(sim, nao) ~ smk * ses + smk * idade, family = binomial(link = "logit"), 
##     data = dados_7.18)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -0.8533     0.1856  -4.597 4.29e-06 ***
## smk1          0.1306     0.2408   0.542  0.58751    
## ses1          0.1852     0.1982   0.934  0.35014    
## idade1        0.0973     0.1991   0.489  0.62501    
## smk1:ses1     0.4859     0.2637   1.843  0.06536 .  
## smk1:idade1   0.7422     0.2643   2.809  0.00497 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 72.798230  on 7  degrees of freedom
## Residual deviance:  0.031879  on 2  degrees of freedom
## AIC: 53.704
## 
## Number of Fisher Scoring iterations: 3
  • Interações Significativas: As interações smk1:idade1 (\(p = 0.005\)) e smk1:ses1 (\(p = 0.065\)) são estatisticamente significativas (a última no nível de \(\alpha = 0.10\)). Isso é o achado mais importante da análise, pois indica que o efeito do fumo (smk) na chance de ter bronquite não é constante, mas sim depende da idade e do status socioeconômico do indivíduo.

  • Princípio da Hierarquia: Os efeitos principais (smk1, ses1, idade1) aparecem como não significativos. No entanto, eles devem ser mantidos no modelo porque fazem parte de interações significativas.

  • Qualidade do Ajuste: O critério AIC é de 53.704, o menor entre os modelos.

Razão de Chances (Odds Ratios)

Para interpretar a magnitude dos efeitos, calculamos a Razão de Chances (Odds Ratio - OR) para cada coeficiente do modelo, com seus respectivos intervalos de confiança de 95%.

#odds ratio
coeficientes_7.18 <- coef(modelo_inter_duplas_7.18)
odds_ratios_7.18 <- exp(coeficientes_7.18)
conf_int_or_7.18 <- exp(confint(modelo_inter_duplas_7.18))

tabela_resultados_7.18 <- data.frame(
  Log_Chance = coeficientes_7.18,
  Razao_de_Chances = odds_ratios_7.18,
  IC_2.5 = conf_int_or_7.18[, 1],
  IC_97.5 = conf_int_or_7.18[, 2]
)

knitr::kable(
  round(tabela_resultados_7.18, 3), 
  caption = "Log-Chance, Razão de Chances e Intervalos de Confiança (95%)")
Log-Chance, Razão de Chances e Intervalos de Confiança (95%)
Log_Chance Razao_de_Chances IC_2.5 IC_97.5
(Intercept) -0.853 0.426 0.294 0.609
smk1 0.131 1.140 0.712 1.832
ses1 0.185 1.203 0.817 1.778
idade1 0.097 1.102 0.747 1.631
smk1:ses1 0.486 1.626 0.969 2.726
smk1:idade1 0.742 2.101 1.251 3.528

A presença de interações torna a interpretação mais complexa. Não podemos interpretar os efeitos principais isoladamente.

  • Interpretação da Interação smk:idade:

    • A razão de chances para um fumante (< 40 anos, SES alto) é 1.140 (Razao_de_Chances de smk1).

    • No entanto, para um fumante com 40 anos ou mais (idade=1), o efeito do fumo é modificado pelo termo de interação smk1:idade1 (OR = 2.101). A razão de chances combinada para um fumante idoso é \(1.140 \times 2.101 = 2.395\).

    • Isso significa que a chance de um fumante ter bronquite é 2.4 vezes maior que a de um não fumante no grupo de idade mais avançada, um efeito muito mais forte do que no grupo mais jovem. O intervalo de confiança para o termo de interação [1.251, 3.528] não contém o valor 1, confirmando que esta interação é significativa.

  • Interpretação da Interação smk:ses:

    • De forma similar, para um fumante com status socioeconômico baixo (ses=1), o efeito do fumo é modificado pelo termo smk1:ses1 (OR = 1.626). A razão de chances combinada é \(1.140 \times 1.626 = 1.853\).

    • Isso sugere que o efeito do fumo também é mais forte em indivíduos de baixo status socioeconômico.

Probabilidades Preditas pelo Modelo

Podemos usar o modelo para estimar a probabilidade de ter bronquite para cada um dos 8 grupos do estudo.

# predict
dados_7.18$Probabilidade_Predita <- round(predict(modelo_inter_duplas_7.18, type = "response"), 4)

knitr::kable(
  dados_7.7, 
  caption = "Probabilidades de Bronquite Preditas pelo Modelo"
)
Probabilidades de Bronquite Preditas pelo Modelo
Sexo ECG Doenca_Presente Doenca_Ausente Probabilidade_Predita
Feminino < 0,1 ST 4 11 0.2360
Feminino \(\geq\) 0,1 ST 8 10 0.4700
Masculino < 0,1 ST 9 9 0.5255
Masculino \(\geq\) 0,1 ST 21 6 0.7607

As probabilidades preditas confirmam as conclusões das interações. O grupo com maior risco de bronquite é o de fumantes, com 40 anos ou mais e baixo status socioeconômico (smk=1, ses=1, idade=1), com uma probabilidade estimada de 68.7%. Em contrapartida, o grupo de menor risco é o de não fumantes, com menos de 40 anos e alto status socioeconômico (smk=0, ses=0, idade=0), com uma probabilidade de apenas 29.9%.

Conclusão

A análise de regressão logística revelou que o status de fumo, a idade e o status socioeconômico são fatores importantes associados à bronquite. A principal conclusão é a existência de efeitos de interação significativos: o impacto do fumo no risco de bronquite é substancialmente amplificado em indivíduos com 40 anos ou mais e, em menor grau, naqueles com baixo status socioeconômico.