在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
期待加倍),或者我是否需要迭代矩阵的每个单元格,每次都会产生一个偏差?
答案 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 ++。 :)