r - 为什么我的 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)
解决方案
逻辑模型中没有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 ***
推荐阅读
- vue.js - 通过添加调整大小事件监听器来更新 DOM 元素的高度
- node.js - knex.js 中的子查询或 knex.js 中使用原始或任何替代方式的直接 postgresql 查询
- python - 谷歌翻译 API id 阻止了太多请求的 IP 地址
- anaconda - chatterbot 网站上的示例代码在 spyder 上运行时可以正常工作,但直接运行 .py 文件不能
- xamarin.forms - Xamarin Essentials 地理位置超时问题
- angular - 角度 netcore 应用程序重定向到 /index.html 而不是 /
- python - 迁移后Django表不存在
- optimization - 使用 GLSL 1.3 在 GPU 上优化位运算
- couchbase - 如何在使用 CouchbaseAsyncCluster.openBucket 调用时捕获错误
- javascript - 在环回中包含相关模型的问题