【发布时间】:2019-11-22 17:40:37
【问题描述】:
让x 是一个由数字、非负数据(大多数 qx <- quantile(x, probs = pq) 组成的向量,其中length(pq) 通常是 > length(x) * (3/4)。
我需要qx 的索引向量,称之为q_i,其中x[i] 属于分位数qx[q_i[i]]。
如标题所示,问题在于qx 中可能存在非唯一值,例如如果x 是零膨胀的,则为多个 0 值分位数,并且可能还有其他重复值。我想通过(a)回收这些等效分位数的索引序列或(b)随机分配等效分位数的索引来处理这些情况。我想我更喜欢选项 (a),但任何一个的解决方案都会很有用。
下面是一个编辑,提供了为特定x[i] 确定q_i[i] 的规则:
考虑qx 有一个或多个重复值序列,即对于某些j 有(是)序列qx[j:n] 其中qx[j] == qx[j + 1] == ... == qx[j + n] < qx[j + n + 1]。让k = c(j, j + 1,..., j + n)。然后q_i[i] <- k[r] where qx[j] <= x[i] <= qx[j + n + 1] if j == 1 or qx[j] < x[i] <= qx[j + n + 1] if j > 1, and where r <- m %% (n + 1) 这样x[i] 是m-th 出现在x 中的不等式已经得到满足。
注意:根据这条规则,我意识到我在原来的 q_i 中省略了 4 - 这已被更改。
注意:@hodgenovice 提出了一个很好的观点,即严格小于两个分位数的数据值可能被分组到两个这样的分位数之间的“bin”中。我并不特别关心这种特殊情况,因为例如,如果没有重复的分位数但我们有相同的分位数,那么这些特殊情况会被正确地合并在一起。
我认为有一种有效的方法可以做到这一点 - 我基本上是使用 for 循环完成的,但我正在寻找一种矢量化方法。
我开始尝试使用 cut() ,这当然不允许非唯一中断。我发现 this question here 有帮助,因为我发现了 .bincode() 函数,它确实允许非唯一中断。但是,它没有“分配”索引的规则 - 它只会使用每个重复分位数值中第一个的索引。
这个问题的一些示例代码:
x <- c(5.8, 0.0, 16.1, 5.8, 3.5, 13.8, 6.9, 5.8, 11.5, 9.2, 11.5,
3.5, 0.0, 8.1, 0.0, 4.6, 5.8, 3.5, 0.0, 10.3, 0.0, 0.0,
3.5, 6.9, 3.5)
pq <- seq(0, 1, length.out = 20)
qx <- quantile(x, pq)
# quantiles for reference, rounded for readability
round(as.numeric(qx), 2)
[1] 0.00 0.00 0.00 0.00 0.18 3.50 3.50 3.50 3.62 5.04 5.80 5.80 5.97
[14] 6.90 7.72 9.14 10.55 11.50 13.19 16.10
q_i <- .bincode(x, qx, include.lowest = TRUE)
q_i
[1] 10 1 19 10 5 19 13 10 17 16 17 5 1 15 1 9 10 5 1 16 1 1 5 13 5
如果.bincode() 很神奇,我可以说服它去做我需要的事情,那么这是我要寻找的结果:
在上述情况(a)下:
(我也编辑了这个,因为我最初缺少 4 的值)
q_i
[1] 10 1 19 11 5 19 13 10 17 16 17 6 2 15 3 9 11 7 4 16 1 2 5 13 6
在场景 (b) 下,它可能看起来与上面相同。或者类似的东西:
q_i
[1] 10 1 19 10 6 19 13 11 17 16 17 5 3 15 2 9 11 6 2 16 1 4 5 13 7
请注意,被回收的“等效”qx 序列的完整向量基本上是在没有替换的情况下进行采样的。
谢谢!
【问题讨论】:
-
我不确定我是否完全理解问题所在。如果 bincode 没有做你想做的事,也许写你自己的函数呢?您对如何从 x 和 qx 到 q_i 有任何逻辑吗?我不知道你在做什么
-
@kmeanskeal,您的解决方案中是否有“在上述情况 (a) 下”的解决方案中没有 8、12、14 或 18 的原因,或者是否应该包括它们(例如,第二个 17 是否应该在序列是 18)?
-
@RAB 据我了解,qx 只是 x 的一些分位数。 q_i 是 x[j] 介于 qx[q_i[j]] 和 qx[q_i[j] + 1] 之间的指标。
-
@RAB,我很想编写自己的函数。我发布了这篇文章,以防有人知道如何有效地实现 bincode 或相关功能来实现我的目标。我不确定我是否能比我已经更好地概述从 x 和 qx 到 q_i 的“逻辑” - 很抱歉你不知道我在做什么。我正在将数据分组为分位数,其中有重复的分位数,并且需要一种方法将数据点“分布”在重复的分位数上。
-
@hodgenovice,是的 - 这些值不存在的原因是没有数据落入这些索引处的分位数所描绘的“箱”中。例如,对于值 8,数据点需要 > 3.5 且