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