【问题标题】:How to find element index when element is determined from quantile function?从分位数函数确定元素时如何找到元素索引?
【发布时间】:2021-01-26 15:17:27
【问题描述】:

当使用quantile() 确定元素时,如何找到元素的索引? 来自 similar questionmatch()which() 解决方案不起作用(它们返回 NA),我认为它们由于舍入问题而不起作用。

如果分位数结果在两个索引之间进行平均/插值,我可以指定它是否采用较低/较高的索引?我的数据x 将始终被排序。

示例数据集(显然这里的 0 和 1 分位数只是最小值和最大值,它们只是为了进行完整性检查而显示)

x <- c(0.000000e+00,9.771228e-09,5.864592e-06,3.474925e-04,9.083242e-04,2.458036e-02)
quantile(x, probs = c(0, 0.5, 1))
          0%          50%         100% 
0.0000000000 0.0001766785 0.0245803600 

如何找到这些分位数的索引?在这里,索引是1,??,6。 而且我猜中位数是两个指数的平均值,那么我可以具体说明它返回第一个或第二个指数吗?

【问题讨论】:

  • 您要查找哪个索引?您对给定数据的预期输出是什么?

标签: r indexing quantile


【解决方案1】:

使用findInterval ?

x <- c(0.000000e+00, 9.771228e-09, 5.864592e-06, 3.474925e-04,
       9.083242e-04,2.458036e-02)
findInterval(quantile(x, probs = c(0, 0.5, 1)), x)
#[1] 1 3 6

【讨论】:

  • 你知道为什么它说第 50 个 %tile 在位置 3,但是分位数函数返回 0.0001766785,而不是 50% %tile 的 5.864592e-06?
  • findInterval 在数量超过之前给出最接近的索引。 x - quantile(x, probs = 0.5) 可能有助于理解。
  • 我想也许这是一个不同的问题,但我不明白为什么quantile(x, probs = 0.5) 返回 0.0001766785。从x 数据集中,看起来中位数应该是 5.864592e-06,对吧?
【解决方案2】:

您可能需要type=4,它使用经验 cdf 的线性插值(即考虑实际中值)。

x <- c(0.000000e+00,9.771228e-09,5.864592e-06,3.474925e-04,9.083242e-04,2.458036e-02)
(q <- quantile(x, probs=c(0, 0.5, 1), type=4))
#           0%          50%         100% 
# 0.000000e+00 5.864592e-06 2.458036e-02 
match(q, x)
# [1] 1 3 6
x[match(q, x)]
# [1] 0.000000e+00 5.864592e-06 2.458036e-02

其他例子:

set.seed(42)
x <- runif(1e3)
(q <- quantile(x, probs=c(0, 0.5, 1), type=4))
#           0%          50%         100% 
# 0.0002388966 0.4803101290 0.9984908344 
match(q, x)
# [1]  92 174 917
x[match(q, x)]
# [1] 0.0002388966 0.4803101290 0.9984908344

【讨论】:

  • 我突然想到这可能是type= 问题,然后我登录并看到了您的解决方案。很有帮助,谢谢
  • @a11 哈哈,太巧了,不客气!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2012-11-24
  • 2011-06-25
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
相关资源
最近更新 更多