Ответы:
Вот ответ прикладного исследователя (с использованием пакета статистики R).
Во-первых, давайте создадим некоторые данные, т.е. я имитирую данные для простого двумерной модели логистической регрессии :
> 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)
Предиктор x
является дихотомической переменной:
> 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
Во-вторых, ( ) и наклон ( ). Как видите, равна а наклон равен .
> ## 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)
[...]
В-третьих, R, как и большинство статистических пакетов, может вычислять подогнанные значения, то есть вероятности. Я буду использовать эти значения в качестве ссылки.
> ## 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
Последний шаг - это сравнение подгоночных значений, основанных на R fitted
-функции ( glm.fitted
) и моем подходе "ручной работы" ( logit2prop.glm.rdcm
). Моя собственная функция logit2prop
(см. Первый шаг) преобразует логиты в вероятности:
> ## 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
и logit2prop.glm.rdcm.
? Есть некоторые очень очень маленькие различия. Я не мог понять, почему у нас нет одинаковых цифр в вашем примере. Когда я проверю; library(arm); data.frame(logit2prop(glm.rdcm), invlogit(glm.rdcm))
дает точно такие же результаты для logit2prop
и invlogit
. Следовательно, в равной степени я спрашиваю, почему glm.fitted
и invlogit
возвращаю не одинаковые цифры?
glm(y ~ x)
не дает вам логистической регрессии, вы должны установитьfamily=binomial(link="logit")
. Обратите внимание на вывод говоритDispersion parameter for gaussian family
, что нетbinomial family
. Если вы все сделаете правильно, наfitted(glm.mod)
самом деле возвращает оценочные вероятности, а не логиты. Вы получаете логиты сpredict(glm.mod, type="link")
.