计算分组样本累积分布概率未达1.0的问题及优化需求
问题
需要按Species分组计算每组Sepal.Width的累积概率并保存到数据框,但当前代码计算出的概率仅setosa组能达到1.0,其他组停留在小于1的值,同时希望同时保留对应的Sepal.Width值。
当前代码:
library(datasets) library(dplyr) # 补充原代码遗漏的dplyr加载 ecdf_fun <- ecdf(iris$Sepal.Width) dset <- iris %>% group_by(Species) %>% reframe(ecdval = ecdf_fun(Sepal.Width))
运行结果示例:
Species ecdval 1 setosa 1.000000000 2 setosa 0.993333333 ... 51 versicolor 0.833333333 52 versicolor 0.753333333 ... 101 virginica 0.960000000 102 virginica 0.960000000
理想输出格式:
Species ecdval Sepal.Width 1 setosa 1.000000000 0.6 2 setosa 0.993333333 ... ... 51 versicolor 0.833333333 1.8 52 versicolor 0.753333333 ... ... 101 virginica 0.960000000 2.5 102 virginica 0.960000000 ...
问题原因
当前代码使用的是整个iris数据集的Sepal.Width计算的ECDF函数,而非每个Species分组内部的ECDF。只有setosa的Sepal.Width最大值是整个数据集的最大值,所以它的累积概率能到1.0;其他组的最大值在全局数据中不是极值,因此累积概率无法达到1。
解决方案
在每个分组内单独计算专属的ECDF函数,再用该函数计算组内Sepal.Width对应的累积概率,同时保留原始Sepal.Width列。
修正后的代码:
library(datasets) library(dplyr) dset <- iris %>% group_by(Species) %>% mutate( # 为每个分组生成专属ECDF,计算当前Sepal.Width的累积概率 ecdval = ecdf(Sepal.Width)(Sepal.Width) ) %>% # 按Sepal.Width降序排列,匹配示例输出顺序(可选) arrange(desc(Sepal.Width)) %>% ungroup()
代码说明
group_by(Species)后,ecdf(Sepal.Width)会为每个分组生成基于自身数据的累积分布函数ecdf(Sepal.Width)(Sepal.Width)用组内ECDF计算当前行Sepal.Width对应的累积概率- 运行后每个分组的最大
Sepal.Width对应的累积概率都会是1.0,且保留了原始的Sepal.Width值
内容的提问来源于stack exchange,提问作者Joschi Nin
相关产品推荐
相关产品推荐

