Поиск…


Достаточно общая функция

Мы будем использовать встроенный набор данных о росте зуба . Нас интересует, существует ли статистически значимая разница в росте зубов, когда морским свинкам дают витамин С против апельсинового сока.

Вот полный пример:

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
}

Эта функция принимает два вектора и перемешивает их содержимое вместе, затем выполняет функцию testStat на перетасованных векторах. Результат teststat добавляется к trials , что является возвращаемым значением.

Он делает это N = 10^5 раз. Обратите внимание, что значение 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")

введите описание изображения здесь

Это не похоже на то, что наш наблюдаемый результат, скорее всего, произойдет случайно.

Мы хотим рассчитать p-значение, вероятность первоначального наблюдаемого результата, если они не связаны между двумя переменными.

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

Давайте сломаем это немного:

result >= (observedMeanDifference)

Создает логический вектор, например:

FALSE TRUE FALSE FALSE TRUE FALSE ...

С TRUE каждый раз значение result больше или равно observedMean .

mean функции будет интерпретировать этот вектор как 1 для TRUE и 0 для FALSE , и дать нам процент 1 в смеси, то есть количество раз, когда наша перетасованная векторная средняя разница превысила или сравнила то, что мы наблюдали.

Наконец, умножим на 2, потому что распределение нашей тестовой статистики очень симметрично, и мы действительно хотим знать, какие результаты «более экстремальные», чем наш наблюдаемый результат.

0.06093939 только вывести значение p, которое оказалось равным 0.06093939 . Интерпретация этого значения субъективна, но я бы сказал, что это похоже на то, что витамин С способствует росту зубов намного больше, чем апельсиновый сок.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow