2013-11-25 25 views
10

Ich habe eine Sammlung von Daten über mehrere Studien. Für jede Studie interessiere ich mich für den Mittelwert einer Variablen nach Geschlecht und wenn diese sich signifikant unterscheidet. Für jede Studie habe ich die mittleren und 95% Konfidenzintervalle für Männer und Frauen.Dotplot mit Fehlerbalken, zwei Serien, Licht Jitter

Was Ich mag würde, ist etwas zu tun, ähnlich wie diese: enter image description here

ich mehrere Aromen von Dotplots verwendet haben (Dotplot, dotplot2, Dotplot), aber nicht ganz dorthin gelangen.

Mit Dotplot von Hmisc habe ich es geschafft, eine Reihe und seine Fehlerbars zu haben, aber ich bin ratlos, wie man die zweite Reihe hinzufügt.

Ich verwendete Dotplot und bekam die vertikale Endung der Fehlerbalken folgenden Rat gegeben here. Hier

ist ein funktionierendes Beispiel für den Code I

data<-data.frame(ID=c("Study1","Study2","Study3"),avgm=c(2,3,3.5),avgf=c(2.5,3.3,4)) 
data$lowerm <- data$avgm*0.9 
data$upperm <- data$avgm*1.1 
data$lowerf <- data$avgf*0.9 
data$upperf <- data$avgf*1.1 

# Create the customized panel function 
mypanel.Dotplot <- function(x, y, ...) { 
    panel.Dotplot(x,y,...) 
    tips <- attr(x, "other") 
    panel.arrows(x0 = tips[,1], y0 = y, 
       x1 = tips[,2], y1 = y, 
       length = 0.05, unit = "native", 
       angle = 90, code = 3) 
} 

library(Hmisc) 
Dotplot(data$ID ~ Cbind(data$avgm,data$lowerm,data$upperm), col="blue", pch=20, panel = mypanel.Dotplot, 
     xlab="measure",ylab="study") 

Dies zeichnet drei Spalten von Daten verwenden, den Durchschnitt für Männer (avgm) und die unteren und obere Grenze des 95% Konfidenzintervall (Unter und Oberm). Ich habe andere drei Serien für die gleichen Studien, die die gleichen Aufgaben für die weiblichen Probanden (avgf, lowf, upperf) tun.

Die Ergebnisse, die ich wie folgt aussehen haben:

enter image description here

Was fehlt, auf den Punkt:

  1. eine zweite Reihe hinzugefügt (avgf) mit Mitteln und Konfidenzintervall auf definierte drei andere Variablen für die gleichen Studien

  2. Hinzufügen einige vertikale Jitter, so dass sie nicht eins sind der andere aber der Leser kann beides sehen, auch wenn sie sich überschneiden.

+2

Bitte zeigen Sie Ihren Code ... – Thomas

+0

Danke, Code hinzugefügt. Es läuft nicht, da ich die Originaldaten aufgrund von Vereinbarungen mit den ursprünglichen Autoren leider nicht teilen kann. – PaoloCrosetto

+1

Danke, dass du diesen Code hinzugefügt hast. Sie sollten jedoch auch in der Lage sein, einen kleinen Beispieldatensatz zu erstellen, der funktioniert, ohne vertrauliche Informationen preiszugeben. Vielleicht unterteilen Sie Daten von zwei Autoren, ändern Sie die Zahlen ein wenig und anonnymize, und post * das *. (Die Idee ist, potenzielle Beantworter nicht zu raten und auf ihrem eigenen Format das Format der Daten zu rekonstruieren, das Sie in der Hand haben.) –

Antwort

8

Leider kann ich dir nicht helfen, mit Dotplot, aber ich finde es ziemlich einfach ggplot verwenden. Sie müssen nur die Daten leicht neu anordnen.

library(ggplot2) 
# grab data for males 
df_m <- data[ , c(1, 2, 4, 5)] 
df_m$sex <- "m" 
names(df_m) <- c("ID", "avg", "lower", "upper", "sex") 
df_m 

# grab data for females 
df_f <- data[ , c(1, 3, 6, 7)] 
df_f$sex <- "f" 
names(df_f) <- c("ID", "avg", "lower", "upper", "sex") 
df_m 

# bind the data together 
df <- rbind(df_m, df_f) 

# plot 
ggplot(data = df, aes(x = ID, y = avg, ymin = lower, ymax = upper, colour = sex)) + 
    geom_point(position = position_dodge(width = 0.2)) + 
    geom_errorbar(position = position_dodge(width = 0.2), width = 0.1) + 
    coord_flip() + 
    scale_colour_manual(values = c("blue", "red")) + 
    theme_classic() 

enter image description here

# if you want horizontal grid lines you may change the last line with: 
    theme_bw() + 
    theme(panel.grid.major.y = element_line(colour = "grey", linetype = "dashed"), 
     panel.grid.major.x = element_blank(), 
     panel.grid.minor.x = element_blank()) 
+0

Danke @Henrik für die Antwort. Es ist eine sehr saubere Lösung. Ich hoffe, dass ich auch eine Antwort von Dotplot bekomme, da ich dies auch neben ein anderes Dotplot setzen möchte, das ich gemacht habe, und ich würde gerne ein konsistentes Look & Feel haben. Vielen Dank. – PaoloCrosetto

+0

Ich habe meinen Code benutzt (und viel über ggplot2 gelernt). Danke für deine Antwort! – PaoloCrosetto

+0

@Henrik Vielen Dank für diese Antwort! –