我的随机播放函数有多随机?

3

我正在编写一项心理实验,需要为每个参与者随机排列刺激顺序。我有一个函数可以随机排列我的刺激,然后我的程序从一个.txt文件中读取它们的顺序。默认情况下,在我的“shuffle”函数中使用的伪随机算法是否足够混淆事物,以便在实验过程中(4500次试验)不会产生任何系统偏差,无论是在任何刺激位置还是刺激位置模式上?

stimulus <- c("a", "b", "c", "d", "e")
shuffle <- function (x) { as.data.frame(sample((t(x)))) } 
shuffle (stimulus)

1
我忍不住要提醒一下,结果严重偏向于字母表的前面 :-) - Carl Witthoft
2个回答

6

我认为是的,你可以绘制图形来说明。如果数据真的是随机的,我们在乱序后每个位置期望看到一个均匀分布的值,所以让我们多次重复这个实验,并将结果绘制成图表...

#  Repeat experiment 10,000 times
res <- replicate( 10000 , shuffle(stimulus) )
out <- do.call( rbind , res )

#  Plot
par( mfrow = c( 3 , 2 ) )
for( i in 1:ncol(out)){
  hist( out[,i] , main = paste0("Values at position: " , i ) )
}

每个直方图表示每个位置的数值分布情况。有5个位置,因此有5个直方图。在每个位置上可能的数值均匀分布,因此我会说您的数值被赋予每个位置的概率是相等的(这是sample的默认设置)。 enter image description here

我认为使用 sample 进行无重复采样,且不指定概率会导致 费舍尔-耶茨洗牌算法。这是因为在每个值被采样后,它会重新规范化概率(在这种情况下是均匀分布),并从剩余可用的值中进行采样。这意味着每个排列具有相等的概率。 - Kevin Bullaughey

4
在R语言中,随机数生成器非常优秀,这门语言是面向统计学家的。有几点需要注意:
  1. See ?RNG for details about the random number generators used.

  2. Use set.seed to make your shuffling reproducible

    set.seed(1)
    
  3. You could simplify your code to:

    stimulus = c("a", "b", "c", "d", "e")
    data.frame(sh=sample(stimulus))
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接