Logo Regressão Logística

Tutorial Transformação Digital nº12

Autor
Afiliação

Fundação João Pinheiro

Resumo

Este tutorial sobre Regressão Logística em R abrangeu desde a introdução e preparação do ambiente até a construção e avaliação do modelo usando dados fictícios. Exploramos a interpretação dos coeficientes, a odds ratio, a significância estatística e a previsão em novos dados. Concluímos com um resumo dos aprendizados e limitações da técnica.

Contato: transformacao.digital@fjp.mg.gov.br

1 O que é Regressão Logística?

A Regressão Logística é uma técnica estatística utilizada para modelar a probabilidade de um evento binário ocorrer, ou seja, um evento com dois possíveis resultados, como “sim” ou “não”, “sucesso” ou “fracasso”. Ao contrário da Regressão Linear, que prevê valores contínuos, a Regressão Logística prevê a probabilidade de uma variável dependente binária.

1.1 Diferenças entre Regressão Linear e Logística

Natureza da Variável Dependente: Na Regressão Linear, a variável dependente é contínua, enquanto na Regressão Logística, ela é categórica binária.

Função de Ligação: A Regressão Linear usa uma função linear, enquanto a Regressão Logística usa a função logística (ou sigmoide) para transformar a saída em uma probabilidade entre 0 e 1.

Interpretação dos Coeficientes: Na Regressão Linear, os coeficientes representam a mudança esperada na variável dependente para uma unidade de mudança na variável independente. Na Regressão Logística, os coeficientes são interpretados em termos de odds ratio.

2 Odds Ratio

2.1 O que é Odds?

Antes de entender a Odds Ratio, é importante compreender o que são “odds”. Em estatística, “odds” representam a razão entre a probabilidade de um evento ocorrer e a probabilidade de ele não ocorrer. Matematicamente, é expresso como:

[ = ]

Por exemplo, se a probabilidade de desenvolver alguma doença cardiovascular entre fumantes é 0,8 (ou 80%) - supondo um estudo com tal amostra, os odds seriam:

[ = = 4 ]

Isso significa que as chances de desenvolver alguma doença cardiovascular entre fumantes são 4 vezes a de não apresentar a doença, ou que as chances de adoecer entre os fumantes são 3 vezes maiores de não ficar doente.

2.2 O que é Odds Ratio?

A odds ratio, ou razão de chances, é uma medida estatística utilizada para determinar a força da associação entre duas variáveis categóricas. Em termos simples, ela compara as odds (ou chances) de um evento ocorrer em um grupo em relação às odds do mesmo evento ocorrer em outro grupo.

Então, considerando nosso exemplo. Vamos considerar um grupo não fumantes com a prevalência da doença de 0,3 (30%) e o nosso grupo anterior de fumantes com 0,8 (80%) da população da amostra com a doença.

Grupo não fumantes:

[ = = 0,43 ]

A chance de desenvolver a doença entre os não fumantes é, neste caso, 0,43 vezes a de não desenvolver a doença.

Agora vamos realizar a Odds Ratio entre fumantes e não fumantes com o desfecho de aparecimento de doença cardiovascular. Então dividir a odds do evento acontencer entre o grupo 1 em relação a odds do evento acontecer entre o grupo 2

[ = = 9,30 ]

Neste caso, a odds de desenvolvimento de doença cardiovascular é 9,30 vezes em média entre fumantes, em relação aos não fumantes. Ou, a chance de desenvolvimento de doença cardiovascular é 830% vezes em média maior entre fumantes, em relação aos não fumantes.

2.2.1 Interpretação da Odds Ratio

OR = 1: Não há associação entre a variável independente e a variável dependente. A variável independente não afeta as odds do evento.

OR > 1: A variável independente está associada a um aumento nas odds do evento. Por exemplo, um OR de 2 indica que as odds do evento são duas vezes para cada unidade na variável independente.

OR < 1: A variável independente está associada a uma diminuição nas odds do evento. Por exemplo, um OR de 0,5 indica que as odds do evento são metade para cada unidade de aumento na variável independente.

2.2.2 Exemplo Prático

Se em um estudo médico, a OR para o efeito de um novo medicamento na cura de uma doença é 3, isso significa que os pacientes que tomam o medicamento têm três vezes chances de se curar em comparação com aqueles que não tomam, ou duas vezes mais de se curar em comparação cm aqueles que não tomam.

A Odds Ratio é uma ferramenta valiosa para interpretar os resultados de um modelo de Regressão Logística, especialmente em estudos de caso-controle e outras análises de dados categóricos.

3 Pacotes necessários para Regressão Logística

  1. stats

O pacote stats é um dos pacotes base do R e inclui a função glm() para ajustar modelos de regressão logística.

#instalação
install.packages("stats")

#Exemplo de uso:
#model <- glm(formula, data = dataset, family = binomial)
  1. car

O pacote car oferece funções úteis para análise de regressão, como a verificação de multicolinearidade com a função vif().

# Define o espelho do CRAN (escolha um próximo a você)
options(repos = c(CRAN = "https://cran.rstudio.com/")) # Ou outro espelho

# Instala o pacote 'car' se ainda não estiver instalado
if (!require(car)) install.packages("car")

#Exemplo de uso
#vif(model)
  1. ResourceSelection

O pacote ResourceSelection é usado para realizar o teste de Hosmer e Lemeshow, que avalia o ajuste do modelo de regressão logística.

#Instalação:
  install.packages("ResourceSelection")
pacote 'ResourceSelection' desempacotado com sucesso e somas MD5 verificadas

Os pacotes binários baixados estão em
    C:\Users\x14585245\AppData\Local\Temp\Rtmp4c2Duf\downloaded_packages
#Exemplo de uso:
library(ResourceSelection)
#hoslem.test(model$y, fitted(model))
  1. hnp

O pacote hnp é utilizado para criar envelopes de simulação, que ajudam a avaliar a adequação do modelo.

#Instalação:
install.packages("hnp")
pacote 'hnp' desempacotado com sucesso e somas MD5 verificadas

Os pacotes binários baixados estão em
    C:\Users\x14585245\AppData\Local\Temp\Rtmp4c2Duf\downloaded_packages
#Exemplo de uso:
library(hnp)
#hnp(model)

4 Entendendo os Dados

  1. Criação dos Dados

Vamos criar um conjunto de dados fictício com 100 observações. As variáveis serão doenca (indicando a presença ou ausência de uma doença), idade e pressao.

A variável doenca será binária (0 ou 1), enquanto idade e pressao serão variáveis contínuas.

# Definindo o número de observações
n <- 100

# Gerando a variável idade (entre 20 e 80 anos)
set.seed(123)  # Para reprodutibilidade
idade <- runif(n, min = 20, max = 80)

# Gerando a variável pressao (baseada em valores realistas de pressão arterial)
# Pressão sistólica entre 90 e 180 mmHg
pressao <- rnorm(n, mean = 120, sd = 15)

# Calculando a probabilidade de ter a doença
# Ajustando os coeficientes para atingir cerca de 30% de doentes
logit_prob <- -8 + 0.06 * idade + 0.04 * pressao
prob_doenca <- 1 / (1 + exp(-logit_prob))

# Gerando a variável binária doenca com base na probabilidade calculada
doenca <- rbinom(n, size = 1, prob = prob_doenca)

# Criando o data frame
dados <- data.frame(doenca = doenca, idade = idade, pressao = pressao)
  1. Visualização dos Dados

Vamos visualizar os primeiros registros do conjunto de dados para garantir que foram gerados corretamente.

head(dados)
  doenca    idade  pressao
1      1 37.25465 123.7998
2      1 67.29831 119.5718
3      1 44.53862 119.3569
4      1 72.98104 140.5290
5      1 76.42804 116.6134
6      0 22.73339 142.7471

5 Construção do Modelo de Regressão Logística

  1. Ajuste do Modelo

Ajustamos um modelo de Regressão Logística usando a função glm(), com doenca como variável dependente e idade e pressao como preditores.

Utilizamos a função glm() (Generalized Linear Model) para ajustar um modelo de Regressão Logística. Neste caso, estamos interessados em modelar a probabilidade de um paciente ter uma doença (doenca) com base em duas variáveis preditoras: idade e pressao.

A família binomial com link logit é especificada para indicar que estamos ajustando um modelo de Regressão Logística.

ajust <- glm(doenca ~ idade + pressao, family = binomial(link = "logit"), data = dados)

1.1 Após ajustar o modelo, usamos a função summary() para obter um resumo estatístico dos resultados. Este resumo inclui os coeficientes estimados, erros padrão, valores z e valores p para cada preditor no modelo.

summary(ajust)

Call:
glm(formula = doenca ~ idade + pressao, family = binomial(link = "logit"), 
    data = dados)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -10.24308    2.55532  -4.009 6.11e-05 ***
idade         0.06194    0.01564   3.962 7.45e-05 ***
pressao       0.05921    0.01835   3.227  0.00125 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 138.47  on 99  degrees of freedom
Residual deviance: 109.08  on 97  degrees of freedom
AIC: 115.08

Number of Fisher Scoring iterations: 4
  1. Interpretação dos Resultados:

Coeficientes: Indicam a mudança no logaritmo das odds de doenca para uma unidade de aumento na variável preditora. Um coeficiente positivo sugere que o aumento na variável preditora está associado a um aumento na probabilidade de doenca.

Erro Padrão: Mede a variabilidade da estimativa do coeficiente.

Valor z: Calculado como o coeficiente dividido pelo erro padrão. Indica quantos desvios padrão o coeficiente está longe de zero.

Valor p: Indica a significância estatística do coeficiente. Valores p menores que 0,05 geralmente indicam que a variável preditora é estatisticamente significativa.

  1. Avaliação do Modelo

Podemos acessar os valores ajustados, resíduos e calcular o deviance residual para avaliar o ajuste do modelo.

Os valores ajustados (fitted.values) representam as probabilidades previstas de doenca para cada observação no conjunto de dados.

Os resíduos de deviance (residuals) medem a diferença entre os valores observados e ajustados. O deviance residual é uma medida de ajuste do modelo.

fitted_values <- ajust$fitted.values
residuals_deviance <- residuals(ajust, type = 'deviance')
QL <- sum(residuals_deviance^2)
p_value_QL <- 1 - pchisq(QL, df.residual(ajust))

# Imprimir o valor-p
print(p_value_QL)
[1] 0.1890949

Interpretação dos Resultados:

Deviance Residual: Um valor menor indica um melhor ajuste do modelo aos dados.

Teste Qui-Quadrado: O valor p associado ao deviance residual indica se o modelo ajusta bem os dados. Um valor p maior que 0,05 sugere que o modelo é adequado.

4.Modelo com Interação (Opcional)

Se desejarmos, podemos ajustar um modelo que inclua a interação entre idade e pressao.

ajust_interacao <- glm(doenca ~ idade * pressao, family = binomial(link = "logit"), data = dados)
summary(ajust_interacao)

Call:
glm(formula = doenca ~ idade * pressao, family = binomial(link = "logit"), 
    data = dados)

Coefficients:
               Estimate Std. Error z value Pr(>|z|)
(Intercept)   -1.383718   7.348285  -0.188    0.851
idade         -0.121365   0.147729  -0.822    0.411
pressao       -0.014768   0.061050  -0.242    0.809
idade:pressao  0.001548   0.001253   1.235    0.217

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 138.47  on 99  degrees of freedom
Residual deviance: 107.48  on 96  degrees of freedom
AIC: 115.48

Number of Fisher Scoring iterations: 5

Interpretação dos Resultados:

Interação: Um termo de interação significativo indica que o efeito de uma variável preditora sobre a resposta depende do nível da outra variável preditora.

  1. Gráficos e Intervalos de Confiança

Criamos gráficos para visualizar a relação entre as variáveis e calculamos intervalos de confiança para os coeficientes do modelo, o que ajuda na interpretação dos resultados.

plot(dados$idade, fitted_values, xlab = "Idade", ylab = "Probabilidade de Doença", main = "Probabilidade de Doença por Idade")
abline(lm(fitted_values ~ dados$idade), col = "blue")

exp(ajust$coefficients) #Odds Ratio
 (Intercept)        idade      pressao 
3.560319e-05 1.063902e+00 1.060999e+00 
exp(confint(ajust)) #Intervalo de Confiança
                   2.5 %      97.5 %
(Intercept) 1.512801e-07 0.003707029
idade       1.033645e+00 1.099565892
pressao     1.025647e+00 1.102887449

Interpretação dos Resultados:

Gráfico: Visualiza a relação entre idade e a probabilidade prevista de doenca.

Odds Ratio: Idade: 1,0639 Ou seja, para cada aumento de 1 unidade na idade, a chance de desenvolver a doença aumenta em aproximadamente 6.39%. Pressão: 1,0610, ou seja, indica que, para cada aumento de 1 unidade na pressão, a chance de desenvolver a doença aumenta em cerca de 6.10%

Intervalos de Confiança: Fornecem uma faixa de valores plausíveis para os coeficientes, ajudando a entender a precisão das estimativas. Neste caso, usamos um intervalo de confiança de 95%.

Caso o intervalo contenha o valor de similaridade dos fatores (o número 1), então deve-se considerar que não há valor significativo.

Ex: (0,82 - 1,20) Como apresenta o número 1 dentro do intervalo, os valores não apresentam diferença significativa.

5.Teste de Hosmer e Lemeshow

Realizamos o teste de Hosmer e Lemeshow para avaliar o ajuste do modelo.

library(ResourceSelection)
hl_test <- hoslem.test(dados$doenca, fitted(ajust), g = 10)
print(hl_test)

    Hosmer and Lemeshow goodness of fit (GOF) test

data:  dados$doenca, fitted(ajust)
X-squared = 9.3275, df = 8, p-value = 0.3154

Interpretação dos Resultados:

Teste de Hosmer e Lemeshow: Um valor p maior que 0,05 sugere que o modelo ajusta bem os dados a um nível de significância de 95%.

  1. Envelope de Simulação Utilizamos o pacote hnp para criar um envelope de simulação, que ajuda a avaliar a adequação do modelo visualmente.
library(hnp)
hnp(ajust)
Binomial model 

Interpretação dos Resultados:

Envelope de Simulação: Visualiza a adequação do modelo. Se a maioria dos pontos residuais estiver dentro do envelope, o modelo é considerado adequado.

6 Implementação e Previsão

6.1 Uso do Modelo para Previsões em Novos Dados

1.Preparação de Novos Dados:

Suponha que temos um novo conjunto de dados com as mesmas variáveis preditoras (idade e pressão) e queremos prever a probabilidade de doenca.

novos_dados <- data.frame(idade = c(45, 60, 30), pressao = c(190, 130, 115))
  1. Previsão com o Modelo Ajustado:

Usamos a função predict() para prever as probabilidades de doenca para os novos dados. O argumento type = “response” retorna as probabilidades.

previsoes <- predict(ajust, newdata = novos_dados, type = "response")
previsoes
        1         2         3 
0.9780003 0.7633204 0.1714338 

Interpretação dos Resultados

Probabilidades Previstas:

As probabilidades previstas indicam a chance de cada observação nos novos dados ter a doença. Valores próximos de 1 indicam alta probabilidade, enquanto valores próximos de 0 indicam baixa probabilidade.

Decisão Baseada em Previsões:

Dependendo do contexto, você pode definir um limiar (por exemplo, 0.5) para classificar as previsões como presença ou ausência da doença.

7 Conclusão

7.1 Resumo dos Aprendizados

Regressão Logística: Aprendemos a ajustar um modelo de Regressão Logística em R, interpretar os coeficientes e avaliar o ajuste do modelo.

Geração de Dados: Criamos dados fictícios para simular um cenário realista e ajustamos o modelo para esses dados.

Avaliação do Modelo: Utilizamos métricas como deviance residual e AIC para avaliar o modelo.

Previsão: Aplicamos o modelo para prever novos dados e interpretamos as probabilidades previstas.

7.2 Limitações da Regressão Logística

Assunção de Linearidade: A Regressão Logística assume uma relação linear entre as variáveis preditoras e o logaritmo das odds.

Multicolinearidade: A presença de multicolinearidade entre variáveis preditoras pode afetar a estabilidade das estimativas dos coeficientes.

Dados Balanceados: A Regressão Logística pode ter desempenho inferior em conjuntos de dados altamente desbalanceados.

8 Referências

Applied Logistic Regression, Hosmer & Lemeshow (2000), 2 nd edição. Modeling Binary Data, Collet (2002), 2nd edição. Giolo, Introdução à Análise de Dados Categóricos com Aplicações (2011).