寻找Bruffaerts等2014年论文中广义箱线图的R实现包
实现同时考虑偏态与厚尾的广义箱线图(R语言)
你提到的这种兼顾偏态性与厚尾性的广义箱线图,出自2014年发表在Statistical Papers的研究,目前确实没有现成的R包直接实现。不过可以基于论文中的算法手动编写函数来实现,以下是具体代码和说明:
核心实现代码
# 广义箱线图实现函数(基于2014年Statistical Papers论文) generalized_boxplot <- function(data, plot = TRUE, ...) { # 计算基础四分位数与四分位距 q_vals <- quantile(data, probs = c(0.25, 0.5, 0.75)) q1 <- q_vals[1] median_val <- q_vals[2] q3 <- q_vals[3] iqr_val <- q3 - q1 # 计算样本偏度(g1)与峰度(g2) n <- length(data) mean_val <- mean(data) centered_data <- data - mean_val m2 <- sum(centered_data^2) / n m3 <- sum(centered_data^3) / n m4 <- sum(centered_data^4) / n g1 <- m3 / (m2^(3/2)) g2 <- (m4 / (m2^2)) - 3 # 基于偏度调整截断点 if (g1 >= 0) { lower_mult <- 1.5 * exp(-3 * g1 / 4) upper_mult <- 1.5 * exp(g1 / 2) } else { lower_mult <- 1.5 * exp(g1 / 2) upper_mult <- 1.5 * exp(-3 * g1 / 4) } lower_cut <- q1 - iqr_val * lower_mult upper_cut <- q3 + iqr_val * upper_mult # 基于峰度(厚尾)追加调整 tail_factor <- if (g2 > 0) 1 + g2 / 10 else 1 lower_cut <- lower_cut * tail_factor upper_cut <- upper_cut * tail_factor # 识别异常值 outliers <- data[data < lower_cut | data > upper_cut] # 绘图(隐藏原生箱线图的异常值,手动添加自定义异常值) if (plot) { boxplot(data, outline = FALSE, ...) points(jitter(rep(1, length(outliers))), outliers, col = "firebrick", pch = 16) abline(h = lower_cut, lty = 2, col = "steelblue") abline(h = upper_cut, lty = 2, col = "steelblue") } # 返回计算结果列表 list( quartiles = q_vals, iqr = iqr_val, skewness = g1, kurtosis = g2, lower_cutoff = lower_cut, upper_cutoff = upper_cut, outliers = outliers ) }
使用示例
# 生成一组偏态厚尾数据(F分布模拟) set.seed(123) skewed_heavy_data <- rf(n = 1000, df1 = 3, df2 = 5) # 绘制广义箱线图 generalized_boxplot( skewed_heavy_data, main = "广义箱线图(适配偏态厚尾数据)", ylab = "数据值" )
说明
- 代码严格遵循论文中的公式逻辑:先通过偏度(g1)调整截断点的拉伸/压缩比例,再通过峰度(g2)修正厚尾带来的截断偏移,确保同时适配偏态和厚尾特性。
- 如果需要更精细的调整,可以对照论文中的样本量修正项或其他细节,对函数中的系数进行微调。
内容的提问来源于stack exchange,提问作者Amiira
相关产品推荐
相关产品推荐

