2013-11-22 3 views
11

Я читаю главу 4 «Полная интеграция R и C++ с Rcpp», и у меня была небольшая проблема.Как правильно использовать Rcpp :: pt()

В «листинге 4.13» в книге приведен пример использования функции R. Я пробовал использовать другие функции (отличные от примера), и у меня был успех. Мой код здесь:

#include <Rcpp.h> 

// [[Rcpp::export]] 
Rcpp::DataFrame myrandom(Rcpp::NumericVector x) { 
    int n = x.size(); 
    Rcpp::NumericVector y1(n), y2(n), y3(n); 

    y1 = Rcpp::pexp(x,1.0,1,0); 
    y2 = Rcpp::pnorm(x,0.0,1.0,1,0); 
    y3 = Rcpp::ppois(x,3.0,1,0); 

    return Rcpp::DataFrame::create(Rcpp::Named("Exp") = y1,Rcpp::Named("Norm") = y2, Rcpp::Named("Pois") = y3); 
} 


sourceCpp("random.cpp") 
myrandom(c(0.5,1)) 

В этом случае в порядке, но когда я пытаюсь использовать Rcpp :: пт не имеют успеха. Мой код здесь.

#include <Rcpp.h> 

// [[Rcpp::export]] 
Rcpp::DataFrame myrandom2(Rcpp::NumericVector x) { 
    int n = x.size(); 
    Rcpp::NumericVector y1(n); 

    y1 = Rcpp::pt(x,3.0,0,1,0); 

    return Rcpp::DataFrame::create(Rcpp::Named("T") = y1); 
} 

sourceCpp("random2.cpp") 
myrandom2(c(0.5,1)) 

/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/stats/nt.h: In function ‘Rcpp::stats::P2<RTYPE, NA, T> Rcpp::pt(const Rcpp::VectorBase<RTYPE, NA, VECTOR>&, double, double, bool, bool) [with int RTYPE = 14, bool NA = true, T = Rcpp::Vector<14>]’: 
random2.cpp:8: instantiated from here 
/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/stats/nt.h:25: error: invalid conversion from ‘double (*)(double, double, int, int)’ to ‘double (*)(double, double, double, int, int)’ 
/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/stats/nt.h:25: error: initializing argument 1 of ‘Rcpp::stats::P2<RTYPE, NA, T>::P2(double (*)(double, double, double, int, int), const Rcpp::VectorBase<RTYPE, NA, VECTOR>&, double, double, bool, bool) [with int RTYPE = 14, bool NA = true, T = Rcpp::Vector<14>]’ 
make: *** [random2.o] Error 1 
llvm-g++-4.2 -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include" -fPIC -mtune=core2 -g -O2 -c random2.cpp -o random2.o 

Когда я использую Rcpp :: пт (х, 3) Я хочу, чтобы иметь контроль над параметрами де од функции

pt(q, df, ncp, lower.tail = TRUE, log.p = FALSE) 

Я думаю, что я не правильно использовать функцию де но я не Не знаю, что.

+1

Поскольку у вас есть некоторые ответы ниже, которые, кажется, чтобы ответить на ваш вопрос, пожалуйста, пометьте один из них, как «Принято», нажав на tickmark ниже их подсчет голосов. Это показывает, какой ответ вам больше всего помог, и он присваивает репутации автору ответа (и вам!). Это часть идеи этого сайта, чтобы выявить хорошие вопросы и ответы посредством ответов и принятия ответов. – Jubobs

ответ

5

Похоже, что распределение Student-t не имеет параметра нецентральности ncp; от Rmath.h:

/* Student t Distibution */ 
inline double dt(double x, double n, int lg) { return ::Rf_dt(x, n, lg); } 
inline double pt(double x, double n, int lt, int lg) { return ::Rf_pt(x, n, lt, lg); } 
inline double qt(double p, double n, int lt, int lg) { return ::Rf_qt(p, n, lt, lg); } 
inline double rt(double n) { return ::Rf_rt(n); } 

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

#include <Rcpp.h> 

// [[Rcpp::export]] 
Rcpp::DataFrame myrandom2(Rcpp::NumericVector x) { 
    int n = x.size(); 
    Rcpp::NumericVector y1(n); 

    y1 = Rcpp::pt(x, 3.0, false, true); 

    return Rcpp::DataFrame::create(Rcpp::Named("T") = y1); 
} 
+1

Хороший ответ, @rcs, но он обходит фактический вопрос о том, как это сделать с добавленным параметром 'ncp'. У нас там была ошибка, я совершил какое-то исправление раньше и проведу еще несколько модульных тестов в канун. –

8

не являются C++ сообщения компилятора прекрасный? ;-)

Думаю, вы просто помогли выбить действительно старую ошибку. Для обоих t и F R фактически имеет две группы функций (r | p | q | d) t и (r | p | q | d) nt (ditto для f и nf), где вторая форма допускает, -центральный параметр. И я думаю, что заголовок для nt.h был неправильным.

Если вы сделаете это изменение в файле include/Rcpp/stats/nt.h

@@ -22,7 +22,7 @@ 
#ifndef Rcpp__stats__nt_h 
#define Rcpp__stats__nt_h 

-RCPP_DPQ_2(t,::Rf_dt,::Rf_pt,::Rf_qt) 
+RCPP_DPQ_2(nt,::Rf_dnt,::Rf_pnt,::Rf_qnt) 

#endif 

(который вы можете просто изменить в заголовке, не переустановке нужно), то все не похоже на работу:

#include <Rcpp.h> 

// [[Rcpp::export]] 
Rcpp::DataFrame myrandom(Rcpp::NumericVector x) { 
    Rcpp::NumericVector y1, y2, y3, y4, y5, y6, y7, y8; 

    y1 = Rcpp::pexp(x,1.0,1,0); 
    y2 = Rcpp::pnorm(x,0.0,1.0,1,0); 
    y3 = Rcpp::ppois(x,3.0,1,0); 
    y4 = Rcpp::pt(x,3.0,1,0); 
    y5 = Rcpp::pnt(x,3.0,2,TRUE,FALSE); 
    y6 = Rcpp::pnt(x,3.0,2,TRUE,TRUE); 
    y7 = Rcpp::pnt(x,3.0,2,FALSE,TRUE); 
    y8 = Rcpp::pnt(x,3.0,2,FALSE,FALSE); 

    return Rcpp::DataFrame::create(Rcpp::Named("Exp") = y1, 
           Rcpp::Named("Norm") = y2, 
           Rcpp::Named("Pois") = y3, 
           Rcpp::Named("t") = y4, 
           Rcpp::Named("nt1") = y5, 
           Rcpp::Named("nt2") = y6, 
           Rcpp::Named("nt3") = y7, 
           Rcpp::Named("nt4") = y8); 
} 

мне еще нужно проверьте число против R, но по крайней мере он строит сейчас. (И TRUE/FALSE в сравнении с 1/0 не имеет значения, что правильно применяется).

Edit: А вот некоторые результаты:

> sourceCpp("/tmp/so1.cpp") 
R> myrandom(seq(0.2, 0.5, by=0.1)) 
     Exp  Norm  Pois  t  nt1  nt2  nt3  nt4 
1 0.181269 0.579260 0.0497871 0.572865 0.0351335 -3.34860 -0.0357655 0.964866 
2 0.259182 0.617911 0.0497871 0.608118 0.0434710 -3.13566 -0.0444441 0.956529 
3 0.329680 0.655422 0.0497871 0.642032 0.0535219 -2.92767 -0.0550074 0.946478 
4 0.393469 0.691462 0.0497871 0.674276 0.0654790 -2.72603 -0.0677212 0.934521 
R> 
+0

Это цена за то, что не проверила ее. Если кто-то, кто здесь слушает, хочет систематически использовать этот https://github.com/RcppCore/Rcpp/issues/29, они более чем приветствуются. –

+0

Собственно, тест проходил там несколько лет, но не так. Мы оба разобрались в этом. Тем не менее, дополнительное тестирование действительно будет приветствоваться. –

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