使用R语言survey包计算几何均值及95%置信区间
加权调查数据中计算几何均值及置信区间的正确方法
问题背景
我复现了一段用于NHANES数据加权分析的代码,代码如下:
library(haven) library(survey) library(dplyr) nhanesDemo <- read_xpt(url("https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DEMO_I.XPT")) # 重命名变量为更易读的名称 nhanesDemo$fpl <- nhanesDemo$INDFMPIR nhanesDemo$age <- nhanesDemo$RIDAGEYR nhanesDemo$gender <- nhanesDemo$RIAGENDR nhanesDemo$persWeight <- nhanesDemo$WTINT2YR nhanesDemo$psu <- nhanesDemo$SDMVPSU nhanesDemo$strata <- nhanesDemo$SDMVSTRA # 选择所需列 nhanesAnalysis <- nhanesDemo %>% select(fpl, age, gender, persWeight, psu, strata) # 构建调查设计对象 nhanesDesign <- svydesign(id = ~psu, strata = ~strata, weights = ~persWeight, nest = TRUE, data = nhanesAnalysis) # 筛选18-79岁人群 ageDesign <- subset(nhanesDesign, age > 17 & age < 80)
原代码用以下方式计算算术均值:
# 算术均值 svymean(~age, ageDesign, na.rm = TRUE)
我的需求是:
- 使用
svymean或相关方法计算几何均值 - 获取该几何均值的95%置信区间,且尽量避免手动计算标准误
我尝试了以下代码但报错:
svymean(~log(age), log(ageDesign), na.rm = TRUE)
请问正确的实现方法是什么?
正确实现方法
核心逻辑
几何均值的计算逻辑是:先对目标变量取自然对数,计算对数后的加权均值,再对结果取指数。要直接得到带置信区间的几何均值,需利用调查包的转换函数处理结果,而非修改调查设计对象本身。
步骤1:计算对数变量的加权均值
仅对age变量取对数,将原调查设计对象传入svymean,同时保留方差估计:
log_mean_result <- svymean(~log(age), ageDesign, na.rm = TRUE)
步骤2:转换为几何均值及置信区间
使用svycontrast函数对对数均值的结果进行指数转换,直接得到几何均值和对应的95%置信区间:
geo_mean_result <- svycontrast(log_mean_result, quote(exp(log(age))))
执行后,geo_mean_result会输出几何均值的点估计值,以及95%置信区间的上下限,全程无需手动计算标准误。
完整示例代码
# 计算对数变量的加权均值 log_mean <- svymean(~log(age), ageDesign, na.rm = TRUE) # 转换为几何均值并获取置信区间 geo_mean <- svycontrast(log_mean, quote(exp(log(age)))) # 查看结果 geo_mean
错误原因说明
你错误地对调查设计对象ageDesign调用了log()函数——调查设计对象是复杂的结构化数据,不能直接用对数函数处理。正确的做法是只对分析变量age取对数,设计对象保持原样传入svymean。
内容的提问来源于stack exchange,提问作者Forklift17
相关产品推荐
相关产品推荐

