2015-05-17 13 views
5

Ich möchte eine Dichtekurve zu einem Frequenzhistogramm überlagern, das ich konstruiert habe. Für das Frequenzhistogramm habe ich aes(y=..counts../40) verwendet, weil 40 meine gesamte Probennummer ist. Ich habe aes(y=..density..*0.1) verwendet, um die Dichte irgendwo zwischen 0 und 1 zu erzwingen, da meine Binbreite 0,1 ist. Die Dichtekurve passt jedoch nicht zu meinen Daten und schließt die Werte aus, die gleich 1,0 sind (beachten Sie, dass das Histogramm Akkumulationswerte für das Bin = (1,0,1,1) zeigt, die Dichtekurve jedoch bei 1,0 endet)Überlagerungsdichtediagramm schließt Histogrammwerte aus

meine Daten

data<-structure(list(variable = structure(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, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("E1", "test" 
), class = "factor"), value = c(0.288888888888889, 0.08179, 
0.219026548672566, 0.584795321637427, 0.927554980595084, 0.44661095636026, 
1, 0.653780942692438, 1, 0.806451612903226, 1, 0.276794335371741, 
1, 0.930109557990178, 0.776864728192162, 0.824909747292419, 1, 
1, 1, 1, 1, 0.0875912408759124, 0.308065494238933, 1, 0.0258064516129032, 
0.0167322834645669, 1, 1, 0.355605889014723, 0.310344827586207, 
0.106598984771574, 0.364447494852436, 0.174724342663274, 0.77491961414791, 
1, 0.856026785714286, 0.680759275237274, 0.850657108721625, 1, 
1, 0, 0.851851851851852, 1, 0, 0.294954721862872, 0.819870009285051, 
0, 0.734147168531706, 0.0135424091233072, 0.0189098998887653, 
0.0101010101010101, 0, 0.296905222437137, 0.706837929731772, 
0.269279393173198, 0.135379061371841, 0.158969804618117, 0.0902981940361193, 
0.00423131170662906, 0, 0.374880611270296, 0.0425790754257908, 
0.145542753183748, 0, 0.129032258064516, 0.260334645669291, 0, 
0, 1, 0.175505350772889, 0.08248730964467, 0, 0.317217981340119, 
0.614147909967846, 0, 0.264508928571429, 0.883520276100086, 0.0657108721624851, 
0, 0.560229445506692)), row.names = c(NA, -80L), .Names = c("variable", 
"value"), class = "data.frame") 

Plot

q<-ggplot(data, aes(value, fill = variable)) 
     q + geom_density(alpha = 0.6,aes(y=..density..*0.1),binwidth=0.1) 
    + theme_minimal()+scale_fill_manual(values =c("#D7191C","#2B83BA")) 
    + theme(legend.position="bottom")+ guides(fill=guide_legend(nrow=1)) 
    + labs(title="Density Plot GrupoB",x="Respuesta",y="Density") 
    +scale_x_continuous(breaks=seq(from=0,to=1.2,by=0.1)) 
    +geom_histogram(alpha = 0.6,aes(y=..count../40),binwidth=0.1,position="dodge") 

Der Ausgang ich dieses enter image description here

Antwort

6

ist Ihr Grundstück EXA tut ctly was ist aus Ihren Daten zu erwarten:

  • Du Plot data$value, die numerischen Werte zwischen 0 und 1 enthält, so dass man die Dichtekurve erwarten sollte von 0 bis 1 als auch laufen.
  • Sie zeichnen ein Histogramm mit binwidth 0.1. Die Behälter sind unten geschlossen und am oberen Ende offen. Das Binning, das Sie in Ihrem Fall erhalten, ist also [0,0,1), [0,1, 0,2), ..., [0,9,1,0), [1,0,1,1]. Sie haben 17 Werte in Ihren Daten, die 1 sind und gehen so in die letzte Bin, die von 1 bis 1,1 geplottet wird.

Ich denke, es ist eine schlechte Idee, das Histogramm so zu plotten, wie Sie es tun. Der Grund dafür ist, dass für ein Histogramm die x-Achse kontinuierlich ist, was bedeutet, dass der Balken, der den x-Achsenbereich von beispielsweise 0,1 bis 0,2 abdeckt, für die Zählung von Werten zwischen (und einschließlich) 0,1 und 0,2 (nicht einschließlich) steht letzteres). Die Verwendung von Ausweichen in dieser Situation führt zu einem verzerrten Bild, da die Balken nicht mehr den richtigen x-Achsenbereich abdecken. Zwei Bars teilen sich die Bandbreite, die beide voll abdecken sollten. Diese Verzerrung ist einer der Gründe, warum die Dichtekurve nicht mit dem Histogramm übereinstimmt.

Also, was können Sie dagegen tun? Ich kann Ihnen ein paar Vorschläge geben, aber vielleicht andere haben bessere Ideen ...

  • Statt die Histogramme der Plotten nebeneinander mit position="dodge" Sie Facettierung verwenden könnte, das heißt, zeichnen die Histogramme (und entsprechende Dichtekurven) in separate Plots. Dies kann durch Hinzufügen von + facet_grid(variable~.) zu Ihrem Grundstück erreicht werden.

  • Sie könnten ein wenig schummeln, um den letzten Behälter, der [0,9,1) ist, 1 hinzuzufügen (d. H. Es muss [0,9,1,0] sein). Ersetzen Sie einfach 1 in Ihren Daten durch 0,999 wie folgt: data$value[data$value==1]<-0.999. Es ist wichtig, dass Sie dies nur für das Diagramm tun, wo es wirklich nur bedeutet, dass Sie das Binning etwas neu definieren. Für alle numerischen Auswertungen, die Sie einrücken, sollten Sie diesen Ersatz nicht durchführen! (Ändert zB den Mittelwert von data$value.)

  • In Bezug auf die Normalisierung Ihrer Dichtekurve und des Histogramms: Die Dichtekurve muss nicht zwischen 0 und 1 liegen. Die Einschränkung ist das Integral Über der Dichtekurve sollte 1 liegen. Um also die Dichtekurve und das Histogramm vergleichbar zu machen, sollte auch das Histogramm das Integral 1 haben, was erreicht wird, indem auch der y-Wert durch die Bindbreite dividiert wird.Also sollten Sie geom_density(alpha = 0.6,aes(y=..density..)) verwenden (ich habe auch bindwith=0.1 entfernt, weil es keinen Effekt für geom_density hat) und geom_histogram(alpha = 0.6,aes(y=..count../40/.1),binwidth=0.1) (keine Notwendigkeit für position="dodge", sobald Sie Facettierung verwenden). Dies führt natürlich zu genau der relativen Normalisierung, die Sie hatten, aber es macht mehr Sinn, weil die Integrale über Dichtekurve und Histogramm 1 sind, wie sie sein sollten.

  • Die Dichtekurve stimmt immer noch nicht perfekt mit dem Histogramm überein und dies hat etwas damit zu tun, wie der Dichteschätzer berechnet wird. Ich weiß das nicht im Detail und kann es daher leider nicht weiter erklären. Aber Sie können ein besseres Verständnis davon bekommen, wie es funktioniert, indem Sie mit dem Parameter adjust bis geom_density spielen. Dadurch wird die Kurve für kleinere Zahlen weniger glatt und die Kurve ähnelt dem Histogramm.

alles zusammen, habe ich alle meine Vorschläge in den Code eingebaut, verwendet adjust=0.2 in geom_density und geplottet das Ergebnis:

data$value[data$value==1]<-0.999 
q<-ggplot(data, aes(value, fill = variable)) 
q + geom_density(alpha = 0.6,aes(y=..density..),adjust=0.2) + 
    theme_minimal()+scale_fill_manual(values =c("#D7191C","#2B83BA")) + 
    theme(legend.position="bottom")+ guides(fill=guide_legend(nrow=1)) + 
    labs(title="Density Plot GrupoB",x="Respuesta",y="Density")+ 
    scale_x_continuous(breaks=seq(from=0,to=1.2,by=0.1))+ 
    geom_histogram(alpha = 0.6,aes(y=..count../40/.1),binwidth=0.1) + 
    facet_grid(variable~.) 

enter image description here

Leider kann ich dir nicht geben, eine umfassendere Antwort, aber ich hoffe, diese Ideen geben Ihnen einen guten Start.

+0

Ich weiß, ich sollte dies nicht nutzen, um mich zu bedanken, aber Sie stellen in Ihrem Profil keinen Kommunikationsweg bereit. Deine Antwort ist perfekt. Ich war verärgert, Position = "Ausweichen" zu verwenden, aber mit der gestapelten Version konnte ich nicht einmal die Daten sehen. Der Facettenansatz ist auch für die Seminarpräsentation schön. –

Verwandte Themen