Rcpp分位数实现

时间:2014-11-06 17:51:32

标签: r rcpp

我有一个包含NumericVector x的Rcpp双精度型。我想在Rcpp代码流中得到这样的x的.95分位数。我不知道怎么能得到它。是否有RcppArmadillo实施?

1 个答案:

答案 0 :(得分:4)

我不是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)];
}')

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 

看起来足够接近。因此,我们的向量y的95%分位数将是

Cquantile(y, .95)
## [1] 1.675697

还有一些Sugar分位数函数用于已知的分布,例如正常,伽玛等,可以使用,有些例子请参见here