glm和LogitModelFit之间的区别

6

我在R中使用glm函数时遇到了问题。

具体来说,我不确定如何包含名义变量

运行glm函数后,在R中得到的结果如下:

> 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

然而,当我在 Wolfram Mathematica 中运行 LogitModelFit 函数时,输出的参数有所不同。

以下是 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中做错了什么吗?

1
这只是一个简单的例子。 - Luka
2个回答

4

您有效地拥有四个组,您正在尝试估计其中的三个参数:

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

从极大的标准误差可以看出,参数估计不稳定。如果提供了wolfram的标准误差,它们也应该非常大。
其次,针对x1,wolfram似乎使用了不同的参考组。
> 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和wolfram两种模型的预测几乎相等。事实上,任何前两个参数非常小的模型(最佳模型为-Inf),第三个参数等于前两个参数的一半(9.783*2 = 19.566)都会给出几乎相同的结果。

因为x2的取值为2和4,相差为2,所以这个系数是来自这个事实。


3
似乎在你的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

因此,差异似乎是由于LogitModelFitglm排除一个依赖类别的方式不同造成的。LogitModelFit排除了依赖类别x=='a',而glm则排除了它的补集x=='b'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接