2017-12-05 1 views
3

Ich habe bereits zahlreiche Fragen dazu gefunden, aber irgendwie hat es mir nicht wirklich geholfen. Ich verstehe nicht, wie die binwidth in einer Dichte Histogramm in ggplot2 zu ändern, so dass die Wahrscheinlichkeiten bis zu 1.er Summe Es scheint, wie es funktioniert nur, wenn die binwidth genau ist 1. Hier ist ein Beispiel:Bin bindeweite des Dichte-Histogramms so ändern, dass Wahrscheinlichkeiten zu 1

set.seed(1) 
df = data.frame("data" = runif(1000, min=0, max=100)) 

a = ggplot(data = df, aes(x = data))+ 
    geom_histogram(aes(y=..density..),colour="black", fill = "white", 
    breaks=seq(0, 100, by = 50)) 


b = ggplot(data = df, aes(x = data))+ 
    geom_histogram(aes(y =..density..), 
      breaks=seq(0, 100, by = 30), 
      col="black", 
      fill="white") 
c = ggplot(data = df, aes(x = data))+ 
    geom_histogram(aes(y =..density..), 
      breaks=seq(0, 100, by = 10), 
      col="black", 
      fill="white") 

d = ggplot(data = df, aes(x = data))+ 
    geom_histogram(aes(y =..density..), 
      breaks=seq(0, 100, by = 1), 
      col="black", 
      fill="white") 

grid.arrange(a,b,c,d, ncol= 2) 

Wenn Sie sich die Wahrscheinlichkeitsachse ansehen, können Sie sehen, dass die ersten drei Graphen falsch sein müssen. Dies sind nicht die richtigen Histogramme, da die Bins nicht zu 1 summieren. Die Y-Achse ändert sich gemäß dem Histogramm a, b, c oder d sogar nicht signifikant. Ich habe auch versucht, den Befehl "breaks" durch den Befehl "binwidth" zu ersetzen, aber es ist noch schlimmer. Ich würde auch gerne wissen, wie Sie die Wahrscheinlichkeiten der einzelnen Bins eines Histogramms zählen können, um zu beweisen, dass es 1 ergibt oder nicht?

Danke für jede Hilfe.

+0

sollten Sie, was überprüfen, die de nsity-Werte in y-Achse darstellen. Es sind keine Wahrscheinlichkeiten. In vielen Fällen können diese Werte < 0 or > sein. 1. Versuchen Sie stattdessen, 'aes (y = .. count ../ sum (.. count ..))' 'zu verwenden. – AntoniosK

+0

Einige nützliche Informationen hier: https://stats.stackexchange.com/questions/4220/can-a-probability-distribution-value-exceeding-1-be-ok – AntoniosK

Antwort

1

Simulieren einige Daten:

library(ggplot2) 
library(dplyr) 

set.seed(1) 
df = data.frame("data" = runif(1000, min=0, max=100)) 

Der erste Plot Sie erhalten können, ist:

# y axis has the density estimate values 
ggplot(data = df, aes(x = data))+ 
    geom_histogram(aes(y=..density..),colour="black", fill = "white", 
       breaks=seq(0, 100, by = 50)) 

enter image description here

Diese Darstellung der Dichteschätzungen auf der y-Achse hat. Diese Werte entsprechen dem Dichtediagramm und nicht den von Ihnen erstellten Balken. Sie können diese Version sehen, wo die Dichte Plot überlagert wird:

# y axis has the density estimate values and the density plot 
ggplot(data = df, aes(x = data))+ 
    geom_histogram(aes(y=..density..),colour="black", fill = "white", 
       breaks=seq(0, 100, by = 50)) + 
    geom_density(aes(data), col="red") 

enter image description here Einen Weg, dies zu interpretieren ist, dass jeder Punkt auf der roten Linie eine Wahrscheinlichkeit ausgewählt werden muss, und das ist auf der y-Achse (dh eine Menge Punkte bedeutet, dass Wahrscheinlichkeiten näher bei Null liegen).

können Sie bekommen, was Sie mit diesem wollen:

# y axis has the probabilities of each bar (bar counts/all counts) 
ggplot(data = df, aes(x = data))+ 
    geom_histogram(aes(y=..count../sum(..count..)),colour="black", fill = "white", 
       breaks=seq(0, 100, by = 50)) 

enter image description here

andere Möglichkeit, die oben zu tun, während die Daten zu halten (für zukünftige Nutzung oder nur Wahrscheinlichkeiten überprüfen zu 1 summieren) ist dies :

# assign the breaks 
breaks = cut(df$data, seq(0, 100, by = 50)) 

# count observations in each bar and probability of each bar 
df %>% 
    mutate(Breaks = breaks) %>% 
    count(Breaks) %>% 
    mutate(Prc = n/sum(n)) 

# # A tibble: 2 x 3 
#  Breaks  n Prc 
#  <fctr> <int> <dbl> 
# 1 (0,50] 520 0.52 
# 2 (50,100] 480 0.48 

# plot the above 
df %>% 
    mutate(Breaks = breaks) %>% 
    count(Breaks) %>% 
    mutate(Prc = n/sum(n)) %>% 
    ggplot(aes(Breaks, Prc)) + geom_col() 

enter image description here

+0

Das ist eine unglaublich gute Antwort. Jetzt verstehe ich auch, was dort genauer passiert. Vielen Dank!! –

+0

und mit der Befehlssumme (df $ Prc) können Sie sehen, dass es zu 1 zusammenfasst, und Sie können sogar einzelne Elemente auswählen, um die Wahrscheinlichkeit dafür zu betrachten. Das ist großartig. –

+0

Wählen Sie einzelne Elemente mit: df [df $ Brüche == "(0,50]", 3] –

Verwandte Themen