【问题标题】:R sample from sequence stepwise vs replicate with different results来自序列的 R 样本逐步与具有不同结果的复制
【发布时间】:2016-03-08 14:39:34
【问题描述】:

编辑(根据要求完全修改问题)

在从序列中逐步采样一个索引与对整个序列进行采样时,我得到了一些意想不到的行为。如果我设置一次种子

set.seed(123)

并执行

sample(c(0.9,0.95,1,1.01,1.02,1.03,1.04,1.05))

我得到例如

[1] 1.03 0.90 1.02 1.00 0.95 1.04 1.05 1.01  
[1] 1.05 0.95 1.01 1.04 0.90 1.00 1.03 1.02   
[1] 0.90 1.04 1.01 1.05 1.00 0.95 1.03 1.02   

但是,如果我重复执行(非常频繁,例如 100 次)

sample(c(0.9,0.95,1,1.01,1.02,1.03,1.04,1.05))[3]

R 不会采样除 0.9、0.95、1 或 1.0 以外的任何值。我也改变了种子,但行为是一样的。我错过了什么?

R 版本 3.1.3 (2015-03-09)
平台:x86_64-w64-mingw32/x64(64位)

【问题讨论】:

  • 无法重现(也不希望如此)。随机数总有机会获得长期收益。
  • 好的。那么这是一个非常漫长的过程(即使是新的R)。我只是惊讶于他从未从上述数字中始终如一地采样任何东西。
  • “从不”样本到底是什么意思?在得出结论之前您选择了多少个数字,您将永远看不到价值?
  • 你在做set.seed()吗?
  • 在 3 次新的 R 会话中超过 100 次(每次)。

标签: r replication sample


【解决方案1】:

没有复制:

> set.seed(123)
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.96
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 1.06
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.98
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 1.08
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 1.09
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.9
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 1.01
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 1.08
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 1.01
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.99

还有:

> set.seed(123)
> replicate(10,sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T))
 [1] 0.96 1.06 0.98 1.08 1.09 0.90 1.01 1.08 1.01 0.99

replicate 完全相同的值列表(如预期)只是 sapply 的包装器:

> replicate
function (n, expr, simplify = "array") 
sapply(integer(n), eval.parent(substitute(function(...) expr)), 
    simplify = simplify)

通过一个小测试,我可以找到复制您问题的种子(我认为):

for(i in 1000:2000) { 
  set.seed(i)
  if( all(replicate(10,sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)) < 1 )) { 
    print(i)
    break
  }
}

给我 1887 等等:

> set.seed(1887)
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.99
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.92
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.96
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.99
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.95
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.99
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.96
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.93
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.94
> sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T)[1]
[1] 0.99
> replicate(10,sample(seq(from = 0.9, to = 1.1, by = 0.01), size=1, replace=T))
 [1] 1.07 1.06 0.97 1.07 1.00 0.99 0.91 1.01 1.05 0.97

【讨论】:

  • 谢谢。这正是我所看到的。所以我对种子的理解是错误的。
  • @Triam 种子是随机数生成器状态,将其设置为固定值可以让您生成可预测的随机序列。 set.seed 中的文档提供了更多详细信息。
  • 我的假设是,如果我看到复制中的数字,我希望它们是逐步执行的,因为复制只是逐步执行的便利功能。
  • @Triam 请注意,我在逐步调用和复制调用之间重置了种子(除非在最后一步显示连续生成)。除非您从固定种子开始,否则新会话将在第一次需要时从时间和进程 ID 生成一个,通常会给出一个相当罕见的情况来生成相同的随机数序列。
  • 因此您的假设是正确的,如果您从 ssame 种子开始,您将手动使用复制或重复调用获得相同的数字...(如果您的会话不是这种情况,请编辑你的问题来展示它)
【解决方案2】:

问题是在数字约束(options("digits"=2))下发生的序列创建。请参阅此处以获取答案"R seq function produces wrong result"

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2020-08-30
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多