使用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
相关产品推荐
相关产品推荐

