【问题标题】:R Studio - How to get the percentile for which benchmark lies inR Studio - 如何获得基准所在的百分位数
【发布时间】:2020-08-08 13:04:33
【问题描述】:

我有以下数据框。我想找出每个“基准”所在的“价值”百分位数。例如,100 的“基准”大约是“价值”的第 75 个百分位。

group <- c(1,1,1,2,2,2)
benchmark <- c(100,100,100,200,200,200)
value <- c(50,80,120,150,230,250)
d_f <- data.frame(group,benchmark, value)

d_f %>%
  group_by(group, benchmark) %>%
  summarise(q25 = quantile(value, 0.25),
            q50 = quantile(value, 0.50),
            q75 = quantile(value, 0.75)
            # can add more percentile
            )

另一种方法是,我将列出 100 个百分位数(第 1 - 100 个百分位数)。如果“基准”与任何百分位数相似,请将输出设置为该百分位数。

谢谢!

【问题讨论】:

  • 40 表示 benchmark=200 大约是 value 列的第 40 个百分位。我打算在输出中显示所有 100 个百分位点,所以为了简短起见,我只显示了 25、50、75。这不会影响“每个基准位于哪个百分位价值”列。
  • 是整个value 列还是group 中的values?你知道“真相”数字吗?我的猜测是,如果分组,ecdf(d_f$value[1:3])(100) 就是您需要的(易于扩展)。如果未分组,则ecdf(d_f$value)(c(100,200)) 将为您提供基准测试的两个百分位数。 (两者都是[0,1],需要*100。)
  • 感谢您的想法!它应该是每组。但是,我认为 bench_pctile 100 的结果应该是第 75 位,而不是第 66.6 位。算错了吗?

标签: r dplyr percentile


【解决方案1】:

我认为你需要ecdf。剩下的问题(对我来说)是你的经验累积分布是按组还是作为一个整体。

每组:

d_f %>%
  group_by(group, benchmark) %>%
  mutate(bench_pctile = ecdf(value)(benchmark) * 100)
# # A tibble: 6 x 4
# # Groups:   group, benchmark [2]
#   group benchmark value bench_pctile
#   <dbl>     <dbl> <dbl>        <dbl>
# 1     1       100    50         66.7
# 2     1       100    80         66.7
# 3     1       100   120         66.7
# 4     2       200   150         33.3
# 5     2       200   230         33.3
# 6     2       200   250         33.3

或者从整个列中,我们需要在分组之前调用ecdf

valecdf <- ecdf(d_f$value)
d_f %>%
  group_by(group, benchmark) %>%
  mutate(bench_pctile = valecdf(benchmark) * 100)
# # A tibble: 6 x 4
# # Groups:   group, benchmark [2]
#   group benchmark value bench_pctile
#   <dbl>     <dbl> <dbl>        <dbl>
# 1     1       100    50         33.3
# 2     1       100    80         33.3
# 3     1       100   120         33.3
# 4     2       200   150         66.7
# 5     2       200   230         66.7
# 6     2       200   250         66.7

支持这一点的一种方法是使用近似值:

### grouped
mean(100 <= d_f$value[1:3])
# [1] 0.3333333
mean(200 <= d_f$value[4:6])
# [1] 0.6666667

### ungrouped
mean(100 <= d_f$value)
# [1] 0.6666667
mean(200 <= d_f$value)
# [1] 0.3333333

【讨论】:

  • 感谢您的想法!它应该是每组。但是,我认为 bench_pctile 100 的结果应该是第 75 位,而不是第 66.6 位。算错了吗?
  • mean(x &lt;= a) 近似值在数据集中存在(或接近一个)要检查的值时效果很好。所以不是,这不是一个很好的近似值。 quantile(d_f$value[1:3], seq(0,1,len=11)) 当然建议 75%。我不知道ecdf 在这里做了什么不同...
猜你喜欢
  • 2016-04-11
  • 2020-03-19
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2015-10-21
  • 2022-08-04
相关资源
最近更新 更多