为什么我的 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 ***
我正在做一些模拟工作。我首先使用 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 ***