我不是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)
还有一些用于已知分布的糖分位数函数,例如正态分布、伽马分布等,可以替代使用,请参阅此处以获取一些示例。
| 归档时间: |
|
| 查看次数: |
1773 次 |
| 最近记录: |