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