Einpassen eine Dichtekurve zu einem Histogramm in R
-
19-09-2019 - |
Frage
Gibt es eine Funktion in R, die eine Kurve zu einem Histogramm paßt?
Angenommen, Sie haben die folgende Histogramm hatte
hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
Es sieht normal aus, aber es ist schief. Ich möchte eine normale Kurve passen, die schräg ist, um dieses Histogramm zu wickeln.
Diese Frage recht einfach ist, aber ich kann nicht scheinen, die Antwort für R im Internet zu finden.
Lösung
Wenn ich Ihre Frage richtig verstanden hat, dann wollen Sie wahrscheinlich eine Dichteschätzung zusammen mit dem Histogramm:
X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE) # prob=TRUE for probabilities not counts
lines(density(X)) # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted") # add another "smoother" density
Bearbeiten eines lange Zeit später:
Hier ist eine etwas gekleidet-up-Version:
X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE, col="grey")# prob=TRUE for probabilities not counts
lines(density(X), col="blue", lwd=2) # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted", col="darkgreen", lwd=2)
zusammen mit dem Graphen es erzeugt:
Andere Tipps
So etwas ist einfach, mit ggplot2
library(ggplot2)
dataset <- data.frame(X = c(rep(65, times=5), rep(25, times=5),
rep(35, times=10), rep(45, times=4)))
ggplot(dataset, aes(x = X)) +
geom_histogram(aes(y = ..density..)) +
geom_density()
oder das Ergebnis von Dirks Lösung zu imitieren
ggplot(dataset, aes(x = X)) +
geom_histogram(aes(y = ..density..), binwidth = 5) +
geom_density()
Hier ist die Art, wie ich es tun:
foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)
Eine Bonus-Übung ist dies mit ggplot2 Paket zu tun ...
Dirk hat erklärt, wie die Dichtefunktion über das Histogramm zu zeichnen. Aber manchmal möchten Sie vielleicht mit der stärkeren Annahme einer schiefen Normalverteilung und Handlung gehen, dass anstelle der Dichte. Sie können die Parameter der Verteilung schätzen und zeichnen sie die Verwendung von sn Paket
> sn.mle(y=c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
$call
sn.mle(y = c(rep(65, times = 5), rep(25, times = 5), rep(35,
times = 10), rep(45, times = 4)))
$cp
mean s.d. skewness
41.46228 12.47892 0.99527
Dies ist wahrscheinlich besser funktioniert auf Daten, die mehr schief normal ist:
Ich hatte das gleiche Problem, aber Dirks Lösung schien nicht zu arbeiten. Ich war jedes Mal diese Warnung messege bekommen
"prob" is not a graphical parameter
Ich las ?hist
und über freq: a logical vector set TRUE by default.
gefunden
der Code, der für mich gearbeitet ist
hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)