Risposte:
Ecco la risposta del ricercatore applicato (utilizzando il pacchetto statistico R).
Innanzitutto, creiamo alcuni dati, ovvero sto simulando i dati per un semplice modello di regressione logistica bivariata :
> 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)
Il predittore xè una variabile dicotomica:
> 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
In secondo luogo, stimare l'intercetta ( ) e la pendenza ( ). Come puoi vedere, l'intercetta è e la pendenza è .
> ## 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)
[...]
Terzo, R, come la maggior parte dei pacchetti statistici, può calcolare i valori adattati, cioè le probabilità. Userò questi valori come riferimento.
> ## Save the fitted values
> glm.fitted <- fitted(glm.mod)
glm.rcdm
> ## "Raw data + coefficients" method (RDCM)
## logit = -0.8690 + (-1.0769) * x
glm.rdcm <- -0.8690 + (-1.0769)*x
Il passaggio finale è un confronto dei valori adattati basati su fittedR'sfunction ( glm.fitted) e il mio approccio "fatto a mano" ( logit2prop.glm.rdcm). La mia funzione logit2prop(vedi primo passaggio) converte i log in probabilità:
> ## 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.fittede logit2prop.glm.rdcm.? Ci sono alcune differenze molto piccole. Non sono riuscito a capire perché non abbiamo esattamente gli stessi numeri nel tuo esempio. Quando controllo; library(arm); data.frame(logit2prop(glm.rdcm), invlogit(glm.rdcm))produce esattamente gli stessi risultati per logit2prope invlogit. Quindi, allo stesso modo, chiedo perché glm.fittede invlogitnon restituisco esattamente gli stessi numeri?
glm(y ~ x)non ti dà una regressione logistica, devi impostarefamily=binomial(link="logit"). Nota che l'output dice diDispersion parameter for gaussian familynobinomial family. Se lo fai nel modo giusto,fitted(glm.mod)restituisce effettivamente le probabilità stimate, non i logit. Ottieni i logit conpredict(glm.mod, type="link").