Oto odpowiedź zastosowanego badacza (przy użyciu pakietu statystyk R).
Najpierw stwórzmy dane, tzn. Symuluję dane dla prostego dwuwymiarowego modelu regresji logistycznej :log(p1−p)=β0+β1⋅x
> 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)
Predyktor x
jest zmienną dychotomiczną:
> 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
Po drugie, oszacuj przecięcie ( ) i nachylenie ( β 1 ). Jak widać przecięcie wynosi β 0 = - 0,8690, a nachylenie wynosi β 1 = - 1,0769 .β0β1β0=−0.8690β1=−1.0769
> ## 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)
[...]
Po trzecie, R, jak większość pakietów statystycznych, może obliczyć dopasowane wartości, tj. Prawdopodobieństwa. Użyję tych wartości jako odniesienia.
> ## Save the fitted values
> glm.fitted <- fitted(glm.mod)
xβ0β1 ). Teraz obliczmy logi i zapisz te dopasowane wartości w glm.rcdm
:
> ## "Raw data + coefficients" method (RDCM)
## logit = -0.8690 + (-1.0769) * x
glm.rdcm <- -0.8690 + (-1.0769)*x
Ostatnim krokiem jest porównanie dopasowanych wartości na podstawie funkcji R fitted
( glm.fitted
) i mojego „ręcznego” podejścia ( logit2prop.glm.rdcm
). Moja własna funkcja logit2prop
(patrz pierwszy krok) przekształca logi w prawdopodobieństwa:
> ## 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(y ~ x)
nie daje to regresji logistycznej, musisz ustawićfamily=binomial(link="logit")
. Zauważ, że wynik mówiDispersion parameter for gaussian family
, niebinomial family
. Jeśli zrobisz to dobrze,fitted(glm.mod)
faktycznie zwraca szacunkowe prawdopodobieństwa, a nie logi. Dostajesz logi zpredict(glm.mod, type="link")
.glm.fitted
ilogit2prop.glm.rdcm.
? Istnieje kilka bardzo małych różnic. Nie mogłem zrozumieć, dlaczego nie mamy dokładnie takich samych liczb w twoim przykładzie. Kiedy sprawdzę;library(arm); data.frame(logit2prop(glm.rdcm), invlogit(glm.rdcm))
daje dokładnie takie same wyniki dlalogit2prop
iinvlogit
. Dlatego też pytam dlaczegoglm.fitted
iinvlogit
nie zwracam dokładnie tych samych liczb?źródło