R 中带有子样本的 svyglm 对象的边际效应

Marginal Effect from svyglm object with a subsample in R

我需要通过 R 包 survey 中的 svyglm 函数估计子样本的广义线性模型(系列=泊松)来计算边际效应。

首先,我声明了调查设计:

myDesisgn = svydesign(id=data$id, strata=data$strata, weights=data$sw, data=data)

其次,我估计我的模型为:

fit = svyglm(y~ x1 +x2,  design=myDesisgn, data=data, subset= x3 == 1, family= poisson(link = "log"))

最后,当我想获得 x1 的平均边际效应时 运行:

summary(margins(fit, variables = "x1", design=myDesisgn))

...但我收到以下错误消息:

“h(simpleError(msg, call)) 中的错误: 在为函数 'summary' 选择方法时评估参数 'object' 时出错:'x' 和 'w' 必须具有相同的长度"

运行 以下也不起作用:

summary(margins(fit, variables = "x1", design=myDesisgn, subset=x3==1))

解决方案:

summary(margins(fit, variables = "x1", design=myDesisgn[myDesisgn$variables$x3 == 1]))

对复杂调查进行子集化会导致误差估计出现问题。当对特定子样本的参数感兴趣时,应该使用所需的子样本来估计感兴趣的参数,并使用完整样本来估计其误差。

例如,svyglm(y~x, data=data, subset = z == 1) 正是这样做的(beta_hat 使用完整样本使用 z=1 和 se(beta_hat) 的观察值进行估计)。

对 svy 设计进行子集化是可能的,它保留了有关簇数、层数的原始设计信息。上面显示的代码是这样做的“手动”方式。另一种方法可以直接依赖 subset.survey.design {survey} 函数。

myDesign_subset <- subset(myDesign, data$x3 == 1)

这两种方法是等价的并且产生正确的 z-stats。