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)\]
# 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")| 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 |
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
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 | 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.
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"
)| 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%.
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.
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\)).
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")| 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
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.
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 | 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.
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"
)| 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).
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.
A escolha do tratamento tem um impacto substancial na cura: Os tratamentos não possuem a mesma eficácia.
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.
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\)).
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)")| 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 |
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.
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 | 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.
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"
)| 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%.
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.