如何在R中批量优化各金融机构数据分布的正态性(替代Excel手动操作)
批量按金融机构处理异常值并优化正态性(R实现)
核心思路
按金融机构分组,对每组数据单独执行:
- 计算组内均值、标准差、1%和99%分位数
- 将超出±3倍标准差的异常值缩尾到对应分位数
- 可选结合正态性变换(如对数、Box-Cox)进一步优化分布
完整代码实现
# 先安装并加载dplyr(若未安装) # install.packages("dplyr") library(dplyr) # 分组处理数据 df_processed <- df %>% group_by(id) %>% mutate( # 计算组内关键统计量(忽略缺失值) group_mean = mean(x, na.rm = TRUE), group_sd = sd(x, na.rm = TRUE), q01 = quantile(x, 0.01, na.rm = TRUE), q99 = quantile(x, 0.99, na.rm = TRUE), # 替换±3SD以外的异常值为对应分位数 x_trimmed = case_when( x < group_mean - 3 * group_sd ~ q01, x > group_mean + 3 * group_sd ~ q99, TRUE ~ x # 正常数值保持不变 ), # 可选:对数变换(适用于x为正的右偏数据) x_log = ifelse(x_trimmed > 0, log(x_trimmed), NA), # 可选:Box-Cox变换(需加载MASS包,通用正态性变换) # x_boxcox = MASS::boxcox(x_trimmed ~ 1, plotit = FALSE)$x ) %>% ungroup() # 取消分组状态
关键步骤解释
group_by(id):确保每个金融机构的数据分析独立进行,避免跨机构统计偏差case_when():精准定位异常值并完成缩尾,完全替代手动Excel操作- 正态性变换:对数变换适合明显右偏的正数值数据;Box-Cox变换可自动选择最优变换参数,需提前安装
MASS包
验证正态性的实用方法
- Shapiro-Wilk检验:按组批量验证(注意:大样本下检验易拒绝正态假设,需结合可视化)
normality_check <- df_processed %>% group_by(id) %>% summarise( shapiro_stat = shapiro.test(x_trimmed)$statistic, shapiro_pval = shapiro.test(x_trimmed)$p.value )
- Q-Q图可视化:直观观察数据是否贴合正态分布
# 先安装并加载ggplot2 # install.packages("ggplot2") library(ggplot2) # 绘制指定机构的Q-Q图 df_processed %>% filter(id == "目标机构ID") %>% ggplot(aes(sample = x_trimmed)) + stat_qq() + stat_qq_line(color = "red")
内容的提问来源于stack exchange,提问作者ANTONIO RIGNANESE
相关产品推荐
相关产品推荐

