Використання завантажувальної програми під H0 для проведення тесту на різницю двох засобів: заміна в межах груп або в об'єднаному зразку


18

Припустимо, у мене є дані з двома незалежними групами:

g1.lengths <- c (112.64, 97.10, 84.18, 106.96, 98.42, 101.66)

g2.lengths <- c (84.44, 82.10, 83.26, 81.02, 81.86, 86.80, 
                     85.84, 97.08, 79.64, 83.32, 91.04, 85.92,
                     73.52, 85.58, 97.70, 89.72, 88.92, 103.72,
                     105.02, 99.48, 89.50, 81.74)

group = rep (c ("g1", "g2"), c (length (g1.lengths), length (g2.lengths)))

lengths = data.frame( lengths = c(g1.lengths, g2.lengths), group)

Очевидно, що розмір вибірки на групу є упередженим, коли g1 має 6 спостережень, а g2 - 22 . Традиційна ANOVA припускає, що групи мають різні засоби, коли критичне значення встановлено на 0,05 (значення p становить 0,0044 ).

summary (aov (lengths~group, data = lengths))  

З огляду на те, що моя мета полягає в порівнянні середньої різниці, такі незбалансовані та малі вибіркові дані можуть дати невідповідні результати з традиційним підходом. Тому я хочу виконати тест на перестановку та завантажувальний інструмент.

ВИПУСКОВИЙ ТЕСТ

Нульова гіпотеза (H0) стверджує, що засоби групи однакові. Це припущення в перестановковому тесті є виправданим об'єднанням груп в один зразок. Це гарантує, що зразки для двох груп були взяті з однакового розподілу. Шляхом повторного відбору проб (а точніше - перестановки) зібраних даних спостереження перерозподіляються (перетасовуються) до зразків по-новому, і обчислюється статистика тесту. Виконавши це n разів, дасть вибіркове розподіл тестової статистики за припущенням, де H0 - ІСТИНА. Зрештою, під значенням H0 р значення - ймовірність того, що статистика тесту дорівнює або перевищує спостережуване значення.

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.p <- mean (g1.lengths) - mean (g2.lengths)
iterations <- 10000
sampl.dist.p <- NULL

set.seed (5)
for (i in 1 : iterations) {
        resample <- sample (c(1:length (pool)), length(pool))

        g1.perm = pool[resample][1 : s.size.g1]
        g2.perm = pool[resample][(s.size.g1+1) : length(pool)]
        sampl.dist.p[i] = mean (g1.perm) - mean (g2.perm) 
}
p.permute <- (sum (abs (sampl.dist.p) >= abs(obs.diff.p)) + 1)/ (iterations+1)

Повідомлене значення p тесту перестановки становить 0,0053 . Добре, якщо я це зробив правильно, перестановки та параметрична ANOVA дають майже однакові результати.

BOOTSTRAP

Перш за все, я знаю, що завантажувальна програма не може допомогти, коли розміри вибірки занадто малі. Цей пост показав, що це може бути ще гірше і вводити в оману . Крім того, другий підкреслював, що тест на перестановку, як правило, кращий, ніж завантажувальний, коли головна мета тестування гіпотез. Тим не менш, цей чудовий пост вирішує важливі відмінності між комп'ютерними методами. Однак тут я хочу поставити (я вважаю) інше питання.

Дозвольте спочатку представити найбільш поширений підхід до завантаження (Bootstrap1: перекомпонування в об'єднаному зразку ):

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.b1 <- mean (g1.lengths) - mean (g2.lengths)
iterations <- 10000
sampl.dist.b1 <- NULL

set.seed (5)
for (i in 1 : iterations) {
        resample <- sample (c(1:length (pool)), length(pool), replace = TRUE) 
        # "replace = TRUE" is the only difference between bootstrap and permutations

        g1.perm = pool[resample][1 : s.size.g1]
        g2.perm = pool[resample][(s.size.g1+1) : length(pool)]
        sampl.dist.b1[i] = mean (g1.perm) - mean (g2.perm) 
}
p.boot1 <- (sum (abs (sampl.dist.b1) >= obs.diff.b1) + 1)/ (iterations+1)

P значення завантажувальної програми, виконаної таким чином, становить 0,005 . Навіть якщо це здається розумним і майже ідентичним параметричному тесту ANOVA та перестановки, чи доречно виправдати H0 в цьому завантажувальному інструменті на основі того, що ми просто об'єднали зразки, з яких ми взяли наступні зразки?

Інший підхід я знайшов у кількох наукових працях. Зокрема, я бачив, що дослідники модифікують дані, щоб відповідати H0 перед початковим завантаженням. Шукаючи навколо, я знайшов дуже цікавий пост у CV де @ jan.s пояснив незвичні результати завантажувальної програми у запитанні до поста, де метою було порівняння двох способів. Однак у цій публікації не висвітлено, як виконати завантажувальну систему, коли дані змінюються перед завантажувальним завантаженням. Підхід, коли дані змінюються перед завантажувальним сценарієм, виглядає так:

  1. H0 стверджує, що засоби двох груп однакові
  2. H0 справедливо, якщо відняти окремі спостереження від середнього об'єднаного зразка

У цьому випадку модифікація даних повинна впливати на засоби групи, а отже, на їх різницю, але не на зміну в межах (і між) групами.

  1. Змінені дані будуть основою для подальшої завантажувальної програми, із застереженнями про те, що вибірки проводяться в межах кожної групи окремо .
  2. Різниця між середнім завантаженням g1 та g2 обчислюється та порівнюється із спостережуваною (немодифікованою) різницею між групами.
  3. Частка рівних або більш екстремальних значень, ніж спостерігається, поділена на кількість ітерацій, дасть значення p.

Ось код (Bootstrap2: переустановка в групах після модифікації, що H0 є ПРАВИЛЬНИМ ):

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.b2 <- mean (g1.lengths) - mean (g2.lengths)

# make H0 to be true (no difference between means of two groups)
H0 <- pool - mean (pool)

# g1 from H0 
g1.H0 <- H0[1:s.size.g1] 

# g2 from H0
g2.H0 <- H0[(s.size.g1+1):length(pool)]

iterations <- 10000
sampl.dist.b2 <- NULL

set.seed (5)
for (i in 1 : iterations) {
        # Sample with replacement in g1
        g1.boot = sample (g1.H0, replace = T)

        # Sample with replacement in g2
        g2.boot = sample (g2.H0, replace = T)

        # bootstrapped difference
        sampl.dist.b2[i] <- mean (g1.boot) - mean (g2.boot)  
}
p.boot2 <- (sum (abs (sampl.dist.b2) >= obs.diff.b2) + 1)/ (iterations+1)

Такий виконаний завантажувальний пристрій дасть значення р 0,514, що надзвичайно відрізняється порівняно з попередніми тестами. Я вважаю, що це стосується пояснення @ jan.s , але я не можу зрозуміти, де ключ ...


1
Цікава проблема і красиво представлена. У завантажувальній програмі є проблеми, коли розмір вибірки дуже малий лише тому, що, швидше за все, початковий зразок не дуже добре представляє популяцію. Розмір вибірки не повинен бути дуже великим, щоб завантажувальна машина працювала. Ваші розміри вибірки 6 і 22 можуть бути не такими поганими. У праці Ефрона (1983) завантажувальний інструмент порівнювали із формою резюме для оцінки частоти помилок лінійних дискримінантних функцій у класифікаційних задачах з 2 класами, де кожен розмір вибіркової підготовки менше 10. Про це я висвітлюю у своїй книзі Методи завантаження ( 2007).
Майкл Р. Черник

2
У моїй книзі також є розділ про те, коли завантажувальний запуск виходить з ладу, і він включає обговорення проблеми з невеликим розміром вибірки.
Майкл Р. Черник

Сингл рядки , які потрібно виправити в своїй початковій завантаження # 2 підходи , щоб зробити його роботу це одна: H0 <- pool - mean (pool). Його потрібно замінити на H0 <- c(g1.lengths - mean(g1.lengths), g2.lengths - mean(g2.lengths)). Тоді ви отримаєте p-значення 0,0023. (Це те саме, що пояснив Зеніт у своїй відповіді.) Це все, що є, просто проста помилка в коді. CC до @MichaelChernick
амеба каже

чи могли б ці методи перемогти? Я маю на увазі, чи могли вони визначити будь-яку різницю як істотну, коли групи дуже великі: пул> 43k.
Алекс Альварес Перес

Відповіді:


17

Ось мій погляд на це, заснований на главі 16 « Вступ до завантажувальної програми Ефрона та Тібшірані» (стор. 220-224). Мало того, що ваш другий алгоритм завантаження був реалізований неправильно, але загальна ідея правильна.

Проводячи тести завантаження, потрібно переконатися, що метод повторної вибірки генерує дані, що відповідають нульовій гіпотезі. Я буду використовувати дані сну в R для ілюстрації цієї публікації. Зауважимо, що я використовую студизовану статистику тесту, а не просто різницю засобів, яку рекомендує підручник.

Класичний t-тест, в якому використовується аналітичний результат для отримання інформації про розподіл вибірки t-статистики, дає такий результат:

x <- sleep$extra[sleep$group==1] y <- sleep$extra[sleep$group==2]
t.test(x,y)
t = -1.8608, df = 17.776, p-value = 0.07939

н1н2

# pooled sample, assumes equal variance
pooled <- c(x,y)
for (i in 1:10000){
  sample.index <- sample(c(1:length(pooled)),replace=TRUE)
  sample.x <- pooled[sample.index][1:length(x)]
  sample.y <- pooled[sample.index][-c(1:length(y))]
  boot.t[i] <- t.test(sample.x,sample.y)$statistic
}
p.pooled <-  (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1) 
p.pooled
[1] 0.07929207

Н0Н0Н0z¯

х~i=хi-х¯+z¯
у~i=уi-у¯+z¯

х~/у~z¯Н0

# sample from H0 separately, no assumption about equal variance
xt <- x - mean(x) + mean(sleep$extra) #
yt <- y - mean(y) + mean(sleep$extra)

boot.t <- c(1:10000)
for (i in 1:10000){
  sample.x <- sample(xt,replace=TRUE)
  sample.y <- sample(yt,replace=TRUE)
  boot.t[i] <- t.test(sample.x,sample.y)$statistic
}
p.h0 <-  (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1)  # 
p.h0
[1] 0.08049195

На цей раз ми закінчилися аналогічними значеннями p для трьох підходів. Сподіваюся, це допомагає!


1
Чи будете ви добрими і поясніть, чому "1" було додано до наступного: (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1)замість чогось такого: mean(abs(boot.t) > abs(t.test(x,y)$statistic))Дякую за ваш час.
TG_Montana

+1. Чи має цей підхід завантажуваного на модифіковані дані-до-зразка від-H0 конкретну назву?
амеба каже, що повернеться до Моніки

3
Н0p-vалуе=кількість разів {т>тобс}ББ

@amoeba: Я не впевнений, що ця процедура має офіційну чи узгоджену назву, але, мабуть, її можна охарактеризувати як тест завантаження на рівність засобів , а не розподіл . Сторінка, що показує повну процедуру, відсутня в книгах google , але її мотивація відображається на сторінці 223. Ще один її опис можна знайти в цих примітках на сторінці 13 ( galton.uchicago.edu/~eichler/stat24600/Handouts/bootstrap. pdf ).
Зеніт

(+1) Відмінна відповідь. Не могли б ви пояснити, чому "цей алгоритм [перекомпонування самих даних без центрування] насправді перевіряє, чи розподіл x і y однакові"? Я розумію, що ця стратегія перекомпонування гарантує, що розподіли однакові, але чому вона перевіряє, що вони однакові?
півзахист
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.