将lambda的矢量传递给Rcpp的rpois

时间:2014-06-14 05:33:27

标签: r random rcpp

在R中,rpois可以传递描述多个泊松分布的lambdas向量,例如

rpois(5, (1:5)*1000)

# [1] 1043 1974 3002 3930 4992

在上面,输出矢量的每个元素都是从不同的泊松分布中绘制出来的,分别为1000,2000,3000,4000和5000。

如果我有一个arma::mat(使用这些,因为我在其他地方使用立方体)包含泊松分布的lambda,那么将这些(一次一行)传递给rpois的最佳方法是什么RCPP?

这是一个玩具示例,以及随后出现的错误消息的摘录:

library(inline)
library(RcppArmadillo)
code <- "
  using namespace Rcpp;
  using namespace arma;
  arma_rng::set_seed(42); // Dirk's seed of choice

  mat lam = randu(5, 5); // ignore the fact these are all 0-1
  mat out(5, 5);

  for (int i = 0; i < 5; i++) {
    out.row(i) = rpois(5, lam.row(i));
  }      

  return(wrap(out));
"

f <- cxxfunction(body=code, plugin="RcppArmadillo")

# cannot convert 'arma::subview_row<double>' to 'double' for argument '2' 
#   to 'Rcpp::NumericVector Rcpp::rpois(int, double)'

我必须承认我对c ++中类型转换的理解很差。是我试图做的事情(我的猜测是否定的,因为看起来rpois期待加倍),或者我是否需要迭代矩阵的每个单元格,每次都会产生一个偏差?

1 个答案:

答案 0 :(得分:6)

从C / C ++,您可以访问至少2个Poisson偏差生成例程(在此online manual中搜索rpois)。

他们的声明如下:

double R::rpois(double mu);
NumericVector Rcpp::rpois(int n, double mu);

他们都不允许传递&gt; mu(a.k.a.lambda)中的1个值。第一个函数是R的原始例程,用于实现rpois,正如我们从R stats包那样知道的那个包(w.r.t所有参数的向量化)。给定单个mu,它返回单个(伪)随机偏差。

第二个是所谓的Rcpp糖功能。它允许一次计算n偏差并将其作为NumericVector返回(再次使用R::rpois)。

换句话说,您应该通过调用for来使用两个嵌套的R::rpois循环来填充矩阵。不要害怕这种方法,这就是C ++。 :)