[Rcpp-devel] for loop and random draws
Denis Haine
cheval at zaclys.net
Tue Oct 1 17:57:34 CEST 2024
Sorry, I missed sharing that part comparing the two functions, vector
vs. matrix without the regression.
// [[Rcpp::export]]
NumericMatrix define_e(int iter, NumericMatrix obs_mat, NumericVector
draws) {
Rcpp::NumericVector d = obs_mat(_, 1);
Rcpp::NumericVector pr = no_init(d.length());
Rcpp::NumericMatrix e(d.length(), iter);
for (int i = 0; i < iter; i++) {
pr = obs_mat(_, 0) * draws(i);
e(_, i) = cpprbinom(d.length(), 1, pr);
}
return e;
}
// [[Rcpp::export]]
NumericMatrix define_e1(int iter, NumericMatrix obs_mat, NumericVector
draws) {
Rcpp::NumericVector d = obs_mat(_, 1);
Rcpp::NumericVector pr = no_init(d.length());
Rcpp::NumericVector e = no_init(d.length());
Rcpp::NumericMatrix e_mat(d.length(), iter);
for (int i = 0; i < iter; i++) {
pr = obs_mat(_, 0) * draws(i);
e = cpprbinom(d.length(), 1, pr);
e_mat(_, i) = e; // save e as matrix for sake of demonstration
}
return e_mat;
}
So these two give the same output:
> draws <- rbeta(200, 100, 60)
> obs_mat <- cbind(c(rep(1, 40), rep(0, 60)), c(rep(1, 20), rep(0, 80)))
> iter <- length(draws)
> set.seed(1234)
> t0 <- define_e(iter, obs_mat, draws)
> set.seed(1234)
> t1 <- define_e1(iter, obs_mat, draws)
> all.equal(t0, t1)
[1] TRUE
But adding the regression to define_e1() (as define_e2() in previous
email) does not give the same. The first iteration in the loop is
identical in both, but not the subsequent ones. That's why I was
thinking it could be linked to the seed, but (sorry for my limited
knowledge of C++) it would be strange to manually "re-seed" at each
iteration. Moreover, I believe the seed set in R is transferred to Rcpp
and so does not need to be taken specifically care of.
Denis
Le 2024-10-01 11:14, Dirk Eddelbuettel a écrit :
> On 1 October 2024 at 09:59, Dirk Eddelbuettel wrote:
> | This is not reproducible. You show two functions, they both take
> arguments,
> | you do not supply those. We cannot run this, so we cannot really help
> you.
>
> I missed the lines at the bottom past your signature, so I was wrong.
> My bad.
>
> I would still encourage you to _simplify_. You have a pair of
> moderately
> complex functions, and they do not reproduce the same results after two
> runs
> despite re-seeding. So I would trim elements from them one by one to
> see
> which removal leads to identical results. Or, inversely, start from
> twice
> drawing from an RNG after reseed and assert first that the draws are
> identical. Then add your processing.
>
> Dirk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20241001/2c4cadd1/attachment.htm>
More information about the Rcpp-devel
mailing list