Menu

Regressão Logística no R: glm() com family = binomial

Modele desfechos sim/não com glm(family = binomial): leia o summary, converta coeficientes em log-odds para razões de chances com exp() e obtenha probabilidades previstas do jeito certo.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Quando o Desfecho É Sim/Não

A regressão linear prevê um número. Mas muitas das perguntas que valem a pena modelar são binárias: o cliente cancela, o paciente se recupera, o e-mail recebe um clique. Ajustar uma reta a um desfecho 0/1 quebra imediatamente - a reta alegremente prevê probabilidades de −0,3 ou 1,4, o que é um absurdo.

A regressão logística resolve isso modelando a probabilidade do desfecho por meio da transformação de log-odds (logit): log(p / (1 − p)) = intercepto + inclinação × x. A escala de log-odds percorre toda a reta dos números, então uma equação linear se encaixa naturalmente ali - e o mapeamento de volta comprime toda previsão em (0, 1) ao longo da conhecida curva em S. O preço do truque: os coeficientes vivem na escala de log-odds, e todo o jogo de ler uma regressão logística é traduzi-los de volta para algo que humanos entendam.

Ajustando: glm() com family = binomial

glm() (modelo linear generalizado) é o irmão mais velho de lm(); family = binomial seleciona a regressão logística. No mtcars, am registra o tipo de transmissão (1 = manual, 0 = automática) - carros econômicos tendem a ser manuais?

Duas coisas antes de ler a saída. Primeira, family = binomial não é opcional - omita-o e glm() ajusta silenciosamente mínimos quadrados ordinários. Segunda, o desfecho precisa ser binário: 0/1, lógico ou um fator de dois níveis (o R modela a probabilidade do segundo nível).

Agora o summary, bloco a bloco:

  • Coefficients - o Estimate de mpg é cerca de 0,31, e é uma inclinação em log-odds: cada mpg a mais soma 0,31 ao log-odds de ser manual. Positivo significa "aumenta a probabilidade", negativo significa "reduz" - além do sinal, a intuição de ninguém funciona nessa escala, e é por isso que a próxima seção existe.
  • z value e Pr(>|z|) - mesma lógica dos testes t da regressão (Estimate ÷ Std. Error, e depois um p-valor para "isso poderia ser zero?"), só que usando uma aproximação normal - daí z em vez de t. Aqui p ≈ 0,011: a associação entre mpg e tipo de transmissão dificilmente é ruído.
  • Null deviance vs Residual deviance - deviance é a medida de mau ajuste do mundo glm (menor = melhor). A null deviance (43,2 em 31 df) é o modelo só com intercepto; a residual deviance (29,7 em 30 df) é a do seu. A queda de cerca de 13,6 ao custo de um df de preditor é o análogo em glm de "o R-quadrado subiu".
  • AIC - uma nota de comparação de modelos que equilibra ajuste e complexidade; menor vence. Sem sentido sozinha, útil entre modelos candidatos sobre os mesmos dados.

De Log-Odds para Razões de Chances: exp(coef())

Exponenciar move os coeficientes da escala aditiva de log-odds para a escala multiplicativa de chances:

exp(0.307) ≈ 1.36, e aqui está o padrão de frase honesto para memorizar: "cada mpg a mais multiplica as chances de uma transmissão manual por cerca de 1,36." Uma razão de chances acima de 1 aumenta as chances, abaixo de 1 as reduz, exatamente 1 é nenhum efeito - e é por isso que o veredito de intervalo de confiança para razões de chances é "o intervalo exclui o 1?" (não o zero; o zero era a fronteira lá na escala de log-odds).

Cuidado com a linguagem: chances não são probabilidades. Chances = p / (1 − p), então probabilidade 0,75 são chances de 3. Multiplicar chances por 1,36 não é o mesmo que multiplicar probabilidade por 1,36 - e quando o desfecho é comum, a diferença é grande. Uma razão de chances de 2 para um desfecho raro se comporta como "aproximadamente o dobro do risco"; para um desfecho que ocorre em 50% dos casos, enfaticamente não. Nunca reporte uma razão de chances com a linguagem de razão de risco ("1,36 vezes mais provável") a menos que o desfecho seja raro.

Probabilidades Previstas: a Pegadinha do type = "response"

O bug mais comum de regressão logística encontrado por aí:

A primeira chamada retorna o padrão type = "link" - previsões na escala de log-odds, valores negativos e tudo. A segunda retorna probabilidades de verdade. Se suas "probabilidades" alguma vez saírem negativas ou acima de 1, é por isso. Rode o bloco: um carro de 15 mpg praticamente não tem chance de ser manual, um de 30 mpg é muito provavelmente manual, e a curva em S se dobra no meio.

Classificação: Limiar e a Tabela de Confusão

Probabilidades viram classes previstas ao se escolher um ponto de corte - 0,5 sendo a escolha padrão - e o placar honesto é uma tabela de previsto vs observado:

As células da diagonal são acertos; as duas células fora da diagonal são os dois erros diferentes (prever manual para um automático, e o contrário). A acurácia geral sozinha pode lisonjear muito um modelo - se 95% dos clientes não cancelam, "preveja que ninguém cancela" tira 95% enquanto pega zero cancelamentos - então sempre olhe os dois tipos de erro. E 0,5 é uma convenção, não uma lei: quando os dois erros têm custos diferentes, mova o limiar de acordo.

Uma ressalva de honestidade: esta tabela avalia o modelo sobre os mesmos dados nos quais ele foi ajustado, o que o lisonjeia. Uma avaliação real reserva dados que o modelo nunca viu.

Múltiplos Preditores

Exatamente como no lm() - acrescente termos com +, e toda interpretação ganha o qualificador "mantendo os demais constantes":

Cada coeficiente exponenciado agora é o multiplicador de chances para um aumento de uma unidade naquele preditor entre carros parecidos nos demais preditores. A maquinaria escala, mas as ressalvas da regressão linear também: preditores correlacionados embaralham os coeficientes uns dos outros.

Cuidados

  • Separação completa. Se um preditor divide o desfecho perfeitamente (todo carro acima de certo mpg é manual, todo abaixo é automático), o coeficiente de máxima verossimilhança quer ser infinito. O R avisa - glm.fit: fitted probabilities numerically 0 or 1 occurred - e reporta coeficientes enormes com erros padrão absurdos. Não publique esses números; simplifique o modelo, consiga mais dados ou use um método penalizado (os pacotes brglm2 ou logistf).
  • Eventos suficientes. A restrição que manda é a contagem do desfecho mais raro, não o total de linhas. Uma regra prática antiga pede da ordem de 10-15 eventos por preditor; os exemplos de 32 carros aqui servem para ensinar a mecânica, não como modelo de tamanhos de amostra publicáveis.
  • Razões de chances não são razões de risco quando o desfecho é comum - coberto acima, repetido porque os revisores vão pegar mesmo que você não pegue.

O Que Você Leva Daqui

  • Desfecho binário → glm(y ~ x, data = df, family = binomial); nunca esqueça o family.
  • Coeficientes brutos são log-odds; exp(coef(fit)) dá razões de chances, e o valor nulo para seus intervalos é 1.
  • O padrão de frase: "cada aumento de uma unidade em x multiplica as chances do desfecho por exp(b)".
  • predict(..., type = "response") para probabilidades - o padrão retorna log-odds, a confusão número um.
  • Classifique com um limiar e julgue com uma tabela de confusão; a acurácia sozinha pode mentir.
  • Fique atento a avisos de separação, conte seus eventos e não fantasie razões de chances como razões de risco.

A seguir: a maquinaria por trás de todo intervalo que você viu até aqui - intervalos de confiança com t.test(), confint() e prop.test().

Perguntas frequentes

Como rodar uma regressão logística no R?

Com glm() e family = binomial: fit <- glm(am ~ mpg, data = mtcars, family = binomial), depois summary(fit). O desfecho precisa ser binário - 0/1, TRUE/FALSE ou um fator de dois níveis. Esquecer family = binomial faz o R ajustar silenciosamente uma regressão linear comum.

Como interpretar os coeficientes do glm no R?

Os coeficientes brutos estão na escala de log-odds, na qual ninguém pensa. Exponencie-os - exp(coef(fit)) - para obter razões de chances: um valor de 1,36 para um preditor significa que cada aumento de uma unidade multiplica as chances do desfecho por cerca de 1,36. Valores acima de 1 aumentam as chances, abaixo de 1 as reduzem, exatamente 1 significa nenhum efeito.

Como obter probabilidades previstas do glm no R?

Use predict(fit, newdata, type = "response"). Essa é a pegadinha número um: o padrão type = "link" retorna log-odds, não probabilidades - então se suas "probabilidades" são negativas ou acima de 1, você esqueceu o type = "response".

Qual é a diferença entre chances e probabilidade?

Probabilidade é sucessos sobre todas as tentativas; chances (odds) são sucessos sobre fracassos. Uma probabilidade de 0,75 corresponde a chances de 3 (três sucessos por fracasso). As razões de chances da regressão logística multiplicam chances, não probabilidades - e quando o desfecho é comum, uma razão de chances pode ser bem maior que a razão de risco correspondente, então não apresente uma como a outra.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR