将 R 示例函数与 rpy2 一起使用时出现意外行为?
Unexpected behavior when using R sample function with rpy2?
我需要在 python
中交叉验证 R
代码。我的代码包含很多伪随机数生成,因此,为了便于比较,我决定使用 rpy2
在我的 python
代码中“从 R
”生成这些值。
例如,在 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
结果不同。谁能解释为什么会发生这种情况 and/or 提供一种使用 R sample
函数在 R 和 python 中获取相似值的方法?
也许试一试(来自 的 Whosebug 回答)。引用答案:“p 参数对应于 sample() 函数中的 prob 参数”
import numpy as np
np.random.choice(a, size=None, replace=True, p=None)
如果您在两种情况下都打印 R 函数 RNGkind()
的值,我怀疑您不会得到相同的答案。 Python 结果看起来像默认输出,而你的 R 结果看起来像旧的错误输出。
例如,在 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 package (v0.3.0)
于 2021-01-15 创建
所以在我看来,您似乎仍在 R 会话中使用旧的“舍入”方法。您可能很久以前保存了一个工作区,并且从那以后重新加载了它。不要那样做,从每个会话的干净工作区开始。
我需要在 python
中交叉验证 R
代码。我的代码包含很多伪随机数生成,因此,为了便于比较,我决定使用 rpy2
在我的 python
代码中“从 R
”生成这些值。
例如,在 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
结果不同。谁能解释为什么会发生这种情况 and/or 提供一种使用 R sample
函数在 R 和 python 中获取相似值的方法?
也许试一试(来自
import numpy as np
np.random.choice(a, size=None, replace=True, p=None)
如果您在两种情况下都打印 R 函数 RNGkind()
的值,我怀疑您不会得到相同的答案。 Python 结果看起来像默认输出,而你的 R 结果看起来像旧的错误输出。
例如,在 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 package (v0.3.0)
于 2021-01-15 创建所以在我看来,您似乎仍在 R 会话中使用旧的“舍入”方法。您可能很久以前保存了一个工作区,并且从那以后重新加载了它。不要那样做,从每个会话的干净工作区开始。