【问题标题】:Unexpected behavior when using R sample function with rpy2?将 R 示例函数与 rpy2 一起使用时出现意外行为?
【发布时间】:2021-04-20 08:14:11
【问题描述】:

我需要交叉验证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

结果不同。谁能解释为什么会发生这种情况和/或提供一种使用 R sample 函数在 R 和 python 中获取相似值的方法?

【问题讨论】:

    标签: python r random rpy2


    【解决方案1】:

    如果您在两种情况下都打印 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 会话中使用旧的“舍入”方法。您可能很久以前保存了一个工作区,并且从那以后重新加载了它。不要那样做,每次会话都从干净的工作区开始。

    【讨论】:

    • 就是这样!非常感谢。
    【解决方案2】:

    也许可以试一试(here 的 stackoverflow 回答)。引用答案:“p 参数对应于 sample() 函数中的 prob 参数”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2017-04-29
      相关资源
      最近更新 更多