R语言Hmisc::wtd.quantile计算加权分位数受权重缩放影响问题
R加权分位数计算结果随权重缩放变化的问题解决
问题原因
Hmisc::wtd.quantile()默认未开启权重标准化,参数normwt默认值为FALSE,函数计算时直接使用权重的绝对数值计算累计权重,而非归一化后的权重占比。当权重整体乘以常数缩放时,累计权重的计算逻辑会发生偏移,尤其当权重总和远小于样本量时,会出现完全错误的计算结果(如你示例中small_weights的结果全部落在6-8区间)。- 该函数默认将权重视为抽样概率权重,如果你使用的是频率权重,默认参数和
uncount展开后的普通分位数逻辑天然不匹配。
解决方法
方法1:使用Hmisc包时开启权重标准化
调用Hmisc::wtd.quantile()时添加normwt = TRUE参数,函数会自动将输入权重标准化到总和等于样本量,权重缩放不会改变标准化后的结果,分位数计算结果完全稳定:
# 原始权重 Hmisc::wtd.quantile(weighted[["var_"]], weighted[["wt"]], probs = seq(0,1, 0.1), normwt = TRUE) # 缩放0.1倍的权重 Hmisc::wtd.quantile(small_weights[["var_"]], small_weights[["wt"]], probs = seq(0,1, 0.1), normwt = TRUE) # 均值为1的标准化权重 Hmisc::wtd.quantile(scaled_weights[["var_"]], scaled_weights[["wt"]], probs = seq(0,1, 0.1), normwt = TRUE)
以上三个调用的返回结果完全一致,不受权重缩放影响。
方法2:匹配uncount展开后的频率权重分位数结果
如果需要和tidyr::uncount()展开后计算的普通分位数结果对齐,可以使用DescTools::Quantile()函数,该函数原生支持频率权重,默认不受权重缩放影响,指定对应分位数类型即可得到完全匹配的结果:
DescTools::Quantile(weighted[["var_"]], weights = weighted[["wt"]], probs = seq(0,1,0.1), type = 7)
返回结果和你示例中quantile(duplicated_rows[["var_"]])的输出完全一致。
内容的提问来源于stack exchange,提问作者Josep Espasa
相关产品推荐
相关产品推荐

