У меня проблема с функцией glm в R.

В частности, я не знаю, как включать номинальные переменные .

Результаты, которые я получаю в R после запуска функции glm, следующие:

> df

   x1 x2 y
1  a  2  0
2  b  4  1
3  a  4  0
4  b  2  1
5  a  4  1
6  b  2  0

> str(df)
'data.frame':   6 obs. of  3 variables:
 $ x1: Factor w/ 2 levels "a","b": 1 2 1 2 1 2
 $ x2: num  2 4 4 2 4 2
 $ y: Factor w/ 2 levels "0","1": 1 2 1 2 2 1

Call:
glm(formula = y ~ x1 + x2, family = "binomial", data = df)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept)   -39.132  15208.471  -0.003    0.998
x1b            19.566   7604.236   0.003    0.998
x2              9.783   3802.118   0.003    0.998

Однако, когда я запускаю функцию LogitModelFit в Wolfram Mathematica , я получаю другие параметры.

Код в Wolfram представлен ниже:

data = {{a, 2, 0}, {b, 4, 1}, {a, 4, 0}, {b, 2, 1}, {a, 4, 1}, {b, 2, 0}};

model = LogitModelFit[data, {x, y}, {x, y}, NominalVariables -> x]

model["BestFitParameters"]

И это мои примерные параметры:

{-18.5661, -18.5661, 9.28303}

model // Normal

1/(1 + E^(18.5661 - 9.28303 y + 18.5661 DiscreteIndicator[x, a, {a, b}]))

Итак, что здесь другого? Почему результаты так сильно различаются?

Я что-то делаю не так в R или в Wolfram?

6
Luka 3 Янв 2018 в 16:26

2 ответа

Лучший ответ

Фактически у вас есть 4 группы, для которых вы пытаетесь оценить 3 параметра:

library(dplyr)
df %>% group_by(x1, x2) %>% summarise(n = n(), y = mean(y))

Как видно из огромных стандартных ошибок, оценки параметров нестабильны. Стандартные ошибки для вольфрама также должны быть очень большими (если они указаны).

Во-вторых, вольфрам, похоже, использует другую референтную группу для x1:

> df$x1 <- relevel(df$x1, "b")
> m <- glm(y ~ x1 + x2, family = binomial(), data = df, control = list(maxit = 100))
> summary(m)

Call:
glm(formula = y ~ x1 + x2, family = binomial(), data = df, control = list(maxit = 100))

Deviance Residuals: 
       1         2         3         4         5         6  
-0.00008   0.00008  -1.17741   1.17741   1.17741  -1.17741  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)  -19.566   7604.236  -0.003    0.998
x1a          -19.566   7604.236  -0.003    0.998
x2             9.783   3802.118   0.003    0.998

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 8.3178  on 5  degrees of freedom
Residual deviance: 5.5452  on 3  degrees of freedom
AIC: 11.545

Number of Fisher Scoring iterations: 18

Это намного ближе к результату вольфрама (на самом деле это та же модель, что и вы; я просто выбрал другую контрольную группу).

Прогнозы для обеих моделей (glm и вольфрам) будут практически одинаковыми. Фактически любая модель с очень маленькими первыми двумя параметрами (лучшая модель будет -Inf) и третьим параметром, равным половине первых двух (9,783 * 2 = 19,566), даст почти такой же результат.

Фактор два возникает из-за того, что x2 принимает значения 2 и 4, которые отличаются на два.

4
Jan van der Laan 3 Янв 2018 в 14:28

Похоже, в вашем LogitModelFit

1/(1 + E^(18.5661 - 9.28303 y + 18.5661 DiscreteIndicator[x, a, {a, b}]))

DiscreteIndicator относится к условию сопоставления дискретных переменных x1 == 'a',

Тогда как в вашем результате подбора glm вместо этого есть дискретное условие соответствия x1b переменной x1 == 'b':

> str(df)
'data.frame':   6 obs. of  3 variables:
 $ x1: Factor w/ 2 levels "a","b": 1 2 1 2 1 2
 $ x2: num  2 4 4 2 4 2
 $ y: Factor w/ 2 levels "0","1": 1 2 1 2 2 1

Call:
glm(formula = y ~ x1 + x2, family = "binomial", data = df)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept)   -39.132  15208.471  -0.003    0.998
x1b            19.566   7604.236   0.003    0.998
x2              9.783   3802.118   0.003    0.998

Таким образом, разница, по-видимому, связана с различным способом, которым LogitModelFit и glm исключают одну зависимую категорию. LogitModelFit исключает зависимую категорию x=='a', тогда как glm исключает ее дополнение x=='b'.

3
Heikki 3 Янв 2018 в 14:28