2013-08-22 45 views
3

我正在編程一個心理學實驗,我需要爲每個參與者洗牌刺激的順序。我有一個函數,它隨機排列我的刺激,然後我的程序從.txt文件讀出。在樣本中默認使用的僞隨機算法(如下面的「洗牌」函數中所示)是否足夠真實地混洗事物,預期不會在課程中的任何刺激位置或刺激位置模式中產生任何系統性偏見的實驗(4500次試驗)?我的隨機功能的隨機程度如何?

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

我無法抗拒暗示結果嚴重偏向於字母表的開始:-) –

回答

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

+0

我相信在沒有替換的情況下使用抽樣(使用樣本)而不指定概率會導致[Fisher- Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)算法。這是因爲在每個值被採樣之後,它將概率(在這種情況下是統一的)和來自剩餘可用的樣本的重新歸一化。這意味着每個排列的概率相等。 –

4

R中的隨機數發生器非常好 - 語言是針對統計學家的。幾點。

  1. 查看?RNG關於使用的隨機數發生器的細節。

  2. 使用set.seed,讓您的洗牌重複性

    set.seed(1) 
    
  3. 你完全可以簡化您的代碼:

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