Як можна зробити SS-ANOVA типу III в R з контрастними кодами?


26

Надайте код R, який дозволяє проводити ANOVA між суб'єктами з -3, -1, 1, 3 контрастами. Наскільки я розумію, існує дискусія щодо відповідного типу суми квадратів (СС) для такого аналізу. Однак як стандартний тип SS, що використовується в SAS та SPSS (тип III), вважається стандартом у моїй області. Тому я хотів би, щоб результати цього аналізу повністю відповідали тому, що створюється цими програмами статистики. Щоб прийняти відповідь, потрібно безпосередньо зателефонувати aov (), але за інші відповіді можна проголосувати (особливо, якщо їх легко зрозуміти / використовувати).

sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))

Редагувати: Зверніть увагу: контраст, який я вимагаю, не є простим лінійним чи поліноміальним контрастом, а є контрастом, отриманим за допомогою теоретичного передбачення, тобто типу контрастів, обговорених Розенталем та Росновом.


5
Я розумію, що вам потрібна сума III типу, але ця стаття ( stats.ox.ac.uk/pub/MASS3/Exegeses.pdf ) - це добре прочитане. Це ілюструє деякі цікаві моменти.
suncoolsu

Щодо вашого питання, можливо, вас зацікавить наступна дискусія: stats.stackexchange.com/questions/60362/… Вибір між ANOVA типу I, II та III не такий простий, як здається.
phx

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

@DWin: Я не впевнений, що цілком слідкую за тобою. Можна законно використовувати інші типи СС, не дозволяючи «машині робити водіння» (принаймні, наскільки я розумію цю фразу). Я, можливо, тут трохи іржавий, але якщо пам'ять служить, інші типи можуть бути актуальними, коли не використовується часткова регресія. Наприклад, тип III СС не розмежовує основні ефекти від взаємодії. Відмінність типів має значення саме тому, що тип III не частковий, тоді як тип I. Описана проблема включала лише один контраст, і тому розрізнення типів СС було / є суперечливим.
russellpierce

Я розумів, що обгрунтування, яке надає SAS для вибору типу III SSS (і, мабуть, тому люди вважають, що тип III є кращим), це те, що він краще підтримує процес відбору назад і вперед.
DWin

Відповіді:


22

Сума квадратів типу III для ANOVA легко доступна за допомогою Anova()функції автомобіля пакета.

Контраст кодування може бути зроблено декількома способами, використовуючи C(), в contr.*сім'ю (як зазначено @nico), або безпосередньо contrasts()функції / аргумент. Про це детально йдеться в § 6.2 (с. 144-151) сучасної прикладної статистики з S (Springer, 2002, 4 видання). Зауважте, що aov()це лише функція обгортки для lm()функції. Цікаво, коли хочеться керувати терміном помилки моделі (як у внутрішній темі), але в іншому випадку вони дають однакові результати (і як би ви не підходили до вашої моделі, ви все одно можете виводити ANOVA або LM- як зведення з summary.aovабо summary.lm).

У мене немає SPSS для порівняння двох результатів, але щось подібне

> library(car)
> sample.data <- data.frame(IV=factor(rep(1:4,each=20)),
                            DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))
> Anova(lm1 <- lm(DV ~ IV, data=sample.data, 
                  contrasts=list(IV=contr.poly)), type="III")
Anova Table (Type III tests)

Response: DV
            Sum Sq Df F value    Pr(>F)    
(Intercept)  18.08  1  21.815  1.27e-05 ***
IV          567.05  3 228.046 < 2.2e-16 ***
Residuals    62.99 76                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

варто спробувати в першій інстанції.

Про кодування коефіцієнтів у R проти SAS: R розглядає базовий рівень або еталонний рівень як перший рівень у лексикографічному порядку, тоді як SAS вважає останнім. Отже, щоб отримати порівнянні результати, вам потрібно використовувати contr.SAS()або relevel()ваш R-фактор.


1
Я не думаю, що ця відповідь використовує контраст -3, -1,1,3, який я вказав, і, здається, не забезпечує тест на контраст 1 df.
russellpierce

@drknexus Так, ти маєш рацію. Написали занадто швидко. Щось на кшталт Anova(lm(DV ~ C(IV, c(-3,-1,1,3),1), data=sample.data), type="III")має бути краще. Будь ласка, дайте мені знати, якщо з вами це гаразд.
chl

Спасибі! Це добре виглядає, я завтра підтверджую його щодо SPSS і повертаюся до вас.
russellpierce

1
До речі, подивіться на пакет ez ( cran.r-project.org/web/packages/ez/index.html ) для обгортання коду Anova ...
Тал Галілі

2
@drknexus: Якби тільки була сторінка із запитом на функції та проблемами подання питань для ez ... github.com/mike-lawrence/ez/isissue :)
Майк Лоуренс

11

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

> sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))
> sample.aov <- aov(DV ~ factor(IV), data = sample.data)

> library("lsmeans")
> (sample.lsm <- lsmeans(sample.aov, "IV"))
 IV    lsmean        SE df   lower.CL  upper.CL
  1 -3.009669 0.2237448 76 -3.4552957 -2.564043
  2 -3.046072 0.2237448 76 -3.4916980 -2.600445
  3  1.147080 0.2237448 76  0.7014539  1.592707
  4  3.049153 0.2237448 76  2.6035264  3.494779

> contrast(sample.lsm, list(mycon = c(-3,-1,1,3)))
 contrast estimate       SE df t.ratio p.value
 mycon    22.36962 1.000617 76  22.356  <.0001

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

> con <- contrast(sample.lsm, "poly")
> con
 contrast   estimate        SE df t.ratio p.value
 linear    22.369618 1.0006172 76  22.356  <.0001
 quadratic  1.938475 0.4474896 76   4.332  <.0001
 cubic     -6.520633 1.0006172 76  -6.517  <.0001

Щоб підтвердити це, зауважте, що "poly"специфікація спрямовує його на виклик poly.lsmc, який дає такі результати:

> poly.lsmc(1:4)
  linear quadratic cubic
1     -3         1    -1
2     -1        -1     3
3      1        -1    -3
4      3         1     1

Якщо ви хочете зробити спільний тест з декількох контрастів, використовуйте testфункцію з joint = TRUE. Наприклад,

> test(con, joint = TRUE)

Це дасть тест "типу III". На відміну від цього car::Anova(), він буде робити це правильно незалежно від контрного кодування, що використовується на етапі встановлення моделі. Це пояснюється тим, що лінійні функції, що тестуються, задаються безпосередньо, а не неявно за допомогою зменшення моделі. Додатковою особливістю є те, що виявляється випадок, коли контрасти, що випробовуються, лінійно залежні, і виходить правильна статистика тесту та ступінь свободи.


10

Ви можете переглянути цю публікацію в блозі:

Отримання таких же результатів ANOVA в R, як і в SPSS - труднощі з сумою квадратів II та III типу

( Спойлер: додайте options(contrasts=c("contr.sum", "contr.poly"))на початку вашого сценарію)


Зверніть увагу на додаткову інформацію про спільне тестування у відповіді rvl.
rvl

7

Коли ви робите контрасти, ви робите конкретну заявлену лінійну комбінацію засобів комірки в контексті відповідного терміна помилки. Як таке, поняття "Тип СС" не має сенсу з контрастами. Кожен контраст по суті є першим ефектом, використовуючи SS I типу. "Тип СС" пов'язаний з тим, що частково викреслюється або враховується іншими умовами. Що стосується контрастів, то нічого не частково не враховується. Контраст стоїть сам по собі.


Ти абсолютно правий.
russellpierce

3

Те, що тести III типу використовуються на вашому місці роботи, є найслабшою причиною продовжувати їх використовувати. SAS завдав великої шкоди статистиці в цьому плані. Екзегеза Білла Венаблеса, на яку згадувалося вище, є чудовим ресурсом для цього. Просто скажіть "ні" типу III; він заснований на помилковому уявленні про рівновагу і має меншу потужність через нерозумне зважування клітин у незбалансованому випадку.

Функція rmsпакету R забезпечується більш природним і менш схильним до помилок способом отримати загальні контрасти та бути в змозі описати, що ви робили contrast.rms. Контрасти можуть бути дуже складними, але для користувача дуже прості, оскільки вони констатуються з точки зору відмінностей у прогнозних значеннях. Тести та одночасні контрасти підтримуються. Це обробляє нелінійні ефекти регресії, нелінійні ефекти взаємодії, часткові контрасти, всілякі речі.


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

Люди, які справді добре володіють даними, мають широкий вибір робочих місць і можуть мати можливість працювати в сферах, де їх навички та думка дотримуються.
Френк Харрелл

1
... і це я зараз роблю. Але люди, які стикаються з цим питанням, часто не будуть з цього класу. Так само, як я не був 7 років тому. Я лише виступаю за трохи співпереживання новачка та їхніх обставин.
russellpierce

2

Спробуйте команду Anova в бібліотеці автомобілів. Використовуйте аргумент type = "III", оскільки він за замовчуванням відповідає типу II. Наприклад:

library(car)
mod <- lm(conformity ~ fcategory*partner.status, data=Moore, contrasts=list(fcategory=contr.sum, partner.status=contr.sum))
Anova(mod, type="III")

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

0

Також саморекламуючись, я написав функцію саме для цього: https://github.com/samuelfranssens/type3anova

Встановіть так:

library(devtools)
install_github(samuelfranssens/type3anova)
library(type3anova)

sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))

type3anova(lm(DV ~ IV, data = sample.data))

Також вам потрібно буде встановити carпакет.


Як би ви застосували це до контрастної частини питання?
russellpierce

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