如何在R的survey与srvyr包中为复杂抽样调查应用Canberra距离函数
在复杂抽样调查中用survey/srvyr包计算Canberra距离
问题描述
我正尝试使用R语言的survey与srvyr包,在复杂抽样调查设计中应用Canberra距离函数。现有分组计算调查均值的示例代码:
dstrata %>% group_by(awards) %>% summarise(api00 = survey_mean(api00), api99=survey_mean(api99))希望通过以下自定义的Canberra距离相关函数,计算api00与api99之间的距离,求指导实现方法:
canb.dist <- function(x, j){ sum((abs(x-j))/(abs(x)+abs(j)))} canberra.index= function(x,j){ Canbdist=sum((abs(x-j))/(abs(x)+abs(j))) domain=numeric(length(x)) return (CD= Canbdist/domain) }
实现方案
复杂抽样场景下必须考虑抽样权重,不能直接用原始数据计算,以下提供两种贴合需求的实现方式:
方式1:基于分组加权均值计算Canberra距离
如果需求是先得到每组api00和api99的加权均值,再对均值计算Canberra距离:
# 第一步:计算分组加权均值(去掉默认的标准误输出) group_means <- dstrata %>% group_by(awards) %>% summarise( api00_mean = survey_mean(api00, vartype = "none"), api99_mean = survey_mean(api99, vartype = "none") ) # 第二步:对均值列应用自定义Canberra距离函数 group_means <- group_means %>% mutate(canberra_dist = canb.dist(api00_mean, api99_mean))
方式2:基于个体加权计算分组内Canberra指数
如果需要在分组内,按抽样权重计算个体层面的Canberra项加权和(更符合复杂抽样的统计逻辑),同时修正你原函数中domain全0的问题:
dstrata %>% group_by(awards) %>% summarise( # 加权求和每个个体的Canberra项 canberra_weighted_sum = survey_total( (abs(api00 - api99))/(abs(api00) + abs(api99)), vartype = "none" ), # 计算分组内的加权样本量(替代原函数中无效的domain) weighted_group_size = survey_total(1, vartype = "none"), # 得到修正后的Canberra指数 canberra_index = canberra_weighted_sum / weighted_group_size )
关键注意点
- 原
canberra.index函数中domain=numeric(length(x))会生成全0向量,直接计算会触发除以0错误,改用加权样本量作为分母才符合统计意义。 - 复杂抽样中所有统计计算必须通过survey/srvyr包的
survey_mean、survey_total等函数实现,不能直接用基础R的sum或mean,否则会忽略抽样权重导致结果偏差。
内容的提问来源于stack exchange,提问作者Lincoln
相关产品推荐
相关产品推荐

