重塑rmultinom和rpois与RCPP

[本文首次发表于RCPP图库,并慷慨解囊,以188bet app]。(您可以在本网页上的内容报告问题金宝搏网址here
Want to share your content on R-bloggers?188bet app 如果你有一个博客,或here如果哟u don't.

Sometimes one needs to mimic the exact behavior of R’s分布内C ++
code. The incredibleRCPP团队提供了访问这些分布通过
Rmath.h(在里面[R ::命名空间),以及通过RCPP ::命名空间哪里有
可以是两种形式:标量为R,并且经由RCPP糖量化。这些行为
功能可能并不总是完全匹配的用户从标准的R行为所期待的,
特别是如果试图使用功能Rmath.h。特别地,所述功能
Rmath.h没有量化。在下文中,我将使用RCPP模仿
无论是行为rmultinomrpois在基础R以使得本可用的功能
功能和行为在本地C ++提供。

多项分布
推广了二项分布ķ离散结果而不是2;所以,
它是在参数方面ķ必须总和为1的基础R函数的概率
rmultinom用于生成多项式数据有三个参数:ñ的数量
模拟数据集生产,尺寸,多项式的结果的数量样品
每个数据集,并概率a numeric vector of probabilities. The function returns aķ
$ \ $倍ñ整数矩阵。

下面的C ++代码使用[R :: rmultinom功能提供Rmath.h生成
尺寸多项成果。该[R :: rmultinom功能依赖于引用的指针
IntegerVector储存结果。我们创建一个辅助函数,rmultinom_1
绘制尺寸从多项分布多项成果基础上,
在概率概率。然后,我们这样做ñ在功能上独立的时间
rmultinom_rcpp。以匹配基础R的功能,rmultinom_rcpp回报ķ
$ \ $倍ñIntegerMatrix

#包括运用ñamespaceRCPP;IntegerVectorrmultinom_1无符号在t尺寸NumericVectorprobs无符号在tñ{IntegerVector结果ñ);rmultinom尺寸probs开始(),ñ结果开始());返回结果;}// [RCPP ::出口]IntegerMatrixrmultinom_rcpp无符号在tñ无符号在t尺寸NumericVectorprobs{无符号在tñ=probs长度();IntegerMatrixSIM卡ññ);对于无符号在t一世=0;一世<ñ;一世++{SIM卡_一世=rmultinom_1尺寸probsñ);}返回SIM卡;}

我们现在检查rmultinomrmultinom_rcpp功能产生相同的结果。
我们生成的200个概率的向量总和为1。我们将采样500多项
结果和这样做独立的20倍。

概率< -runif200概率< -概率/概率#规范的概率尺寸< -500ñ< -20set.seed10sim_r< -rmultinomñ尺寸概率set.seed10sim_rcpp< -rmultinom_rcppñ尺寸概率all.equalsim_rsim_rcpp
[1]真正的

对这些功能的基准测试表明,rmultinom_rcpp功能是非常轻微
比慢rmultinom功能,但是这是不是真的我们的目的值得关注。

微基准::微基准rmultinom1000尺寸概率rmultinom_rcpp1000尺寸概率
单位:毫秒EXPR分钟LQ平均中值最大UQ CLD neval rmultinom(1000,大小,概率)10.8676 10.9925 11.1737 11.0826 11.1898 13.9595 100 rmultinom_rcpp(1000,大小,概率)11.0879 11.2072 11.4897 11.3341 11.6203 13.9920 100b中

泊松分布
非负离散分布的特征在于具有相同的平均值和
方差。的基础R函数rpois用于生成泊松数据需要两个
参数:ñ模拟值的数目,以产生,并拉姆达,一个正数
向量。该rpois功能循环(再循环和)通过在值拉姆达每个
连续值模拟。该功能产生一个长度的整数矢量ñ。我们
使用提供类似功能的[R :: rpois功能提供Rmath.h。注意
通过的值,我们循环拉姆达so that if the end of the拉姆达矢量
reached before we have generatedñ值,然后我们重启时的初
拉姆达向量。

#包括运用ñamespaceRCPP;// [RCPP ::出口]IntegerVectorrpois_rcpp无符号在tñNumericVector拉姆达{无符号在tlambda_i=0;IntegerVectorSIM卡ñ);对于无符号在t一世=0;一世<ñ;一世++{SIM卡[一世]=[R::rpois拉姆达[lambda_i]);//更新lambda_i与正确的平均值未来实现的价值相匹配lambda_i++;// 0重启lambda_i如果拉姆达年底达到如果lambda_i==拉姆达长度()){lambda_i=0;}}返回SIM卡;}

现在,我们评估是否rpoisrpois功能产生相同的结果。我们
产生具有200个值的正矢量拉姆达并得出长度(拉姆达)+ 5
独立泊松值。

拉姆达< -runif2000.53set.seed10pois_sim_r< -rpois长度拉姆达+拉姆达set.seed10pois_sim_rcpp< -rpois_rcpp长度拉姆达+拉姆达all.equalpois_sim_rpois_sim_rcpp
[1]真正的

这两个功能的基准暗示rpois_rcpp功能可能会稍微快一点,
但再次,这是不是我们这里主要关注的。

微基准::微基准rpois长度拉姆达+拉姆达rpois_rcpp长度拉姆达+拉姆达
单位:微秒EXPR分钟LQ平均中值UQ最大neval CLD rpois(长度(拉姆达)+ 5,拉姆达)7.412 7.7780 8.50529 7.9495 8.2165 60.014 100b中rpois_rcpp(长度(拉姆达)+ 5,拉姆达)6.721 6.9965 7.37430 7.1645 7.4950 21.263 100一个

发表评论对于作者,请按照自己的博客上的链接和评论:RCPP图库

188bet appR-bloggers.com报价每日电子邮件更新金宝搏网址 [R新闻和教程金宝搏网址金宝搏网址 和许多其他议题。点击这里,如果你正在寻找张贴或找到一个R /数据科学工作
Want to share your content on R-bloggers?188bet app 如果你有一个博客,或here如果哟u don't.

决不会错过的更新!
订阅R-博客188bet app受到
电子邮件与最新的[R帖子。
(您将不会再看到这条消息。)

点击此处关闭(此弹出不会再次出现)