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

使用segregation包计算相异指数报错:仅允许两个分组求助

解决segregation包计算相异指数(Dissimilarity Index)的报错问题

问题根源

相异指数(D Index)的统计定义仅支持两组群体的隔离度对比,你的数据集里ethnicity包含6个类别(White、Unknown/not applicable、Other、Mixed、Black、Asian),直接调用dissimilarity()函数会触发报错;生成虚拟变量无效是因为你没有将数据转换为仅包含两组的子集,函数仍会识别到多类别分组。

解决方案

方案1:两两计算两组间的相异指数

如果你需要对比特定群体对的隔离度,可以过滤出目标两组数据后再计算:

单个群体对计算示例

library(dplyr)

# 过滤出White和Black的样本
white_black_subset <- your_data %>%
  filter(ethnicity %in% c("White", "Black"))

# 计算该群体对的相异指数
dissimilarity(white_black_subset,
              group = "ethnicity",
              unit = "school",
              weight = "n")

批量计算所有群体对的相异指数

如果需要所有两两组合的结果,可以用purrr包批量处理:

library(purrr)
library(dplyr)

# 获取所有ethnicity的两两组合
ethnic_pairs <- combn(unique(your_data$ethnicity), 2, simplify = FALSE)

# 批量计算并输出结果
all_d_indices <- map_dfr(ethnic_pairs, function(pair) {
  filtered_data <- your_data %>% filter(ethnicity %in% pair)
  d_val <- dissimilarity(filtered_data, group = "ethnicity", unit = "school", weight = "n")
  tibble(group1 = pair[1], group2 = pair[2], dissimilarity_index = d_val)
})

print(all_d_indices)

方案2:计算多组整体隔离度(替代相异指数)

如果需要衡量所有群体的整体隔离程度,相异指数并不适用,建议直接使用你已经熟悉的Mutual Information Index或Theil’s Entropy Index:

# 计算Mutual Information Index
mutual_total(your_data, group = "ethnicity", unit = "school", weight = "n")

# 计算Theil’s Entropy Index
theil(your_data, group = "ethnicity", unit = "school", weight = "n")

方案3:手动计算多组相异指数(Reardon版本)

如果一定要用多组版本的相异指数,可以实现Reardon提出的多组相异指数公式:

multigroup_dissimilarity <- function(data, group_col, unit_col, weight_col) {
  # 计算每个学校的总人数
  data <- data %>%
    group_by({{unit_col}}) %>%
    mutate(unit_total = sum({{weight_col}})) %>%
    ungroup()
  
  # 计算总体中各群体的占比
  total_pop <- sum(data[[weight_col]])
  data <- data %>%
    mutate(group_total_prop = {{weight_col}} / total_pop)
  
  # 计算每个学校内群体占比与总体占比的绝对差
  data <- data %>%
    group_by({{unit_col}}) %>%
    mutate(abs_diff = abs({{weight_col}}/unit_total - group_total_prop)) %>%
    ungroup()
  
  # 计算多组相异指数
  numerator <- sum(data[[weight_col]] * data$abs_diff)
  denominator <- 2 * total_pop * sum(data$group_total_prop * (1 - data$group_total_prop))
  numerator / denominator
}

# 调用函数计算
multigroup_dissimilarity(your_data, group_col = ethnicity, unit_col = school, weight_col = n)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:43:13