Rcpp分位数实现

Gio*_*ato 3 r rcpp

我有一个包含 NumericVector x 的 Rcpp double。我想在 Rcpp 代码流中获得此类 x 的 .95 分位数。我不知道我怎样才能得到它。是否有 RcppArmadillo 实现?

Dav*_*urg 5

我不是Rcpp专家,我的函数可能需要很多改进,但似乎您可以轻松创建自己的 Rcpp 分位数函数(由于偏斜的可能性很高,并且在非- 整数索引,但随着向量的增长而改进)

library(Rcpp) # You can use sourceCpp() instead of cppFunction if you wish
cppFunction('NumericVector Cquantile(NumericVector x, NumericVector q) {
  NumericVector y = clone(x);
  std::sort(y.begin(), y.end());
  return y[x.size()*(q - 0.000000001)];
}')
Run Code Online (Sandbox Code Playgroud)

1e+3向量进行测试

set.seed(123)
y <- rnorm(1000)
qs <- seq(0, 100, 25)/100

quantile(y, qs)
#           0%          25%          50%          75%         100% 
# -2.809774679 -0.628324243  0.009209639  0.664601867  3.241039935 


setNames(Cquantile(y, qs), paste0(qs * 100, "%"))
#          0%         25%         50%         75%        100% 
# -2.80977468 -0.62957874  0.00729009  0.66441586  3.24103993 
Run Code Online (Sandbox Code Playgroud)

看起来够近了。所以我们向量的 95% 分位数y

Cquantile(y, .95)
## [1] 1.675697
Run Code Online (Sandbox Code Playgroud)

还有一些用于已知分布的糖分位数函数,例如正态分布、伽马分布等,可以替代使用,请参阅此处以获取一些示例。