如何将偏态连续变量划分为极端高低等非均衡类别(R/Excel)
处理严重右偏连续变量的非均衡分箱(R/Excel实现)
R 实现方法
针对严重右偏的变量,别用等距分箱,优先靠分位数定义断点,或者结合对数转换平衡分布后再分箱,下面是两种实用方案:
方案1:自定义分位数断点
要分成5类(极端低、低、中等、高、极端高),可以手动指定非均衡的分位数比例,让极端类只覆盖小部分样本:
# 计算自定义分位数断点,probs里的数值可按需调整 breaks <- quantile(emissions$NMVOC_gram, probs = c(0, 0.1, 0.4, 0.6, 0.9, 1)) # 处理可能的重复断点(比如大量0值导致分位数重叠) breaks <- unique(breaks) # 执行分箱并设置类别标签 emissions$NMVOC_category <- cut(emissions$NMVOC_gram, breaks = breaks, labels = c("极端低", "低", "中等", "高", "极端高"), include.lowest = TRUE) # 查看分箱后的样本分布 table(emissions$NMVOC_category)
要是觉得当前的分箱比例不合适,直接修改probs里的数值就行,比如把极端高的阈值设为0.95,让这类只占5%的样本。
方案2:对数转换后分箱
先对变量做对数转换(加1避免log(0)报错),平衡分布后再分箱,最后映射回原变量的断点:
# 处理0值,加1后取自然对数 log_nmvoc <- log1p(emissions$NMVOC_gram) # 计算对数后的分位数断点 log_breaks <- quantile(log_nmvoc, probs = c(0, 0.1, 0.4, 0.6, 0.9, 1)) # 转换回原变量的断点 original_breaks <- expm1(log_breaks) # 执行分箱 emissions$NMVOC_category <- cut(emissions$NMVOC_gram, breaks = original_breaks, labels = c("极端低", "低", "中等", "高", "极端高"), include.lowest = TRUE)
Excel 实现方法
方案1:用PERCENTILE.INC自定义断点
- 先在空白单元格计算分位数断点(假设变量在A列):
- 极端低上限:
=PERCENTILE.INC(A:A, 0.1) - 低上限:
=PERCENTILE.INC(A:A, 0.4) - 中等上限:
=PERCENTILE.INC(A:A, 0.6) - 高上限:
=PERCENTILE.INC(A:A, 0.9) - 极端高上限:
=MAX(A:A)
- 极端低上限:
- 用嵌套IF函数分箱,在B2单元格输入(替换括号里的断点值为你计算出的数值):
下拉填充整列即可。=IF(A2<=100,"极端低",IF(A2<=400,"低",IF(A2<=700,"中等",IF(A2<=1200,"高","极端高"))))
方案2:对数转换后分箱
- 新增一列计算对数转换值:
=LN(A2+1)(加1避免0值报错) - 对这一列用
PERCENTILE.INC计算分位数断点,再用EXP(对数断点值)-1转换回原变量的断点 - 再用嵌套IF函数按原变量的断点分箱,步骤同方案1。
内容的提问来源于stack exchange,提问作者Samane Bahreini
相关产品推荐
相关产品推荐

