首页 > 解决方案 > 为什么我的 glm logit 估计非常有偏差?

问题描述

我正在做一些模拟工作。我首先使用 logit 来获取每个观察的处理概率,然后使用 rbniom() 生成二进制处理变量。

观察到治疗变量后,我使用带有 logit 链接的 glm 来估计参数 gamma。它应该是 1,但多次尝试(即使增加了样本数),它仍然在 0.3 左右。偏见从何而来?

附上代码

set.seed(99)
n = 10000
for (rv in c('X1','X2', 'Z1', 'Z2','e','u')){
  assign(rv, rnorm(n =n, mean = 0, sd =5))
  # check values
  # get(rv), eval(as.name/symbol(rv))
}
X = cbind(X1,X2)
Z = cbind(Z1,Z2)
gamma = c(1,1)
# treatment probability for each observation
p_treatment = 1/(1+exp(-(X%*%gamma+e)))
# track treated or not
treated = mapply(FUN = rbinom, prob = p_treatment, size = 1, n = 1)
beta = c(1,1)
y = 1 + X%*%beta+treated+u
fit_lgt = glm(treated ~ X, family = binomial(link = 'logit'))
summary(fit_lgt)

标签: rmle

解决方案


逻辑模型中没有e术语。所以p_treatment应该计算为:

p_treatment = 1/(1+exp(-(X%*%gamma)))

这可以让你得到正确的估计:

            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.01441    0.04304   0.335    0.738    
XX1          1.03875    0.02643  39.297   <2e-16 ***
XX2          1.00852    0.02589  38.951   <2e-16 ***

推荐阅读