Respostas:
Aqui está a resposta do pesquisador aplicado (usando o pacote estatístico R).
Primeiro, vamos criar alguns dados, ou seja, estou simulando dados para um simples de modelo de regressão logística bivariada :
> set.seed(3124)
>
> ## Formula for converting logit to probabilities
> ## Source: http://www.statgun.com/tutorials/logistic-regression.html
> logit2prop <- function(l){exp(l)/(1+exp(l))}
>
> ## Make up some data
> y <- rbinom(100, 1, 0.2)
> x <- rbinom(100, 1, 0.5)
O preditor x
é uma variável dicotômica:
> x
[1] 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 1
[48] 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 0
[95] 1 1 1 1 1 0
Segundo, estime a interceptação ( ) e a inclinação ( ). Como você pode ver, a interceptação é e a inclinação é .
> ## Run the model
> summary(glm.mod <- glm(y ~ x, family = "binomial"))
[...]
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.8690 0.3304 -2.630 0.00854 **
x -1.0769 0.5220 -2.063 0.03910 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
[...]
Terceiro, R, como a maioria dos pacotes estatísticos, pode calcular os valores ajustados, ou seja, as probabilidades. Vou usar esses valores como referência.
> ## Save the fitted values
> glm.fitted <- fitted(glm.mod)
Quarto, essa etapa se refere diretamente à sua pergunta: temos os dados brutos (aqui: ) e os coeficientes ( e ). Agora, vamos calcular os logits e salvar esses valores ajustados em :glm.rcdm
> ## "Raw data + coefficients" method (RDCM)
## logit = -0.8690 + (-1.0769) * x
glm.rdcm <- -0.8690 + (-1.0769)*x
O passo final é uma comparação dos valores ajustados com base na fitted
função de R ( glm.fitted
) e na minha abordagem "artesanal" ( logit2prop.glm.rdcm
). Minha própria função logit2prop
(consulte a primeira etapa) converte logits em probabilidades:
> ## Compare fitted values and RDCM
> df <- data.frame(glm.fitted, logit2prop(glm.rdcm))
> df[10:25,]
> df[10:25,]
glm.fitted logit2prop.glm.rdcm.
10 0.1250000 0.1250011
11 0.2954545 0.2954624
12 0.1250000 0.1250011
13 0.2954545 0.2954624
14 0.2954545 0.2954624
15 0.1250000 0.1250011
16 0.1250000 0.1250011
17 0.1250000 0.1250011
18 0.2954545 0.2954624
19 0.1250000 0.1250011
20 0.1250000 0.1250011
21 0.1250000 0.1250011
22 0.1250000 0.1250011
23 0.1250000 0.1250011
24 0.1250000 0.1250011
25 0.2954545 0.2954624
glm.fitted
e logit2prop.glm.rdcm.
? Existem algumas diferenças muito, muito pequenas. Não consegui entender por que não temos exatamente os mesmos números no seu exemplo. Quando eu verifico; library(arm); data.frame(logit2prop(glm.rdcm), invlogit(glm.rdcm))
produz exatamente os mesmos resultados para logit2prop
e invlogit
. Daí, igualmente, pergunto por que glm.fitted
e invlogit
não retorno exatamente os mesmos números?
glm(y ~ x)
não fornece uma regressão logística, você deve definirfamily=binomial(link="logit")
. Observe que a saída diz queDispersion parameter for gaussian family
nãobinomial family
. Se você fizer certo,fitted(glm.mod)
na verdade retornará as probabilidades estimadas, não os logits. Você obtém os logits compredict(glm.mod, type="link")
.