You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言survey包估计重叠域估计值协方差的实现方法

问题

假设我们有包含两个重叠域的疫苗接种状态调查数据,两个域分别为30-50岁人群、40-60岁人群,我们需要估算这两个群体的疫苗接种率。由于存在40-50岁的重叠人群,两个域的估计值显然存在相关性。
我们如何使用survey包估算这类重叠域的估计值协方差?
理想情况下,是否可以使用svyby()或svybys()实现该需求?

示例数据

以下示例基于survey包内置的api数据集,该数据集是加州学校的多阶段抽样数据。变量stype标识学校为小学、初中还是高中,变量api00为数值型变量,汇总了各学校2000年的标准化考试表现。
本示例中,我们需要比较两个重叠域的api00平均值:(1)小学和初中;(2)初中和高中。

# 创建调查设计对象 ----
library(survey)
data(api)

dclus2 <- svydesign(id=~dnum+snum,
                    fpc=~fpc1+fpc2,
                    data=apiclus2)

# 为两个重叠域创建指示变量 ----
dclus2 <- transform(dclus2,
                    E_or_M = stype %in% c("E", "M"),
                    M_or_H = stype %in% c("M", "H"))

# 生成域与结果变量的乘积项 ----
dclus2 <- transform(dclus2,
                    api00_E_or_M = api00 * E_or_M,
                    api00_M_or_H = api00 * M_or_H)

# 分别估计两个域的均值 ----
estimates <- list(
  'E_or_M' = svyratio(~ api00_E_or_M, ~ E_or_M,
                      design = dclus2),
  'M_or_H' = svyratio(~ api00_M_or_H, ~ M_or_H,
                      design = dclus2)
)

sapply(estimates, function(est) est[['ratio']])
#>  E_or_M   M_or_H 
#> 682.0563 623.8102

解决方案

分别调用svyratio无法获得两个估计值的协方差,你只需要在同一次svyratio调用中传入所有待估计的分子、分母变量,即可直接得到包含协方差的估计结果:

# 同时估计两个重叠域的均值
joint_est <- svyratio(
  numerator = ~ api00_E_or_M + api00_M_or_H,
  denominator = ~ E_or_M + M_or_H,
  design = dclus2
)

# 查看两个域的均值估计值
coef(joint_est)
#> api00_E_or_M/E_or_M api00_M_or_H/M_or_H 
#>            682.0563            623.8102

# 查看估计值的协方差矩阵,非对角元素即为两个估计值的协方差
vcov(joint_est)
#>                     api00_E_or_M/E_or_M api00_M_or_H/M_or_H
#> api00_E_or_M/E_or_M           337.41478            82.27851
#> api00_M_or_H/M_or_H            82.27851           533.41413

你也可以使用专门处理重叠域的svybys函数实现相同需求,代码更简洁:

# 使用svybys直接估计重叠域均值
bys_est <- svybys(
  formula = ~ api00,
  bys = list(
    E_or_M = ~ stype %in% c("E", "M"),
    M_or_H = ~ stype %in% c("M", "H")
  ),
  design = dclus2,
  FUN = svymean
)

# 输出估计值与协方差
coef(bys_est)
vcov(bys_est)

如果需要计算两个域均值差值的标准误,可以直接用svycontrast实现,无需手动计算:

svycontrast(joint_est, list(均值差值 = c(1, -1)))
#>           contrast     SE
#> 均值差值    58.246 27.737

内容的提问来源于stack exchange,提问作者bschneidr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:54:02