一個相當普遍的功能

我們將使用內建的牙齒生長資料集 。我們感興趣的是,當給予豚鼠維生素 C 與橙汁時,牙齒生長是否存在統計學上的顯著差異。

這是完整的例子:

teethVC = ToothGrowth[ToothGrowth$supp == 'VC',]
teethOJ = ToothGrowth[ToothGrowth$supp == 'OJ',]

permutationTest = function(vectorA, vectorB, testStat){
  N = 10^5
  fullSet = c(vectorA, vectorB)
  lengthA = length(vectorA)
  lengthB = length(vectorB)
  trials <- replicate(N, 
                      {index <- sample(lengthB + lengthA, size = lengthA, replace = FALSE)
                      testStat((fullSet[index]), fullSet[-index])  } )
  trials
}
vec1 =teethVC$len;
vec2 =teethOJ$len;
subtractMeans = function(a, b){ return (mean(a) - mean(b))}
result = permutationTest(vec1, vec2, subtractMeans)
observedMeanDifference = subtractMeans(vec1, vec2)
result = c(result, observedMeanDifference)
hist(result)
abline(v=observedMeanDifference, col = "blue")
pValue = 2*mean(result <= (observedMeanDifference))
pValue

在我們讀取 CSV 之後,我們定義了該函式

permutationTest = function(vectorA, vectorB, testStat){
  N = 10^5
  fullSet = c(vectorA, vectorB)
  lengthA = length(vectorA)
  lengthB = length(vectorB)
  trials <- replicate(N, 
                      {index <- sample(lengthB + lengthA, size = lengthA, replace = FALSE)
                      testStat((fullSet[index]), fullSet[-index])  } )
  trials
}

該函式接受兩個向量,並將它們的內容混合在一起,然後在混洗向量上執行函式 testStatteststat 的結果被新增到 trials,這是返回值。

這樣做了 4 次。請注意,值 N 很可能是函式的引數。

這給我們留下了一組新的資料,trials,如果兩個變數之間確實沒有關係,可能會產生一系列均值。

現在定義我們的測試統計:

subtractMeans = function(a, b){ return (mean(a) - mean(b))}

執行測試:

result = permutationTest(vec1, vec2, subtractMeans)

計算我們實際觀察到的平均差異:

observedMeanDifference = subtractMeans(vec1, vec2)

讓我們看看我們的測試統計資料的直方圖上的觀察結果。

hist(result)
abline(v=observedMeanDifference, col = "blue")

StackOverflow 文件

看起來不像我們觀察到的結果很可能是隨機發生的……

我們想要計算 p 值,即原始觀察結果的可能性,如果它們在兩個變數之間沒有關係的話。

pValue = 2*mean(result >= (observedMeanDifference))

讓我們稍微打破一下:

result >= (observedMeanDifference)

將建立一個布林向量,如:

FALSE TRUE FALSE FALSE TRUE FALSE ...

每當 result 的值大於或等於 observedMean 時,使用 TRUE

mean 函式將此向量解釋為 TRUE1FALSE0,並給出混合中 1 的百分比,即我們的混洗向量平均差異超過或等於我們觀察到的次數。

最後,我們乘以 2,因為我們的測試統計量的分佈是高度對稱的,我們真的想知道哪些結果比我們觀察到的結果更極端

剩下的就是輸出 p 值,結果是 0.06093939。對這個值的解釋是主觀的,但我會說維生素 C 看起來比橙汁更能促進牙齒生長。