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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:55:07