gpt4 book ai didi

r - 从 Rcpp 中获取与基 R 相同的整数样本

转载 作者:行者123 更新时间:2023-12-01 16:14:58 25 4
gpt4 key购买 nike

是否可以从 Rcpp 中获得与从基础 R 的 sample 相同的整数sample

我尝试使用 Rcpp::sampleRcpp::RcppArmadillo::sample 但它们不返回相同的值 - 下面的示例代码。此外,帖子 https://gallery.rcpp.org/articles/using-the-Rcpp-based-sample-implementation/快速示例部分从 Rcpp 和基本 R 返回相同的示例,但是,我无法重现这些结果(我在末尾附上此代码)。

这可以做到吗/我做错了什么?

我的尝试:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>

// [[Rcpp::export]]
Rcpp::IntegerVector mysamp1( int n) {
Rcpp::IntegerVector v = Rcpp::sample(n, n);
return v;
}

// [[Rcpp::export]]
Rcpp::IntegerVector mysamp2(int n) {
Rcpp::IntegerVector i = Rcpp::seq(1,n);
Rcpp::IntegerVector v = wrap(Rcpp::RcppArmadillo::sample(i,n,false));
return v;
}

// set seed https://stackoverflow.com/questions/43221681/changing-rs-seed-from-rcpp-to-guarantee-reproducibility
// [[Rcpp::export]]
void set_seed(double seed) {
Rcpp::Environment base_env("package:base");
Rcpp::Function set_seed_r = base_env["set.seed"];
set_seed_r(std::floor(std::fabs(seed)));
}

// [[Rcpp::export]]
Rcpp::IntegerVector mysamp3( int n, int seed) {
set_seed(seed);
Rcpp::IntegerVector v = Rcpp::sample(n, n);
return v;
}


/***R
set.seed(1)
sample(10)
# [1] 9 4 7 1 2 5 3 10 6 8
set.seed(1)
mysamp1(10)
# [1] 3 4 5 7 2 8 9 6 10 1
set.seed(1)
mysamp2(10)
# [1] 3 4 5 7 2 8 9 6 10 1
mysamp3(10, 1)
# [1] 3 4 5 7 2 8 9 6 10 1

*/

使用基于 RcppArmadillo 的 R 示例 () 实现 画廊帖子中的代码在我的系统上返回 FALSE:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadilloExtensions/sample.h>
using namespace Rcpp ;

// [[Rcpp::export]]
CharacterVector csample_char( CharacterVector x,
int size,
bool replace,
NumericVector prob = NumericVector::create()) {
CharacterVector ret = RcppArmadillo::sample(x, size, replace, prob) ;
return ret ;
}

/*** R
N <- 10
set.seed(7)
sample.r <- sample(letters, N, replace=T)

set.seed(7)
sample.c <- csample_char(letters, N, replace=T)

print(identical(sample.r, sample.c))
# [1] FALSE
*/

最佳答案

将评论编译为答案。 Akrun 指出,通过设置 RNGkindRNGversion 我们可以复制结果。来自 DirkEddelbuettel; “R 的 RNG 发生了变化,因为有人注意到 IIRC 使用采样(N 非常大)存在偏差。这就是为什么你要在 R 中打开一个选项来获得旧的(匹配)行为” RalfStubner 表示这是一个已知问题: https://github.com/RcppCore/RcppArmadillo/issues/250https://github.com/RcppCore/Rcpp/issues/945

目前 R 使用不同的默认采样器,这会导致不同的结果

RNGkind(sample.kind = "Rejection")
set.seed(1)
sample(10)
# [1] 9 4 7 1 2 5 3 10 6 8
set.seed(1)
mysamp1(10)
# [1] 3 4 5 7 2 8 9 6 10 1

但是,可以使用早期版本

RNGkind(sample.kind = "Rounding")
#Warning message:
# In RNGkind("Mersenne-Twister", "Inversion", "Rounding") : non-uniform 'Rounding' sampler used

set.seed(1)
sample(10)
# [1] 3 4 5 7 2 8 9 6 10 1
set.seed(1)
mysamp1(10)
# [1] 3 4 5 7 2 8 9 6 10 1

关于r - 从 Rcpp 中获取与基 R 相同的整数样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60119621/

25 4 0