2015-08-25 2 views
1

Я только что потратил некоторое время, пытаясь найти ошибку в моем коде, которая оказалась необычной (по крайней мере для меня) параметризацией для функции R::dexp. Например:Параметризация R :: dexp

cppFunction(" 
    double my_dexp(double x, double lambda, double is_log) { 
    return R::dexp(x, lambda, is_log); 
    } 
") 

> my_dexp(4.5, 2.5, FALSE) 
[1] 0.06611956 
> dexp(4.5, 2.5, FALSE) 
[1] 3.251824e-05 

Глядя here Я могу видеть, что они используют определение:

double R::dexp(double x, double sl, int lg) 

, но я не был в состоянии выяснить, что sl стоит. Я не уверен, что это где-то документировано - так что, надеюсь, этот пост является предупреждением другим, которые использовали такую ​​функцию, как я, а также если кто-нибудь может помочь в отношении того, какая параметризация была использована и почему.

ответ

3

Если посмотреть на определение функции для dexp,

R> dexp 
function (x, rate = 1, log = FALSE) 
.Call(C_dexp, x, 1/rate, log) 

вы увидите, что dexp вызывает функцию C C_dexp с параметром 1/rate. Это то, что зеркало R::dexp. В Rcp они всегда используют ту же параметризацию, что и сама R, на уровне C, которая может отличаться от уровня R.

Это означает, что

R> my_dexp(4.5, 1/2.5, FALSE) - dexp(4.5, 2.5, FALSE) 
[1] 0 

Если вы смотрите на странице Википедии на exponential function, вы увидите альтернативную параметризацию на основе обратного параметра скорости, лямбда. В этой параметризации параметр beta=1/lambda играет роль параметра выживаемости. Таким образом, ожидаемая продолжительность выживания системы составляет beta единиц времени.

+1

Пятно на. Также проверьте определение 'dexp()' в 'Rmath.h' - как вы заметили, мы (в Rcpp) _allways_ используем ту же самую параметризацию, что и сам R, на уровне C, который может отличаться от уровня R. Но все это документально ... –

+0

Спасибо вам, что поняли, что для меня – Jeff

+0

@DirkEddelbuettel Добавил свой комментарий к ответу. Благодарю. – csgillespie