Come si fa un SS ANOVA di tipo III in R con codici di contrasto?


26

Fornisci il codice R che ti permette di condurre un ANOVA tra soggetti con -3, -1, 1, 3 contrasti. Comprendo che esiste un dibattito sull'appropriato tipo di somma dei quadrati (SS) per tale analisi. Tuttavia, poiché il tipo predefinito di SS utilizzato in SAS e SPSS (Tipo III) è considerato lo standard nella mia area. Quindi vorrei che i risultati di questa analisi corrispondessero perfettamente a ciò che viene generato da quei programmi statistici. Per essere accettata, una risposta deve chiamare direttamente aov (), ma altre risposte possono essere votate (espeicamente se sono facili da capire / usare).

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

Modifica: si noti che il contrasto che sto richiedendo non è un semplice contrasto lineare o polinomiale, ma è un contrasto derivato da una previsione teorica, ovvero il tipo di contrasti discussi da Rosenthal e Rosnow.


5
Comprendo che hai bisogno della somma di tipo III, ma questo articolo ( stats.ox.ac.uk/pub/MASS3/Exegeses.pdf ) è una buona lettura. Illustra alcuni punti interessanti.
suncoolsu,

Per quanto riguarda la tua domanda potresti essere interessato alla seguente discussione: stats.stackexchange.com/questions/60362/… La scelta tra ANOVA tipo I, II e III non è così facile come sembra.
phx,

La tua domanda è stata giudicata utile in quanto ha provocato diverse risposte apprese, ma noto anche che sei d'accordo con l'intervistato che ha sostanzialmente affermato che la premessa della domanda era errata. Spero di riassumere la posizione di StaGuy nel dire che i contrasti definiti erano per definizione "tipo I" e la discussione di altri tipi è diventata rilevante solo quando si valutano le statistiche di regressione parziale, presumibilmente più importanti quando si lascia "guidare la macchina" usando metodi automatizzati.
DWin,

@DWin: Non sono sicuro di seguirti interamente. Si possono legittimamente usare altri tipi di SS senza lasciare che la "macchina faccia la guida" (almeno se ho capito quella frase). Potrei essere un po 'arrugginito qui, ma se la memoria serve, altri tipi possono essere rilevanti quando non si usa la regressione parziale. Ad esempio, il Tipo III SS non parziale gli effetti principali dell'interazione. La distinzione tra i tipi è importante proprio perché il Tipo III non è parziale mentre il Tipo I lo fa. Il problema, come affermato, includeva un solo contrasto e quindi la distinzione tra i tipi di SS era / è discutibile.
Russellpierce,

La mia comprensione era che la logica fornita da SAS per la scelta del tipo SSS di tipo III (e questo sembra essere il motivo per cui la gente pensa che il tipo III sia preferito) è che supporta meglio il processo di selezione indietro e in avanti.
DWin,

Risposte:


22

La somma dei quadrati di tipo III per ANOVA è prontamente disponibile tramite la Anova()funzione dal pacchetto auto .

La codifica del contrasto può essere eseguita in diversi modi, usando C(), la contr.*famiglia (come indicato da @nico) o direttamente la contrasts()funzione / argomento. Questo è dettagliato in §6.2 (pagg. 144-151) delle moderne statistiche applicate con S (Springer, 2002, 4a ed.). Si noti che aov()è solo una funzione wrapper per la lm()funzione. È interessante quando si vuole controllare il termine di errore del modello (come in una progettazione entro-soggetto), ma in caso contrario entrambi producono gli stessi risultati (e qualunque sia il modo in cui si adatta il modello, è comunque possibile produrre ANOVA o LM- come riepiloghi con summary.aovo summary.lm).

Non ho SPSS per confrontare le due uscite, ma qualcosa del genere

> 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 

vale la pena provare in prima istanza.

Informazioni sulla codifica dei fattori in R vs. SAS: R considera il livello base o di riferimento come il primo livello in ordine lessicografico, mentre SAS considera l'ultimo. Quindi, per ottenere risultati comparabili, devi usare contr.SAS()o il relevel()tuo fattore R.


1
Non credo che questa risposta utilizzi il contrasto -3, -1,1,3 che ho specificato né sembra fornire un test 1 df del contrasto.
russellpierce,

@drknexus Sì, hai ragione. Scritto troppo in fretta. Qualcosa del genere Anova(lm(DV ~ C(IV, c(-3,-1,1,3),1), data=sample.data), type="III")dovrebbe essere migliore. Per favore fatemi sapere se questo ok con voi.
chl

Grazie! Sembra a posto, lo convaliderò contro SPSS domani e ti risponderò.
russellpierce,

1
A proposito, dai un'occhiata al pacchetto ez ( cran.r-project.org/web/packages/ez/index.html ) per racchiudere il codice Anova ...
Tal Galili,

2
@drknexus: Se solo ci fosse una richiesta di funzionalità e una pagina di presentazione dei problemi per ez ... github.com/mike-lawrence/ez/issues :)
Mike Lawrence,

11

Questo può sembrare un po 'di auto-promozione (e suppongo che lo sia). Ma ho sviluppato un pacchetto lsmeans per R (disponibile su CRAN) progettato per gestire esattamente questo tipo di situazione. Ecco come funziona per il tuo esempio:

> 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

Se lo desideri, puoi specificare ulteriori contrasti nell'elenco. Per questo esempio, otterrai gli stessi risultati con il contrasto polinomiale lineare incorporato:

> 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

Per confermare ciò, si noti che la "poly"specifica lo indirizza alla chiamata poly.lsmc, che produce questi risultati:

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

Se si desidera eseguire un test congiunto di diversi contrasti, utilizzare la testfunzione con joint = TRUE. Per esempio,

> test(con, joint = TRUE)

Ciò produrrà un test di "tipo III". Diversamente car::Anova(), lo farà correttamente indipendentemente dalla codifica del contrasto utilizzata nella fase di adattamento del modello. Questo perché le funzioni lineari da testare sono specificate direttamente anziché implicitamente tramite la riduzione del modello. Un'ulteriore caratteristica è che viene rilevato un caso in cui i contrasti da testare sono linearmente dipendenti e vengono prodotti la statistica e i gradi di libertà corretti.



7

Quando si eseguono contrasti, si sta eseguendo una specifica combinazione lineare dichiarata di mezzi cellulari nel contesto del termine di errore appropriato. Pertanto, il concetto di "Tipo di SS" non ha senso con i contrasti. Ogni contrasto è essenzialmente il primo effetto che utilizza un SS di tipo I. "Tipo di SS" ha a che fare con ciò che è parzialmente compensato o giustificato dagli altri termini. Per i contrasti, nulla è parzialmente compensato o giustificato. Il contrasto è da solo.


Hai assolutamente ragione.
Russellpierce,

3

Il fatto che i test di tipo III vengano utilizzati nel luogo di lavoro è il motivo più debole per continuare a usarli. SAS ha arrecato gravi danni alle statistiche al riguardo. L'esegesi di Bill Venables, citata sopra, è una grande risorsa al riguardo. Basta dire di no al tipo III; si basa su una nozione errata di equilibrio e ha una potenza inferiore a causa della sciocca ponderazione delle cellule nel caso sbilanciato.

Un modo più naturale e meno soggetto a errori per ottenere contrasti generali e per descrivere ciò che hai fatto, è fornito dalla funzione rmspacchetto R. contrast.rmsI contrasti possono essere molto complessi ma per l'utente sono molto semplici perché indicati in termini di differenze nei valori predittivi. Sono supportati test e contrasti simultanei. Gestisce effetti di regressione non lineare, effetti di interazione non lineare, contrasti parziali, ogni genere di cose.


Va bene e va bene per te come persona affermata di fama da dire. Altri non hanno il coraggio di non essere d'accordo con i recensori. Dato che le interpretazioni delle statistiche differiscono, chiederesti alle nuove persone di stare in linea di principio e di sostenere un costo irragionevole. Lo dico come qualcuno che è morto la mia parte di volte in cima a questa (e simili) colline. Il cambiamento dell'IMO su questo fronte è responsabilità dei gatekeeper, vale a dire redattori e revisori.
russellpierce,

Le persone che sono veramente brave con i dati hanno una vasta scelta di posti di lavoro e possono avere la possibilità di lavorare in aree in cui le loro competenze e opinioni sono rispettate.
Frank Harrell,

1
... ed è quello che faccio ora. Ma le persone che arrivano a questa domanda non faranno spesso parte di quella classe. Proprio come non lo ero 7 anni fa. Sostengo solo un po 'di empatia per il novizio e le sue circostanze.
russellpierce,

2

Prova il comando Anova nella libreria dell'auto. Utilizzare l'argomento type = "III", poiché per impostazione predefinita è di tipo II. Per esempio:

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

3
So che Moore è nella libreria dell'auto, ma quando vengono forniti i dati di esempio è più facile per chi pone la domanda comprendere la risposta se si utilizzano i dati di esempio.
russellpierce,

0

Anche autopromozione, ho scritto una funzione proprio per questo: https://github.com/samuelfranssens/type3anova

Installa come segue:

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))

Sarà inoltre necessario che il carpacchetto sia installato.


Come applicheresti questo alla parte contrastante della domanda?
russellpierce,

1
Mi scuso, non ho letto correttamente la domanda. La mia funzione semplificherà solo l'esecuzione di Anova di tipo III. Come StatGuy sopra, non vedo dove le SS entrino in gioco quando testano contrasti specifici.
sam_f
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.