Calculando intervalos de confiança para uma regressão logística

15

Estou usando uma regressão logística binomial para identificar se a exposição has_xou has_yafeta a probabilidade de um usuário clicar em algo. Meu modelo é o seguinte:

fit = glm(formula = has_clicked ~ has_x + has_y, 
          data=df, 
          family = binomial())

Esta é a saída do meu modelo:

Call:
glm(formula = has_clicked ~ has_x + has_y, 
    family = binomial(), data = active_domains)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9869  -0.9719  -0.9500   1.3979   1.4233  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -0.504737   0.008847 -57.050  < 2e-16 ***
has_xTRUE -0.056986   0.010201  -5.586 2.32e-08 ***
has_yTRUE  0.038579   0.010202   3.781 0.000156 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 217119  on 164182  degrees of freedom
Residual deviance: 217074  on 164180  degrees of freedom
AIC: 217080

Number of Fisher Scoring iterations: 4

Como cada coeficiente é significativo, usando esse modelo, sou capaz de dizer qual é o valor de qualquer uma dessas combinações usando a seguinte abordagem:

predict(fit, data.frame(has_x = T, has_y=T), type = "response")

Não entendo como posso reportar sobre o DST. Erro da previsão.

  1. Eu só preciso usar ? Ou preciso converter o usando uma abordagem descrita aqui ?1,96SESE

  2. Se eu quiser entender o erro padrão das duas variáveis, como eu consideraria isso?

Diferentemente desta questão , estou interessado em entender quais são os limites superior e inferior do erro em uma porcentagem. Por exemplo, da minha previsão mostra um valor de 37%, pois True,Trueposso calcular que isso é para um ? (0,3% escolhido para ilustrar meu argumento)+/-0,395%CEu

celenius
fonte
Duplicado: stats.stackexchange.com/questions/5304/…
kjetil b halvorsen
@kjetilbhalvorsen, você tem certeza de que é uma duplicata, pois o OP parece querer um intervalo de previsão, mas parece estar trabalhando na escala OR, em vez da escala de log, que pode ser a raiz do problema?
Mdewey 03/07
2
Se você deseja avaliar o quão boa uma regressão logística prevê, geralmente se usa medidas diferentes da previsão + SE. Uma medida de avaliação popular, ist o ROC-Curve com a respectiva AUC
adibender
1
Isso poderia ser de alguma ajuda? stackoverflow.com/questions/47414842/…
Xavier Bourret Sicotte

Respostas:

24

Sua pergunta pode vir do fato de você estar lidando com probabilidades e probabilidades, o que é confuso no início. Como o modelo logístico é uma transformação não linear da computação os intervalos de confiança não são tão diretos.βTx

fundo

Lembre-se de que, para o modelo de regressão logística

  • Probabilidade de :p = e α + β 1 x 1 + β 2 x 2(Y=1)p=eα+β1x1+β2x21+eα+β1x1+β2x2

  • Probabilidades de :( p(Y=1)(p1-p)=eα+β1x1+β2x2

  • Probabilidades de log de :log ( p(Y=1)registro(p1-p)=α+β1x1+β2x2

Considere o caso em que você tem um aumento de uma unidade na variável , ou seja, , as novas chances sãox 1 + 1x1x1+1

Odds(Y=1)=eα+β1(x1+1)+β2x2=eα+β1x1+β1+β2x2
  • Odds Ratio (OR) são, portanto,

Odds(x1+1)Odds(x1)=eα+β1(x1+1)+β2x2eα+β1x1+β2x2=eβ1
  • Proporção de probabilidades de log = β1

  • Risco relativo ou (razão de probabilidade) =eα+β1x1+β1+β2x21+eα+β1x1+β1+β2x2eα+β1x1+β2x21+eα+β1x1+β2x2

Interpretação de coeficientes

Como você interpretaria o valor do coeficiente ? Supondo que tudo o resto permaneça fixo:βj

  • Para cada aumento de unidade em a razão de chances de log aumenta em .β jxjβj
  • Para cada aumento de unidade em o odds ratio aumenta em .e β jxjeβj
  • Para cada aumento de de para a razão de chances aumenta em k k + Δ e β j Δxjkk+ΔeβjΔ
  • Se o coeficiente for negativo, um aumento em leva a uma diminuição na razão de chances.xj

Intervalos de confiança para um único parâmetroβj

Eu só preciso usar ? Ou preciso converter o SE usando uma abordagem descrita aqui?1.96SE

Como o parâmetro é estimado usando a Estimativa Máxima de Verossimilhança, a teoria do MLE nos diz que é assintoticamente normal e, portanto, podemos usar o grande intervalo de confiança da amostra de Wald para obter o valor usual.βj

βj±zSE(βj)

O que fornece um intervalo de confiança na razão de chances de log. O uso da propriedade invariância do MLE nos permite exponenciar para obter

eβj±zSE(βj)

que é um intervalo de confiança no odds ratio. Observe que esses intervalos são apenas para um único parâmetro.

Se eu quiser entender o erro padrão das duas variáveis, como eu consideraria isso?

Se você incluir vários parâmetros, poderá usar o procedimento de Bonferroni; caso contrário, para todos os parâmetros, poderá usar o intervalo de confiança para estimativas de probabilidade

Procedimento de Bonferroni para vários parâmetros

Se os parâmetros devem ser estimados com coeficiente de confiança da família de aproximadamente , os limites de confiança de Bonferroni sãog1α

βg±z(1α2g)SE(βg)

Intervalos de confiança para estimativas de probabilidade

O modelo logístico gera uma estimativa da probabilidade de observação de um e pretendemos construir um intervalo freqüencial em torno da probabilidade verdadeira modo quepPr(pLppU)=.95

Uma abordagem chamada transformação de terminal faz o seguinte:

  • Calcule os limites superior e inferior do intervalo de confiança para a combinação linear (usando o Wald CI)xTβ
  • Aplique uma transformação monotônica nos pontos de extremidade para obter as probabilidades.F(xTβ)

Como é uma transformação monotônica dePr(xTβ)=F(xTβ)xTβ

[Pr(xTβ)LPr(xTβ)Pr(xTβ)U]=[F(xTβ)LF(xTβ)F(xTβ)U]

Concretamente, isso significa calcular e aplicar a conversão logit ao resultado para obter os limites inferior e superior:βTx±zSE(βTx)

[exTβzSE(xTβ)1+exTβzSE(xTβ),exTβ+zSE(xTβ)1+exTβ+zSE(xTβ),]

A variação aproximada estimada de pode ser calculada usando a matriz de covariância dos coeficientes de regressão usandoxTβ

Var(xTβ)=xTΣx

A vantagem deste método é que os limites não podem estar fora da faixa(0,1)

Também existem várias outras abordagens, usando o método delta, bootstrapping etc., cada um com suas próprias suposições, vantagens e limites.


Fontes e informações

Meu livro favorito sobre esse tópico é "Modelos estatísticos lineares aplicados", de Kutner, Neter, Li, capítulo 14

Caso contrário, aqui estão algumas fontes online:

Xavier Bourret Sicotte
fonte
Muito disso é sobre IC para os coeficientes, o que é bom para o OP saber, mas temos certeza de que é disso que ele precisa? Você mais tarde, a seção me parece mais relevante, mas talvez as distinções possam ser perdidas se lidas muito rapidamente?
Mdewey 7/07
2
Sim, você provavelmente está certo - mas entender probabilidades, probabilidades de log e probabilidades de regressão de log é algo com o qual lutei no passado - espero que este post resuma o tópico suficientemente bem para que possa ajudar alguém no futuro. Talvez eu pudesse responder à pergunta de forma mais explícita, fornecendo uma CI mas precisaríamos a matriz de covariância
Xavier Bourret Sicotte
5

Para obter o intervalo de confiança de 95% da previsão, você pode calcular na escala de logit e depois convertê-los novamente na escala de probabilidade 0-1. Aqui está um exemplo usando o conjunto de dados titânico.

library(titanic)
data("titanic_train")

titanic_train$Pclass = factor(titanic_train$Pclass, levels = c(1,2,3), labels = c('First','Second','Third'))

fit = glm(Survived ~ Sex + Pclass, data=titanic_train, family = binomial())

inverse_logit = function(x){
  exp(x)/(1+exp(x))
}

predicted = predict(fit, data.frame(Sex='male', Pclass='First'), type='link', se.fit=TRUE)

se_high = inverse_logit(predicted$fit + (predicted$se.fit*1.96))
se_low = inverse_logit(predicted$fit - (predicted$se.fit*1.96))
expected = inverse_logit(predicted$fit)

O IC médio e baixo / alto de 95%.

> expected
        1 
0.4146556 
> se_high
        1 
0.4960988 
> se_low
        1 
0.3376243 

E a saída de apenas usar type='response', o que apenas dá a média

predict(fit, data.frame(Sex='male', Pclass='First'), type='response')
        1 
0.4146556
Shawn
fonte
predict(fit, data.frame(Sex='male', Pclass='First'), type='response', se.fit=TRUE)vai funcionar.
Tony416