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

时间:2019-02-20 19:20:49

标签: r mle

我正在做一些模拟工作。我首先使用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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这不是编程问题,而是关于理解模型的问题。我不特别喜欢您如何编码模拟,但这不是我在这里要解决的。

在广义线性模型中,在应用链接之前不会添加随机噪声。丢东西的线是:

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

您不应添加其他错误,因此应将其更改为:

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