Wie zeichnet man ein Interaktionsdiagramm mit Konfidenzintervallen?

11

Meine Versuche:

  1. Ich konnte keine Konfidenzintervalle erreichen interaction.plot()

  2. und andererseits würde plotmeans()aus dem Paket 'gplot' nicht zwei Diagramme angezeigt. Außerdem konnte ich keine zwei plotmeans()Diagramme übereinander platzieren, da die Achsen standardmäßig unterschiedlich sind.

  3. Ich hatte einige Erfolge mit plotCI()dem Paket 'gplot' und der Überlagerung von zwei Graphen, aber die Übereinstimmung der Achse war immer noch nicht perfekt.

Irgendwelche Ratschläge, wie man ein Interaktionsdiagramm mit Konfidenzintervallen erstellt? Entweder durch eine Funktion oder durch Ratschläge zum Überlagern plotmeans()oder durch plotCI()Diagramme.

Codebeispiel

br=structure(list(tangle = c(140L, 50L, 40L, 140L, 90L, 70L, 110L, 
150L, 150L, 110L, 110L, 50L, 90L, 140L, 110L, 50L, 60L, 40L, 
40L, 130L, 120L, 140L, 70L, 50L, 140L, 120L, 130L, 50L, 40L, 
80L, 140L, 100L, 60L, 70L, 50L, 60L, 60L, 130L, 40L, 130L, 100L, 
70L, 110L, 80L, 120L, 110L, 40L, 100L, 40L, 60L, 120L, 120L, 
70L, 80L, 130L, 60L, 100L, 100L, 60L, 70L, 90L, 100L, 140L, 70L, 
100L, 90L, 130L, 70L, 130L, 40L, 80L, 130L, 150L, 110L, 120L, 
140L, 90L, 60L, 90L, 80L, 120L, 150L, 90L, 150L, 50L, 50L, 100L, 
150L, 80L, 90L, 110L, 150L, 150L, 120L, 80L, 80L), gtangles = c(141L, 
58L, 44L, 154L, 120L, 90L, 128L, 147L, 147L, 120L, 127L, 66L, 
118L, 141L, 111L, 59L, 72L, 45L, 52L, 144L, 139L, 143L, 73L,  
59L, 148L, 141L, 135L, 63L, 51L, 88L, 147L, 110L, 68L, 78L, 63L, 
64L, 70L, 133L, 49L, 129L, 100L, 78L, 128L, 91L, 121L, 109L, 
48L, 113L, 50L, 68L, 135L, 120L, 85L, 97L, 136L, 59L, 112L, 103L, 
62L, 87L, 92L, 116L, 141L, 70L, 121L, 92L, 137L, 85L, 117L, 51L, 
84L, 128L, 162L, 102L, 127L, 151L, 115L, 57L, 93L, 92L, 117L, 
140L, 95L, 159L, 57L, 65L, 130L, 152L, 90L, 117L, 116L, 147L, 
140L, 116L, 98L, 95L), up = c(-1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
-1L, -1L, 1L, 1L, 1L, 1L, -1L, -1L, -1L, -1L, 1L, 1L, -1L, -1L, 
1L, 1L, -1L, 1L, 1L, -1L, 1L, 1L, 1L, 1L, 1L, -1L, -1L, 1L, 1L, 
1L, 1L, -1L, -1L, 1L, 1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, 
1L, -1L, -1L, -1L, -1L, -1L, 1L, -1L, 1L, 1L, -1L, -1L, -1L, 
-1L, 1L, -1L, 1L, -1L, -1L, -1L, 1L, -1L, 1L, -1L, 1L, 1L, 1L, 
-1L, -1L, -1L, -1L, -1L, -1L, 1L, -1L, 1L, 1L, -1L, -1L, 1L, 
1L, 1L, -1L, 1L, 1L, 1L)), .Names = c("tangle", "gtangles", "up"
), class = "data.frame", row.names = c(NA, -96L))

plotmeans2 <- function(br, alph) {
dt=br;   tmp   <- split(br$gtangles, br$tangle);   
means <- sapply(tmp, mean);  stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length);  
ciw   <- qt(alph, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, col="black", barcol="blue", lwd=1,ylim=c(40,150),  xlim=c(1,12)); 
par(new=TRUE) dt= subset(br,up==1);   
tmp   <- split(dt$gtangles, dt$tangle);  
means <- sapply(tmp, mean);  
stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length); 
ciw  <- qt(0.95, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, type='l',col="black", barcol="red", lwd=1,ylim=c(40,150), xlim=c(1,12),pch='+');
abline(v=6);abline(h=90);abline(30,10); par(new=TRUE);
dt=subset(br,up==-1);   
tmp <- split(dt$gtangles, dt$tangle);  
means <- sapply(tmp, mean);  
stdev <- sqrt(sapply(tmp, var));  
n <- sapply(tmp,length); 
ciw <- qt(0.95, n) * stdev / sqrt(n)
plotCI(x=means, uiw=ciw, type='l', col="black", barcol="blue",   lwd=1,ylim=c(40,150), xlim=c(1,12),pch='-');abline(v=6);abline(h=90);
abline(30,10);
}

plotmeans2(br,.95)
Adam SA
quelle

Antworten:

21

Wenn Sie bereit sind, ggplot zu verwenden , können Sie den folgenden Code ausprobieren.

Mit einem kontinuierlichen Prädiktor

library(ggplot2)
gp <- ggplot(data=br, aes(x=tangle, y=gtangles)) 
gp + geom_point() + stat_smooth(method="lm", fullrange=T) + facet_grid(. ~ up)

für ein facettiertes Interaktionsdiagramm

Geben Sie hier die Bildbeschreibung ein

Für ein Standard-Interaktionsdiagramm (wie das von interaction.plot()) müssen Sie nur die Facettierung entfernen.

gp <- ggplot(data=br, aes(x=tangle, y=gtangles, colour=factor(up))) 
gp + geom_point() + stat_smooth(method="lm")

Geben Sie hier die Bildbeschreibung ein

Mit einem diskreten Prädiktor

Verwenden des ToothGrowthDatensatzes (siehe help(ToothGrowth)),

ToothGrowth$dose.cat <- factor(ToothGrowth$dose, labels=paste("d", 1:3, sep=""))
df <- with(ToothGrowth , aggregate(len, list(supp=supp, dose=dose.cat), mean))
df$se <- with(ToothGrowth , aggregate(len, list(supp=supp, dose=dose.cat), 
              function(x) sd(x)/sqrt(10)))[,3]

opar <- theme_update(panel.grid.major = theme_blank(),
                     panel.grid.minor = theme_blank(),
                     panel.background = theme_rect(colour = "black"))
gp <- ggplot(df, aes(x=dose, y=x, colour=supp, group=supp))
gp + geom_line(aes(linetype=supp), size=.6) + 
     geom_point(aes(shape=supp), size=3) + 
     geom_errorbar(aes(ymax=x+se, ymin=x-se), width=.1)
theme_set(opar)

Geben Sie hier die Bildbeschreibung ein

chl
quelle
Vielen Dank für die ausführliche Antwort. Ich wollte fragen, ob es eine Möglichkeit gibt, vertikale Konfidenzintervalle auf jeder Ebene der unabhängigen Variablen festzulegen. Gibt es eine Möglichkeit, den Hintergrund zu entfernen und zum Diagramm im alten Stil zurückzukehren?
Adam SA
1
@Adam Ich habe meine Antwort mit dem Fall von 2 kategorialen Variablen + einer kontinuierlichen Antwortvariablen aktualisiert - hoffe, das haben Sie gemeint. Ich habe auch Code hinzugefügt, um zu zeigen, wie das ggplotThema angepasst wird . Im Allgemeinen können Sie sagen gp + theme_bw(), dass Sie nur den grauen Hintergrund entfernen möchten. hier habe ich auch das gitter entfernt.
Chl
12

Es gibt auch Fox und Hong Effekte Paket in R. Siehe die J. Stat. Sanft. Papiere hier und hier für Beispiele mit Konfidenzintervallen und Generieren von R-Code.

Es ist nicht ganz so hübsch wie eine ggplot-Lösung, aber etwas allgemeiner und ein Lebensretter für mäßig komplexe GLMs.

Konjugatprior
quelle
1
(+1) Ich muss zugeben, dass ich diesen Ansatz bevorzuge :-)
chl
@chl und / oder Conjugate, können Sie mehr darüber sagen, warum Sie diesen Ansatz bevorzugen? Es würde Leuten wie mir helfen, zu entscheiden, in welche Methode sie Zeit investieren sollen.
Michael Bishop
1
@MichaelBishop Im Wesentlichen, weil es viele knifflige Dinge zusammenfasst (Zeichnen auf Link- / Antwortskala, Anzeigen von 95% CI für GLMMM, Marginalisierung gegen Interaktionsterme usw.), die mit wenigen R-Befehlen (und persönlich) schwer zu handhaben wären. Ich mag latticeGrafiken sehr :)
chl