Wie macht man eine Typ-III-SS-ANOVA in R mit Kontrastcodes?

26

Bitte geben Sie den R-Code an, mit dem Sie eine ANOVA zwischen den Probanden mit -3, -1, 1, 3 Kontrasten durchführen können. Ich verstehe, es gibt eine Debatte über den geeigneten Typ der Quadratsumme (SS) für eine solche Analyse. Da jedoch der in SAS und SPSS verwendete Standardtyp von SS (Typ III) in meiner Region als Standard gilt. Daher möchte ich, dass die Ergebnisse dieser Analyse genau mit den Ergebnissen dieser Statistikprogramme übereinstimmen. Um akzeptiert zu werden, muss eine Antwort direkt aov () aufrufen, aber andere Antworten können bewertet werden (insbesondere, wenn sie leicht zu verstehen / zu verwenden sind).

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

Bearbeiten: Bitte beachten Sie, dass der von mir angeforderte Kontrast kein einfacher linearer oder polynomieller Kontrast ist, sondern ein Kontrast, der aus einer theoretischen Vorhersage abgeleitet wurde, dh der Art der Kontraste, die von Rosenthal und Rosnow diskutiert wurden.

russellpierce
quelle
5
Ich verstehe, dass Sie eine Summe vom Typ III benötigen, aber dieser Artikel ( stats.ox.ac.uk/pub/MASS3/Exegeses.pdf ) ist eine gute Lektüre. Es zeigt einige interessante Punkte.
Suncoolsu
In Bezug auf Ihre Frage könnte Sie die folgende Diskussion interessieren: stats.stackexchange.com/questions/60362/… Die Wahl zwischen ANOVA Typ I, II und III ist nicht so einfach, wie es scheint.
PHX
Ihre Frage wurde insofern als nützlich bewertet, als sie mehrere gelernte Antworten hervorrief. Ich stelle jedoch auch fest, dass Sie dem Befragten zugestimmt haben, der im Grunde gesagt hat, dass die Prämisse der Frage falsch ist. Ich hoffe, ich fasse die Position von StaGuy so zusammen, dass definierte Kontraste per definitionem "Typ I" waren und die Diskussion über andere Typen erst relevant wurde, als die Statistik der partiellen Regression ausgewertet wurde.
DW
@DWin: Ich bin mir nicht sicher, ob ich dir vollständig folge. Man kann legitimerweise andere Arten von SS verwenden, ohne die "Maschine fährt" (zumindest, wie ich diesen Satz verstehe). Ich mag hier etwas rostig sein, aber wenn das Gedächtnis dient, können andere Typen relevant sein, wenn keine partielle Regression verwendet wird. Beispielsweise werden bei Typ III SS die Haupteffekte aus der Interaktion nicht herausgefiltert. Die Unterscheidung zwischen den Typen spielt gerade deshalb eine Rolle, weil Typ III nicht partiell ist, während Typ I dies tut. Das genannte Problem umfasste nur einen einzigen Kontrast und daher war / ist die Unterscheidung zwischen SS-Typen fraglich.
Russellpierce
Mein Verständnis war, dass die SAS die Begründung für die Wahl des Typ-III-SSS (und dies scheint der Grund zu sein, weshalb die Leute der Meinung sind, dass Typ-III bevorzugt wird) darin besteht, dass es den Auswahlprozess vorwärts und rückwärts besser unterstützt.
DW

Antworten:

22

Die Quadratsumme Typ III für ANOVA ist über die Anova()Funktion aus dem Fahrzeugpaket verfügbar .

Die Kontrastcodierung kann auf verschiedene Arten erfolgen, entweder mit C()der contr.*Familie (wie durch @nico angegeben) oder direkt mit der contrasts()Funktion / dem Argument. Dies wird ausführlich in §6.2 (S. 144-151) der Modern Applied Statistics with S (Springer, 2002, 4. Aufl.) Beschrieben . Beachten Sie, dass dies aov()nur eine Wrapper-Funktion für das istlm() Funktion ist. Es ist interessant, wenn man den Fehlerterm des Modells steuern möchte (wie bei einem objektinternen Entwurf), aber ansonsten beide das gleiche Ergebnis erzielen (und unabhängig davon, wie Sie zu Ihrem Modell passen, können Sie immer noch ANOVA oder LM- wie Zusammenfassungen mit summary.aovoder summary.lm).

Ich habe kein SPSS, um die beiden Ausgaben zu vergleichen, aber so etwas wie

> 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 

ist es wert, in erster Instanz zu versuchen.

Informationen zur Faktorcodierung in R im Vergleich zu SAS: R betrachtet die Basis- oder Referenzstufe als die erste Stufe in lexikografischer Reihenfolge, während SAS die letzte Stufe betrachtet. Um vergleichbare Ergebnisse zu erhalten, müssen Sie entweder den R-Faktor contr.SAS()oder relevel()den verwenden.

chl
quelle
1
Ich glaube nicht, dass diese Antwort den von mir angegebenen Kontrast von -3, -1,1,3 verwendet, und es scheint auch keinen 1 df-Test des Kontrasts zu geben.
Russellpierce
@drknexus Ja, du hast recht. Schrieb zu schnell. Sowas Anova(lm(DV ~ C(IV, c(-3,-1,1,3),1), data=sample.data), type="III")sollte besser sein. Bitte lassen Sie mich wissen, ob dies für Sie in Ordnung ist.
Chl
Vielen Dank! Das sieht in Ordnung aus. Ich werde es morgen gegen SPSS validieren und mich bei Ihnen melden.
Russellpierce
1
Übrigens, werfen Sie einen Blick auf das ez-Paket ( cran.r-project.org/web/packages/ez/index.html ), um den Anova-Code zu verpacken ...
Tal Galili
2
@drknexus: Wenn es nur eine Einreichungsseite für Feature Requests & Issues für ez ... github.com/mike-lawrence/ez/issues gäbe :)
Mike Lawrence
11

Dies mag ein bisschen nach Eigenwerbung aussehen (und ich nehme an, es ist so). Aber ich habe ein lsmeans- Paket für R (verfügbar auf CRAN) entwickelt, das genau für diese Art von Situation ausgelegt ist. So funktioniert es für Ihr Beispiel:

> 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

Sie können zusätzliche Kontraste in der Liste angeben, wenn Sie möchten. In diesem Beispiel erhalten Sie dieselben Ergebnisse mit dem integrierten linearen Polynomkontrast:

> 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

Beachten "poly"Sie zur Bestätigung, dass die Spezifikation den Aufruf anweist poly.lsmc, wodurch die folgenden Ergebnisse erzielt werden:

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

Wenn Sie einen gemeinsamen Test mehrerer Kontraste durchführen möchten, verwenden Sie die testFunktion mit joint = TRUE. Beispielsweise,

> test(con, joint = TRUE)

Dies führt zu einem "Typ III" -Test. Im Gegensatz car::Anova()dazu wird dies unabhängig von der in der Modellanpassungsphase verwendeten Kontrastkodierung korrekt durchgeführt. Dies liegt daran, dass die zu testenden linearen Funktionen direkt und nicht implizit über die Modellreduktion angegeben werden. Ein zusätzliches Merkmal ist, dass ein Fall erfasst wird, in dem die getesteten Kontraste linear abhängig sind, und die korrekte Teststatistik und die korrekten Freiheitsgrade erzeugt werden.

rvl
quelle
7

Wenn Sie Kontraste erstellen, erstellen Sie eine bestimmte, angegebene lineare Kombination von Zellmitteln im Kontext des entsprechenden Fehlerterms. Daher ist das Konzept des "SS-Typs" für Kontraste nicht aussagekräftig. Jeder Kontrast ist im Wesentlichen der erste Effekt, der eine SS vom Typ I verwendet. "Art der SS" hat mit dem zu tun, was in den anderen Begriffen teilweise herausgestellt oder erklärt wird. Bei Kontrasten wird nichts herausgerechnet oder erklärt. Der Kontrast steht für sich.

StatGuy
quelle
Du liegst absolut richtig.
Russellpierce
3

Die Tatsache, dass Typ-III-Tests an Ihrem Arbeitsplatz verwendet werden, ist der schwächste Grund, sie weiterhin zu verwenden. SAS hat diesbezüglich erheblichen statistischen Schaden angerichtet. Die Exegese von Bill Venables, auf die oben Bezug genommen wurde, ist eine großartige Quelle dafür. Sag einfach nein zu Typ III; Es basiert auf einem fehlerhaften Gleichgewichtsbegriff und hat aufgrund der albernen Gewichtung der Zellen im unausgewogenen Fall eine geringere Leistung.

Eine natürlichere und weniger fehleranfällige Möglichkeit, allgemeine Kontraste zu erhalten und beschreiben zu können, was Sie getan haben, bietet die R- rmsPaketfunktion contrast.rms. Kontraste können sehr komplex sein, für den Benutzer sind sie jedoch sehr einfach, da sie in Form von Unterschieden bei den Vorhersagewerten angegeben werden. Tests und gleichzeitige Kontraste werden unterstützt. Dies behandelt nichtlineare Regressionseffekte, nichtlineare Interaktionseffekte, partielle Kontraste und alles Mögliche.

Frank Harrell
quelle
Das ist alles in Ordnung und gut für Sie als etablierte Person zu sagen. Andere haben keine Ahnung, was Kritiker angeht. Da sich die Interpretationen der Statistiken unterscheiden, würden Sie neue Leute bitten, grundsätzlich zu bleiben und unangemessene Kosten zu verursachen. Ich sage das als jemand, der oft auf diesen (und ähnlichen) Hügeln gestorben ist. Die IMO-Änderung an dieser Front liegt in der Verantwortung der Gatekeeper, dh der Redakteure und Gutachter.
Russellpierce
Menschen, die wirklich gut mit Daten umgehen können, haben eine große Auswahl an Jobs und können in Bereichen arbeiten, in denen ihre Fähigkeiten und Meinungen respektiert werden.
Frank Harrell
1
... und das mache ich jetzt. Aber Leute, die zu dieser Frage kommen, werden nicht oft zu dieser Klasse gehören. So wie ich es vor 7 Jahren noch nicht war. Ich befürworte nur ein bisschen Empathie für den Neuling und seine Umstände.
Russellpierce
2

Probieren Sie den Befehl Anova in der Autobibliothek aus. Verwenden Sie das Argument type = "III", da standardmäßig Typ II verwendet wird. Beispielsweise:

library(car)
mod <- lm(conformity ~ fcategory*partner.status, data=Moore, contrasts=list(fcategory=contr.sum, partner.status=contr.sum))
Anova(mod, type="III")
jebyrnes
quelle
3
Ich weiß, dass Moore in der Fahrzeugbibliothek vorhanden ist, aber wenn Beispieldaten bereitgestellt werden, kann der Fragesteller Ihre Antwort leichter verstehen, wenn Sie die Beispieldaten verwenden.
Russellpierce
0

Ebenfalls selbstbewusst habe ich dafür eine Funktion geschrieben: https://github.com/samuelfranssens/type3anova

Installieren Sie wie folgt:

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

Sie müssen auch das carPaket installiert haben.

sam_f
quelle
Wie würden Sie dies auf den kontrastreichen Teil der Frage anwenden?
Russellpierce
1
Entschuldigung, ich habe die Frage nicht richtig gelesen. Meine Funktion wird nur die Ausführung von Typ III Anova vereinfachen. Wie bei StatGuy oben sehe ich beim Testen bestimmter Kontraste nicht, wo SS ins Spiel kommt.
sam_f