Який статистичний тест використовувати для тесту A / B?


12

У нас є дві когорти по 1000 зразків кожна. Ми вимірюємо 2 кількості в кожній когорті. Перший - це двійкова змінна. Другий - це дійсне число, яке слід за важким розподілом хвоста. Ми хочемо оцінити, яка когорта найкраще відповідає кожній метриці. Існує велика кількість статистичних тестів на вибір: люди пропонують z-тест, інші використовують t-тест, а інші Манн-Вітні У.

  • Який тест або тести слід вибрати для кожної метрики для нашого випадку?
  • Що відбувається, якщо один тест передбачає значну різницю між колегами, а інший тест припускає незначну різницю?

Відповіді:


12

З огляду на те, що ваші дві метрики є 1) двійковими та 2) великими хвостами, вам слід уникати t-тесту, який передбачає нормальні розподіли.

Я думаю, що Mann-Whitney U - ваш найкращий вибір, і він повинен бути достатньо ефективним, навіть якщо ваші дистрибуції були майже нормальними.

Щодо вашого другого питання:

Що відбувається, якщо один тест передбачає значну різницю між колегами, а інший тест припускає незначну різницю?

Це не рідкість, якщо статистична різниця є прикордонною, і дані мають "брудний" вибірковий розподіл. Ця ситуація вимагає від аналітика уважно розглянути всі припущення та обмеження кожного статистичного тесту і надати найбільшу вагу статистичному тесту, який має найменшу кількість порушень припущень.

Візьмемо припущення про нормальний розподіл. Існують різні тести на нормальність, але це ще не кінець історії. Деякі тести працюють досить добре на симетричних розподілах, навіть якщо є деякі відхилення від нормальності, але вони не працюють добре на перекоси.

Як правило, я пропоную вам не проводити жодного тесту, коли будь-яке його припущення явно порушено.

EDIT: Для другої змінної може бути можливим перетворити змінну в ту, яка зазвичай розподіляється (або принаймні закривається), доки перетворення зберігає порядок. Вам потрібно бути впевненим, що перетворення дає нормальний розподіл для обох груп. Якщо ви помістите другу змінну до нормального розподілу log, тоді функція журналу перетворює її в звичайний розподіл. Але якщо розподіл - Парето (закон про владу), то перетворення до нормального розподілу не відбувається.

EDIT: Як пропонується в цьому коментарі , вам слід неодмінно розглянути байєсівську оцінку як альтернативу t-тестуванню та іншим тестуванням значущості гіпотези (NHST).


Дякую за інформацію. Мені було недостатньо зрозуміло, у мене є дві величини, одна з яких - двійкова, а інша - це реальна кількість після важкого розподілу хвоста. Я відредагував питання, щоб уточнити це.
iliasfl

Так, я думаю, я розумію. Ви хочете запустити тест двічі, один раз на двійковій змінній та один раз на реальній змінній (важкий хвостовий розподіл). Я рекомендую запустити Mann-Whitney U для обох.

Чому б Ман-Вітні був придатний для двійкових даних?
Glen_b -Встановіть Моніку

Ман-Вітні U ефективний для не нормальних розподілів, включаючи дискретні розподіли з двома значеннями (тобто двійкові). Якби всі дані були двійковими, то, можливо, інший тест працював би краще.
MrMeritology

Чи може хтось підтвердити, чи це правда? ...

7

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

Для ваших реальних цінностей ви зробите наступне:

  1. Об’єднайте свої дві когорти.
  2. З пулу виберіть дві групи з 1000 елементів із заміною.
  3. Обчисліть різницю середньої вибірки між двома групами.
  4. Повторіть кроки 2 і 3 кілька тисяч разів, щоб розробити розподіл цих відмінностей.

Як тільки ви отримаєте такий розподіл, обчисліть різницю в засобах для фактичних вибірок та обчисліть p-значення.


Дякую, тому ви закінчите розподіл, який має бути нормальним з деяким середнім і стандартним відхиленням. Як би ви обчислили значення р з цього, а може бути і довірчі інтервали, щоб визначити переможця (якщо такий є)?
iliasfl

Розподіл не обов'язково було б нормальним. Він мав би приблизно розподіл того, з чого він був відібраний. У цьому полягає краса використання завантажувального пристрою. У будь-якому випадку ви отримуєте p-значення, обчислюючи свою тестову статистику від фактичних результатів. Тобто різниця засобів кожної групи. Потім порівняйте це число з розподілом. Отриманий відсоток - це ваше р-значення для однобічного тесту на різницю середнього значення.
Натан Гулд

4
Те, що описує Натан, також є основою для байєсівських методів перевірки значущості. Я використав (і зараз використовую) байєсівську оцінку замінює підхід T-Test (BEST). Ви повинні подивитися на цю рамку, якщо ви плануєте реалізувати підхід до об'єднання.
cwharland

0

Я друга @ відповідь MrMeritology. Насправді мені було цікаво, чи буде тест MWU менш потужним, ніж тест незалежних пропорцій, оскільки підручники, з яких я навчився та використовував для навчання, говорили, що MWU можна застосовувати лише до порядкових (або інтервальних / відносних) даних.

Але мої результати моделювання, наведені нижче, вказують на те, що тест MWU насправді трохи потужніший, ніж тест на пропорцію, при цьому добре контролюючи помилку типу I (при частці населення групи 1 = 0,50).

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

Частка населення 2 групи зберігається на рівні 0,50. Кількість ітерацій - 10 000 в кожній точці. Я повторив моделювання без корекції Yate, але результати були однакові.

library(reshape)

MakeBinaryData <- function(n1, n2, p1){
  y <- c(rbinom(n1, 1, p1), 
        rbinom(n2, 1, 0.5))
  g_f <- factor(c(rep("g1", n1), rep("g2", n2)))
  d <- data.frame(y, g_f)
  return(d)
}

GetPower <- function(n_iter, n1, n2, p1, alpha=0.05, type="proportion", ...){
  if(type=="proportion") {
    p_v <- replicate(n_iter, prop.test(table(MakeBinaryData(n1, n1, p1)), ...)$p.value)
  }

  if(type=="MWU") {
    p_v <- replicate(n_iter, wilcox.test(y~g_f, data=MakeBinaryData(n1, n1, p1))$p.value)
  }

  empirical_power <- sum(p_v<alpha)/n_iter
  return(empirical_power)
}

p1_v <- seq(0.5, 0.6, 0.01)
set.seed(1)
power_proptest <- sapply(p1_v, function(x) GetPower(10000, 1000, 1000, x))
power_mwu <- sapply(p1_v, function(x) GetPower(10000, 1000, 1000, x, type="MWU"))

Ваша фотографія результату - все чорна
Ooker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.