2015-01-29 6 views
1

Мне интересно, как перейти к кодированию метода квантилей по умолчанию, используемого R, используя Rcpp. Существует базовое решение здесь Rcpp quantile implementation. Как отмечено в решении, оно не будет работать и для малых векторов.R quantile using Rcpp

Однако, я действительно хотел бы реализовать базовый R (тип 7) метод, показанный здесь https://svn.r-project.org/R/trunk/src/library/stats/R/quantile.R

Основной код выглядит следующим образом:

x <- 1:100 # make a test vector 
probs <- c(0.05, 0.95) 
n <- length)x) 

# R code 
index <- 1 + (n - 1) * probs 
lo <- floor(index) 
hi <- ceiling(index) 
x <- sort(x, partial = unique(c(lo, hi))) 
qs <- x[lo] 
i <- which(index > lo) 
h <- (index - lo)[i] # > 0 by construction 
qs[i] <- (1 - h) * qs[i] + h * x[hi[i]] 

, который, например, дает:

quantile(1:100, probs = c(0.05, 0.95)) 
5% 95% 
5.95 95.05 

Это действительно поможет понять, как вы подходите к этому, используя Rcpp. Я использую RStudio и использую для запуска более простой код Rcpp, но я застрял на этом.

Любая помощь будет высоко оценена.

Благодаря

Дэвид

ответ

0

насчет вызова quantile функцию R в Rcpp, как это?

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
NumericVector quantileCpp(NumericVector x, NumericVector probs) { 
    Environment stats("package:stats"); 
    Function quantile = stats["quantile"]; 
    int npr = probs.size(); 
    NumericVector ans(npr); 
    for(int i=0; i<npr; i++){ 
    ans[i] = as<double>(quantile(x, probs[i])); 
    } 
return ans; 
} 

сохранить код как «quantileCpp.cpp» и запустить:

> Rcpp::sourceCpp('quantileCpp.cpp') 

> quantileCpp(1:100,c(0.05,0.95)) 
[1] 5.95 95.05 

> quantile(1:100,c(0.05,0.95)) 
    5% 95% 
5.95 95.05 

Я знаю, это не самое быстрое решение (с точки зрения времени вычислений), но это самое простое решение, я могу думать от ,

Смежные вопросы