Яку реалізацію тесту перестановки використовувати в R замість t-тестів (парних та непарних)?


56

У мене є дані експерименту, які я аналізував, використовуючи t-тести. Залежна змінна масштабується за інтервалом, і дані є непарними (тобто, 2 групи) або парними (тобто, в межах суб'єктів). Напр. (В межах предметів):

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

Однак дані не є нормальними, тому один рецензент попросив нас використовувати щось інше, ніж t-тест. Однак, як легко можна побачити, дані не лише нормально розподіляються, але і розподіли не рівні між умовами: alt текст

Тому звичайні непараметричні тести, Ман-Вітні-U-тест (непарний) та тест Вілкоксона (парні), не можуть бути використані, оскільки вони вимагають рівного розподілу між умовами. Отже, я вирішив, що найкращим є тест на перестановку чи перестановку.

Тепер я шукаю R-реалізацію еквівалента, заснованого на перестановці t-тесту, або будь-яку іншу пораду, що робити з даними.

Я знаю, що є деякі R-пакети, які можуть зробити це для мене (наприклад, монета, perm, точноRankTest тощо), але я не знаю, який вибрати. Отже, якщо хтось із певним досвідом використання цих тестів міг би дати мені початок, це було б ubercool.

ОНОВЛЕННЯ: Було б ідеально, якби ви могли надати приклад того, як повідомити результати цього тесту.

Відповіді:


43

Це не має значення, оскільки статистика тесту завжди буде різницею в засобах (або щось еквівалентне). Невеликі відмінності можуть виникнути від впровадження методів Монте-Карло. Спробуйте три пакети з вашими даними однобічним тестом для двох незалежних змінних:

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
library(coin)                    # for oneway_test(), pvalue()
pvalue(oneway_test(DV ~ IV, alternative="greater", 
                   distribution=approximate(B=9999)))
[1] 0.00330033

library(perm)                    # for permTS()
permTS(DV ~ IV, alternative="greater", method="exact.mc", 
       control=permControl(nmc=10^4-1))$p.value
[1] 0.003

library(exactRankTests)          # for perm.test()
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.003171822

Щоб перевірити точне значення p за допомогою ручного обчислення всіх перестановок, я обмежу дані першими 9 значеннями.

x1 <- x1[1:9]
y1 <- y1[1:9]
DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
pvalue(oneway_test(DV ~ IV, alternative="greater", distribution="exact"))
[1] 0.0945907

permTS(DV ~ IV, alternative="greater", exact=TRUE)$p.value
[1] 0.0945907

# perm.test() gives different result due to rounding of input values
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.1029412

# manual exact permutation test
idx  <- seq(along=DV)                 # indices to permute
idxA <- combn(idx, length(x1))        # all possibilities for different groups

# function to calculate difference in group means given index vector for group A
getDiffM <- function(x) { mean(DV[x]) - mean(DV[!(idx %in% x)]) }
resDM    <- apply(idxA, 2, getDiffM)  # difference in means for all permutations
diffM    <- mean(x1) - mean(y1)       # empirical differencen in group means

# p-value: proportion of group means at least as extreme as observed one
(pVal <- sum(resDM >= diffM) / length(resDM))
[1] 0.0945907

coinі exactRankTestsобидва є одним і тим же автором, але coinздається більш загальним і обширним - також з точки зору документації. exactRankTestsбільше не активно розвивається. Тому я б обрав coin(також через такі інформативні функції support()), якщо ви не любите мати справу з об'єктами S4.

EDIT: для двох залежних змінних синтаксис є

id <- factor(rep(1:length(x1), 2))    # factor for participant
pvalue(oneway_test(DV ~ IV | id, alternative="greater",
                   distribution=approximate(B=9999)))
[1] 0.00810081

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

10
(+1) Не дивно, що (непарний) t-тест дає по суті те ж р-значення, 0,000349. Незважаючи на те , що сказав рецензент, т-тест є придатним до цих даних. Причина полягає в тому, що розподіл вибірки засобів є приблизно нормальним, навіть якщо розподіл даних не є. Більше того, як видно з результатів, t-тест насправді є більш консервативним, ніж тест на перестановку. (Це означає, що значущий результат за допомогою t-тесту вказує на тест перестановки, ймовірно, також буде значним.)
whuber

2
@Henrik Для певних ситуацій (вибраний тест та чисельна складність) coinдійсно можна розрахувати точний розподіл перестановки (не фактично переживаючи всі перестановки, є більш елегантні алгоритми, ніж це). Враховуючи вибір, точний розподіл здається кращим, але різниця у наближенні Монте-Карло з великою кількістю повторень повинна бути невеликою.
каракал

1
@Caracal Дякую за пояснення. Залишається одне питання: дані, які я представив, є парними. Отже, мені потрібен еквівалент парного t-тесту. Чи oneway_testточна функція? І якщо так, то який з них є правильним для непарних даних?
Генрік

2
@Henrik coinАвтор написав мені, що oneway_test()не може обчислити точний розподіл на залежний випадок, вам потрібно пройти з наближенням MC ( wilcoxsign_test()підходить тільки для точного тесту). Я цього не знав і вважаю за краще помилку в цьому випадку, але МС повинен бути досить точним з великою кількістю реплік.
каракал

29

Кілька коментарів, я вважаю, в порядку.

1) Я б закликав вас спробувати декілька візуальних показів ваших даних, оскільки вони можуть фіксувати речі, втрачені гістограмами (як графіки), а також я настійно рекомендую розміщувати зображення на осях. У цьому випадку я не вірю, що гістограми дуже добре справляються із передачею важливих особливостей ваших даних. Наприклад, погляньте на боксові бокси:

boxplot(x1, y1, names = c("x1", "y1"))

alt текст

Або навіть бічні смужки:

stripchart(c(x1,y1) ~ rep(1:2, each = 20), method = "jitter", group.names = c("x1","y1"), xlab = "")

alt текст

Подивіться на центри, розвороти та форми цих! Приблизно три чверті даних падають набагато вище медіани даних . Розкид невеликий, тоді як розкид величезний. І і є сильнокосими, але по-різному. Наприклад, має п'ять (!) Повторених значень нуля.y 1 x 1 y 1 x 1 y 1 y 1x1y1x1y1x1y1y1

2) Ви не пояснили дуже детально, звідки беруться ваші дані, і як їх вимірювали, але ця інформація дуже важлива, коли настає час вибору статистичної процедури. Чи є ваші два зразки вище незалежними? Чи є підстави вважати, що граничні розподіли двох зразків повинні бути однаковими (крім, наприклад, різниці в розташуванні)? Які міркування перед дослідженням змусили вас шукати докази різниці між двома групами?

3) Тест t не підходить для цих даних, оскільки граничні розподіли помітно ненормальні, з екстремальними значеннями в обох вибірках. Якщо вам подобається, ви можете звернутися до CLT (завдяки вашому зразку середнього розміру), щоб використовувати -test (що було б подібним до z-тесту для великих зразків), але з огляду на хиткість (в обох змінних) за вашими даними, я б не вважав таке звернення дуже переконливим. Звичайно, ви можете скористатися ним у будь-якому випадку для обчислення значення значення, але що це робить для вас? Якщо припущення не задовольняються, то -значення - лише статистика; це не говорить про те, що ви (мабуть) хочете знати: чи є докази того, що два зразки походять з різних розподілів.p pzpp

4) Тест на перестановку також буде недоцільним для цих даних. Єдине і часто недооцінене припущення для тестів на перестановку полягає в тому, що обидва зразки можна обміняти під нульовою гіпотезою. Це означало б, що вони мають однакові граничні розподіли (під нуль). Але ви в біді, тому що графіки припускають, що розподіли відрізняються і за місцем розташування, і за масштабом (і за формою). Таким чином, ви не можете (дійсно) перевірити на різницю в розташуванні, оскільки масштаби різні, і ви не можете (дійсно) перевірити на різницю в масштабі, оскільки місця розташування різні. На жаль Знову ж таки, ви можете зробити тест у будь-якому випадку і отримати -значення, але що робити? Що ви насправді здійснили?p

5) На мій погляд, ці дані є ідеальним (?) Прикладом того, що вдало обрана картина коштує 1000 тестів гіпотези. Нам не потрібна статистика, щоб визначити різницю між олівцем і коморою. Відповідним твердженням, на мою думку, для цих даних було б "Ці дані виявляють помітні відмінності щодо місця розташування, масштабу та форми". Ви можете скористатися (надійною) описовою статистикою для кожного з них, щоб кількісно визначити відмінності та пояснити, що означають відмінності в контексті вашого початкового дослідження.

6) Ваш рецензент, ймовірно (і , до жаль) наполягатиме на якому - то -значення в якості попередньої умови для публікації. Зітхніть! Якби це я, враховуючи відмінності щодо всього, я б, ймовірно, використовував непараметричний тест Колмогорова-Смірнова, щоб виплюнути -значення, яке демонструє, що розподіли різні, а потім продовжувати описову статистику, як описано вище. Вам потрібно буде додати трохи шуму до двох зразків, щоб позбутися зв’язків. (І звичайно, все це передбачає, що ваші зразки є незалежними, про які ви не вказали прямо.)рpp

Ця відповідь набагато довша, ніж я спочатку задумував. Вибач за те.


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

2
(+1) Хороший аналіз. Ви абсолютно праві, що результати очевидні і не потрібно натискати на точку з р-значенням. Ви можете бути трохи крайнім у своєму твердженні про (3), оскільки t-тест не вимагає нормально розподілених даних. Якщо вас турбує, існують коригування похилості (наприклад, варіант Чена): ви могли бачити, чи змінює значення р для коригуваного тесту відповідь. Якщо ні, ви, ймовірно, добре. У цій конкретній ситуації з цими (сильно перекошеними) даними t-тест працює чудово.
whuber

(+1) Приємний улов! І дуже хороші коментарі.
chl

Ми, здається, приймаємо думку про те, що базовий розподіл "схожий" на випадкову інстанцію. Тож не можна було поставити питання: чи є вони обидва з бета-версії (0,25, 0,25), і тест був би, чи мають вони однаковий параметр центральності (не). І чи не це виправдає використання тесту на перестановку чи Вілкоксона?
DWin

4
Тут є багато корисної інформації, але вона дуже сильно сформульована і змішана з / деякими речами, які не мають для мене особливого сенсу. Наприклад, повторно # 3, моє розуміння співвідношення b / t z-test і t-тест полягає в тому, що вони по суті однакові, але z використовується, коли відомий SD a-priori & t використовується, коли SD оцінюється за даними. Я не бачу, як якщо CLT гарантує нормальність відбору проб, це ліцензує z-тест, залишаючи t-тест недійсним. Я також не думаю, що SD недійсний t, якщо CLT охоплює вас, якщо використовується коригування (наприклад, Welch – Satterthwaite).
gung - Відновіть Моніку

5

Мої коментарі стосуються не впровадження тесту на перестановку, а щодо більш загальних питань, порушених цими даними, та їх обговорення, зокрема публікації Дж. Джея Кернса.

Два розподіли насправді виглядають досить схожими на мене ВІДКЛЮЧНО для групи 0 в Y1, які сильно відрізняються від інших спостережень у цьому зразку (наступний найменший - приблизно 50 за шкалою 0-100), а також усіх, що знаходяться в X1. Я б спершу дослідив, чи було щось інше в цих спостереженнях.

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


Здається, що це має бути один чи більше коментарів, а не відповідь. Якщо натиснути маленький сірий "додати коментар", ви можете розмістити свої думки в бесіді під запитанням або конкретною відповіддю, де вони належать. Ви робите суттєві моменти тут, але незрозуміло, що це не відповідне місце для них.
gung - Відновіть Моніку

1
@gung Щоб опублікувати коментар, потрібно трохи репутації ;-).
whuber

4
Це хороший момент щодо застосування тесту на перестановку. Щодо очевидності різниці між групами, можливо, це питання досвіду :-). Для інтуїції, оскільки очевидно, що ключова відмінність полягає в малих значеннях, ми можемо запитати про шанси того, що сім найменших у наборі з 40 значень трапилося в одну випадкову підмножину 20. Приблизно кожен має приблизно 1/2 шанс опинитися в підмножині або її доповнення, тому всі семеро будуть в одній групі з шансами приблизно . Ця ментальна арифметика забезпечує швидке початкове керівництво. 2(1/2)7.01
whuber

4

Оскільки це запитання з’явилося знову, я можу додати ще одну відповідь, натхненну недавньою публікацією в блозі через R-Bloggers від Роберта Кабакоффа, автора програми Quick-R і R в дії, що використовує lmPermпакет.

Однак цей метод дає різко контрастні (і дуже нестабільні) результати до результатів, отриманих coinпакетом у відповіді @caracakl (р-значення аналізу в рамках суб'єктів 0.008). Аналіз бере також підготовку даних з відповіді @ caracal:

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
id <- factor(rep(1:length(x1), 2)) 

library(lmPerm)

summary(aovp( DV ~ IV + Error(id)))

виробляє:

> summary(aovp( DV ~ IV + Error(id)))
[1] "Settings:  unique SS "

Error: id
Component 1 :
          Df R Sum Sq R Mean Sq
Residuals 19    15946       839


Error: Within
Component 1 :
          Df R Sum Sq R Mean Sq Iter Pr(Prob)  
IV         1     7924      7924 1004    0.091 .
Residuals 19    21124      1112                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Якщо це запустити кілька разів, значення p перестрибує між ~ .05 та ~ .1.

Хоча це відповідь на запитання, дозвольте мені поставити питання в кінці (я можу перенести це питання на нове запитання за бажанням):
Будь-які ідеї того, чому цей аналіз настільки нестабільний і чи призводять до настільки відмінних p-значень аналіз монети? Я щось не так зробив?


2
Це може бути краще задати це окремим питанням, якщо це дійсно питання, на яке ви хочете відповісти, а не інше можливе рішення, яке ви хочете перерахувати з іншими. Я помічаю, що ви вказуєте прошарки помилок, але @caracal цього не робить; це моє перше здогадка про різницю б / т цього виходу та його. Крім того, під час моделювання значення зазвичай стрибають; для відтворення ви вказуєте насіння, наприклад set.seed(1); для більшої точності в оцінці МС ви збільшуєте кількість ітерацій; Я не впевнений, чи хтось із них є «правильною» відповіддю на ваше запитання, але вони, ймовірно, є актуальними.
gung - Відновіть Моніку

2
Знову пропоную зіставити результати МС порівняно з ручними обчисленнями, використовуючи повний тест на перестановку (повторну рандомізацію). Дивіться код вашого прикладу для порівняння oneway_anova()(завжди близький до правильного результату) та aovp()(як правило, далеко від правильного результату). Я не знаю, чому aovp()дає дивовижні результати, але принаймні для цього випадку вони є малоймовірними. @gung в останньому дзвінку oneway_test(DV ~ IV | id, ...)в моїй оригінальній відповіді вказав прошарки помилок для залежного випадку (інший синтаксис, ніж використаний aov()).
каракал

@caracal, ти маєш рацію. Я не переглянув останній блок коду після редагування. Я дивився на верхній блок коду - неохайний з мого боку.
gung - Відновіть Моніку

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

1
@Henrik запустити aovp з maxExact = 1000. Якщо це зайняло занадто багато часу, встановіть iter = 1000000 і Ca = 0,001. Розрахунок припиняється, коли розрахункова стандартна похибка p менша Ca * p. (Нижчі значення дають більш стабільні результати.)
xmjx

1

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


Оцінки - це не пропорції, а оцінки учасників за шкалою від 0 до 100 (представлені дані - це засоби оцінки кількох предметів із цією шкалою).
Генрік

Тоді непараметричні дані здадуться традиційним шляхом. З цього приводу я замислювався про те, чи можна корисно зробити такі масштабні дані для отримання біноміального процесу і тим самим проаналізованого як такого. Тобто, ви кажете, що кожен бал - це середнє значення для кількох предметів, і скажімо, кожен предмет - це 10-бальна шкала, і в такому випадку я б представляв відповідь, скажімо, "8" як серія випробувань, 8 з які мають значення 1 і два з яких мають значення 0, усі вони позначені однаковою міткою в змінній "item". За допомогою цих розширених / біноміальних даних ви можете потім обчислити біноміальну модель змішаних ефектів.
Майк Лоуренс

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

0

Просто додати ще один підхід, ezPermв ezупаковці:

> # preparing the data
> DV <- c(x1, y1)
> IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
> id <- factor(rep(1:length(x1), 2))
> df <- data.frame(id=id,DV=DV,IV=IV)
>
> library(ez)
> ezPerm( data = df, dv = DV, wid = id, within = IV, perms = 1000)
|=========================|100%              Completed after 17 s 
  Effect     p p<.05
1     IV 0.016     *

Це , як видається, відповідає до oneway_testв coinупаковці:

> library(coin)
> pvalue(oneway_test(DV ~ IV | id,  distribution=approximate(B=999999)))
[1] 0.01608002
99 percent confidence interval:
 0.01575782 0.01640682

Однак зауважте, що це не той самий приклад, який надає @caracal . У своєму прикладі, він включає в себе alternative="greater", тому різниця в р-значний ~0.008проти ~0.016.

aovpПакет пропонується в один з відповідей виробляють підозріло низький р-значення, і працює підозріло швидко , навіть коли я намагаюся високими значеннями для Iter, Caі maxIterаргументів:

library(lmPerm)
summary(aovp(DV ~ IV + Error(id/IV), data=df,  maxIter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Iter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Ca = 0.00000000001))

Зважаючи на це, аргументи, здається, трохи зменшують відхилення значень p від ~.03і ~.1(я отримав більший діапазон, ніж повідомляється @Henrik), до 0.03та 0.07.

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