Answers:
这是应用研究人员的答案(使用统计软件包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
第二,估计截距()和斜率(β 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)
[...]
第三,像大多数统计数据包一样,R可以计算拟合值,即概率。我将使用这些值作为参考。
> ## Save the fitted values
> glm.fitted <- fitted(glm.mod)
第四,这一步直接指向你的问题:我们的原始数据(这里:),我们有系数(β 0和β 1)。现在,让我们计算logit并将这些拟合值保存在中: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
(请参阅第一步)将logit转换为概率:
> ## 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)
实际上返回估计的概率,而不是对数。您将获得logitspredict(glm.mod, type="link")
。