为什么我的 glm logit 估计有很大偏差?

Why my glm logit estimation is very biased?

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

观察到治疗变量后,我使用 glm 和 logit link 来估计参数 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)

这不是编程问题,而是关于理解模型的问题。我不太喜欢您对模拟进行编码的方式,但这不是我要在这里解决的问题。

在广义线性模型中,您不会在应用 link 之前添加随机噪声。扔东西的那一行是:

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

您不应该添加额外的错误,因此您应该将其更改为:

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

Logistic 模型中没有 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 ***