2016-05-10 23 views
1

Ich hatte gehofft, machen mir jemand bei folgendem Problem helfen könnte:Wie Fehlerbalken für mehrere Variablen in bar Chat

Ich versuche, eine kombinierte BarPlot zu machen den Mittelwert und Standardfehler für 3 verschiedene kontinuierlichen Variablen zeigt (Körpertemp, Länge, Masse) für eine binäre Variable (Geschlecht) aufgezeichnet.

Ich konnte die Mittelwerte für jede Variable darstellen, aber ich kann nicht scheinen, den Standardfehler für diese 3 Variablen erfolgreich zu berechnen, die einen der Codes verwenden, die ich probiert habe. Ich habe versucht, viele Dinge, aber ich denke, dass ich auf dem richtigen Weg mit diesem war:

View(test4) 
    test4 <- aggregate(test4, 
      by = list(Sex = test4$Sex), 
      FUN = function(x) c(mean = mean(x), sd = sd(x), 
           n = length(x))) 
    test4 
    #this produced mean, sd, length for ALL variables (including sex) 
    test4<-do.call(test4) 
    test4$se<-test4$x.sd/sqrt(test4$x.n) 

Dann habe ich immer den Fehler gehalten:

Error in sqrt(test4$x.n) : non-numeric argument to mathematical function 

Ich versuchte, meine drei Variablen nach Aggregat neu zu kodieren Ziel (test4 ...), aber ich konnte es nicht zur Arbeit bringen ... Dann habe ich durch resultierenden Datenrahmen subsettiert, um Sex auszuschließen, aber das hat nicht funktioniert. Ich habe dann versucht, es als Matrix oder Vektor zu definieren, aber das hat nicht funktioniert.

Ich möchte, dass meine letzte Grafik y-Achse = Mittelwerte, x-Achse = Variable (3 Untergruppen (Tb, Masse, Länge) mit zwei nebeneinander liegenden Balken, männliche und weibliche Werte zum Vergleich.

Jede jemand Hilfe oder Richtung könnte würde bieten sehr geschätzt !!

Vielen dank im Voraus! :)

+0

Dieses liest zur Zeit wie eine Frage zu 'Aggregat ', keine Frage zum Plotten. Zum Plotten könntest du versuchen, mit etwas in der Art von [diese Antwort] herumzuspielen (http://stackoverflow.com/a/19299034/2461552). – aosmith

Antwort

0

aggregate einige verrückte Ausgabe nicht geben, wenn die Ausgabe mehr als eine Spalte versuchen. Wenn Sie aggregate verwenden möchten, würde ich meinen und SE als separate Aufrufe an aggregate.

Allerdings ist hier eine Lösung mit tidyr und dplyr, die ich denke nicht, ist zu schlecht.

Ich habe einige Daten erstellt. Ich hoffe, es sieht wie deines aus. Es ist so nützlich, einen simulierten Datensatz mit Ihrer Frage zu integrieren.

library(tidyr) 
library(dplyr) 
library(ggplot2) 

# Create some data 
test4 <- data.frame(Sex = rep(c('M', 'F'), 50), 
        bodytemp = rnorm(100), 
        length = rnorm(100), 
        mass = rnorm(100)) 

# Gather the data to 'long' format so the bodytemp, length and mass are all in one column 
longdata <- gather(test4, variable, value, -Sex) 
head(longdata) 

# Create the summary statistics seperately for sex and variable (i.e. bodytemp, length and mass) 
summary <- longdata %>% 
      group_by(Sex, variable) %>% 
      summarise(mean = mean(value), se = sd(value)/length(value)) 

# Plot 
ggplot(summary, aes(x = variable, y = mean, fill = Sex)) + 
    geom_bar(stat = 'identity', position = 'dodge') + 
    geom_errorbar(aes(ymin = mean - se, ymax = mean + se),        
        width = 0.2, 
        position = position_dodge(0.9)) 

outputbarchart

+0

Danke für Ihre Hilfe! Leider, als ich dieses Skript befolgte, produzierte es nicht den Graph, den ich wollte (wahrscheinlich, weil wir mit verschiedenen Datensätzen arbeiteten), aber es brachte mich dazu, meine Daten über den langen Weg zu organisieren und dann konnte ich mitmachen ein anderes Skript, das ich verwendet habe, als ich gerade einen Ausgang hatte. Ich werde beim nächsten Mal definitiv einen Datensatz hinzufügen! Danke nochmal für deine Hilfe :) – brittany

0

My final plot

Update: Ich war in der Lage, meine Frage zu beantworten, indem sie den Anfangsteil des timcdlucas Skript zusammen mit einer anderen Kombination ich verwendet habe, als nur einen Ausgang Plotten. Für alle anderen, die eine Antwort auf eine ähnliche Frage bestrebt sein, kann, ich habe mein Skript und das resultierende Diagramm geschrieben (siehe Link oben):

View(test3) #this dataframe was organized as 'sex', 'tb', 'mass', 'svl' 
newtest<-test3 
View(newtest) 

#transform data to 'long' combining all variables in one column 
longdata<-gather(newtest, variable, value, -Sex) 
View(longdata) 

#set up table in correct format 
longdata2 <- aggregate(longdata$value, 
       by = list(Sex = longdata$Sex, Variable = longdata$variable), 
       FUN = function(x) c(mean = mean(x), sd = sd(x), 
            n = length(x))) 
longdata2 <- do.call(data.frame, longdata2) 
longdata2$se<-longdata2$x.sd/sqrt(longdata2$x.n) 
colnames(longdata2)<-c("Sex", "Variable", "mean", "sd", "n", "se") 
longdata2$names<-c(paste(longdata2$Variable, "Variable /", longdata2$Sex, "Sex")) 
View(longdata2) 
dodge <- position_dodge(width = 0.9) 
limits <- aes(ymax = longdata3$mean + longdata3$se, 
      ymin = longdata3$mean - longdata3$se) 

#To order the bars in the way I desire *might not be necessary for future scripts* 
positions<-c("Tb", "SVL", "Mass") 

#To plot new table: 

bfinal <- ggplot(data = longdata3, aes(x = factor(Variable), y = mean, 
          fill = factor(Sex)))+ 
geom_bar(stat = "identity", 
     position = position_dodge(0.9))+ 
geom_errorbar(limits, position = position_dodge(0.9), 
      width = (0.25)) + 
labs(x = "Variable", y = "Mean") + 
ggtitle("")+ 
scale_fill_discrete(name = "", 
        labels=c("Male", "Female"))+ 
scale_x_discrete(breaks=c("Mass", "SVL", "Tb"), 
       labels=c("Mass", "SVL", "Tb"), 
       limits=(positions)) 
bfinal 

:)