【问题标题】:Equality of two shuffling codes in RR中两个混洗码的相等性
【发布时间】:2019-01-10 19:15:17
【问题描述】:

我想知道以下两个 4 个数字 (1:4) 的改组是否同样随机,或者就随机性而言,一个可能优于另一个:

sample(rep(1:4, 10))

replicate(10, sample(1:4))

约束:

尽管有随机性,但我需要有相同数量的 1、2、3 和 4。

【问题讨论】:

  • 我不确定这一定是开发人员问题,还是研究问题。 set.seed() 将有助于随机性,尽管我不确定种子会影响像 sample 这样的功能。
  • 我相信它们同样是随机的,但第一行会快得多,因为它不需要经常重新启动随机数生成器。
  • @OTStats,只需多次运行set.seed(1701); sample(1:100, 1)。每次都会产生相同的结果,13。
  • @rnorouzian 如果您希望每个类别有 10 个实例,请使用 sample(rep(1:4, 10)) 然后
  • 好吧,从统计学上讲,如果您想“40 个受试者满足 4 个条件之一(即 1、2、3、4)”,那么 sample(1:4, 40, replace = TRUE) 是典型的解释。如果你有一些其他的限制,那么你需要清楚地说明它。如果要求所有组有完全相同数量的科目,那是一个不同的过程。

标签: r random sample sampling


【解决方案1】:

这些功能在任何方面都不相等。


1。类型

f1() 输出一个向量,f2() 输出一个矩阵。

正如@RicS 所说,第一个返回一个向量,第二个返回一个矩阵。


2。时间

f1() 几乎是 f2() 的 50 倍。

运行时的差异在更大范围内变得更加清晰:

set.seed(1701)

# Functions
f1 <- function() { sample(rep(1:4, 10000)) }
f2 <- function() { c(replicate(10000, sample(1:4))) }

# Benchmark
microbenchmark::microbenchmark(f1(), f2())
Unit: microseconds
 expr      min         lq       mean     median        uq       max neval cld
 f1()   671.28   820.6755   983.9417   988.7985  1046.476  2320.425   100  a 
 f2() 40588.03 43241.0270 48796.0141 45612.0740 54431.890 71117.415   100   b

我们看到f1() 明显更快,正如@JosephClarkMcIntyre 在 cmets 中所说的那样。

但它们的随机性至少是相等的吗? 让我们测试一下!


3。随机性

f2() 不是随机的。

Bartels 秩检验可以测试一系列数字的随机性与非随机性。

> randtests::bartels.rank.test(as.numeric(f1_result$value))

    Bartels Ratio Test

data:  as.numeric(f1_result$value)
statistic = -1.26, n = 40000, p-value = 0.2077
alternative hypothesis: nonrandomness

p 值 > 0.05,因此没有拒绝原假设。
f1() 的结果不是非随机的。 (这和确定是随机的不一样)

> randtests::bartels.rank.test(as.numeric(f2_result$value))

    Bartels Ratio Test

data:  as.numeric(f2_result$value)
statistic = 50.017, n = 40000, p-value < 2.2e-16
alternative hypothesis: nonrandomness

p 值 f1() 的结果是非随机的。

如果您查看函数本身的结果,这一点也很明显。

> set.seed(1701)
> replicate(10, sample(1:4))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    4    1    3    3    2    3    3    4     1
[2,]    3    1    2    1    4    3    2    2    3     4
[3,]    4    2    3    2    1    1    4    4    2     2
[4,]    2    3    4    4    2    4    1    1    1     3

它产生一个有十列的矩阵,每列包含正好的数字 1:4。这不是随机的。

【讨论】:

  • 但是,f1 由 1 到 4 的一个随机样本(n = 10000)组成。但是,f2 由 1 的 10000 次随机采样(每次 n = 4)组成到 4. 我认为这是两件不同的事情。
  • 对,但我的问题是,在我需要相同数量的 1、2、3 和 4 的约束下,哪个过程可以确保更好的随机性?
  • 以上两个函数都返回 n = 40000。这些正是您提出的函数。 f1() 样本来自 rep(1:4, 10000),即 10,000 x 1、10,000 x 2、10,000 x 3、10,000 x 4。f2() 样本来自 1:4,但重复 10,000 次。
  • 因此,f2() 将总是导致每组四个人(1:4、5:8、9:12,...)包含所有四个不同的组。这不是随机的。 f1() 可能会导致四个不同的组随机分布在您的 40 个人中。
  • THIS 怎么样?
【解决方案2】:

清除你在cmets中的意思后,这两行代码在随机性方面基本相等,因为你会得到每个类别的10个实例(从1到4)。

完成工作的时间基本相同,总共只有 40 个数字。

然而,sample(rep(1:4, 10)) 返回一个长度为 40 的整数 vector,而 replicate(10, sample(1:4)) 输出一个 4x10 matrix,其中绘制了从 1 到 4 的数字每列中只有一次。

【讨论】:

  • 它们在运行时间方面并不相同。
  • 我已经尝试过了,它们返回相同的运行时。也许更大的尺寸运行时间会有所不同,但我写的只是这40个数字。
  • 我相信replicate(10, sample(1:4)) 是首选,因为它创建了 10 个随机选择的 1 到 4 的块,并且每个块都是随机的。如果您对matrix(sample(rep(1:4, 10)), 4, 10) 进行矩阵化处理,您会发现它可以实现与未块化相同的效果。
  • @RicS 它可能不引人注目,但它就在那里。运行microbenchmark::microbenchmark(sample(rep(1:4, 10)), replicate(10, sample(1:4))),你会看到第二个函数的运行时间增加了十倍。
  • 感谢您通过评论和回答分享您的知识,学习新东西总是很高兴!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2016-10-02
  • 2013-02-25
  • 1970-01-01
  • 2015-01-01
相关资源
最近更新 更多