与rpy2使用R样本函数时的意外行为?



我需要在python中交叉验证R代码。我的代码包含许多伪随机数生成,因此,为了便于比较,我决定使用rpy2R生成python代码中的这些值。

例如,在R中,我有:

set.seed(1234)
runif(4)
[1] 0.1137034 0.6222994 0.6092747 0.6233794

在python中,使用rpy2,我有:

import rpy2.robjects as robjects
set_seed = robjects.r("set.seed")
runif =  robjects.r("runif")
set_seed(1234)
print(runif(4))
[1] 0.1137034 0.6222994 0.6092747 0.6233794

如预期的(值相似)。然而,我面对R sample函数(相当于numpy.random.choice函数)的奇怪行为。

作为最简单的可复制示例,我在R中有:

set.seed(1234)
sample(5)
[1] 1 3 2 4 5

而在python我有:

sample =  robjects.r("sample")
set_seed(1234)
print(sample(5))
[1] 4 5 2 3 1

结果是不同的。有没有人可以解释为什么会发生这种情况和/或提供一种方法来获得类似的值在R和python使用R sample函数?

如果在两种情况下打印R函数RNGkind()的值,我怀疑您不会得到相同的答案。Python结果看起来像默认输出,而你的R结果看起来像旧的有bug的输出。

例如,在R中:

set.seed(1234, sample.kind = "Rejection")
sample(5)
#> [1] 4 5 2 3 1
set.seed(1234, sample.kind = "Rounding")
#> Warning in set.seed(1234, sample.kind = "Rounding"): non-uniform 'Rounding'
#> sampler used
sample(5)
#> [1] 1 3 2 4 5
set.seed(1234, sample.kind = "default")
sample(5)
#> [1] 4 5 2 3 1

由reprex包(v0.3.0)在2021-01-15创建

所以在我看来,你好像还在使用旧的"四舍五入"方法在你的R会话。您可能很久以前保存了一个工作空间,然后重新加载了它。不要这样做,每次会议都要有一个干净的工作空间。

也许给这个机会(stackoverflow的答案从这里)。引用答案:p参数对应于sample()函数中的prob参数">

import numpy as np
np.random.choice(a, size=None, replace=True, p=None)

最新更新