我在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中做错了吗?
答案 0 :(得分:4)
您实际上有4组,您正在尝试估算3个参数:
library(dplyr)
df %>% group_by(x1, x2) %>% summarise(n = n(), y = mean(y))
从巨大的标准误差中可以看出,参数估计值并不稳定。 wolfram的标准误差也应该非常大(如果给出的话)。
其次,wolfram,似乎使用了不同的参考组,对于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
这更接近wolfram的结果(这实际上和你找到的模型相同;我只选择另一个参考组)。
两种模型(glm和wolfram)的预测几乎相同。实际上,前两个参数非常小的任何模型(最佳模型将是-Inf)而第三个参数等于前两个参数的一半(9.783 * 2 = 19.566)将得到几乎相同的结果。
因子2源于x2取值2和4的事实,它们相差2。
答案 1 :(得分: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
所以差异似乎是由于LogitModelFit
和glm
排除一个依赖类别的不同方式。 LogitModelFit
排除了依赖类别x=='a'
,而glm
排除了它的补充x=='b'
。