You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算分组样本累积分布概率未达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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:40:18