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.

War es hilfreich?

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:

eingeben Bild Beschreibung hier

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 

Skew-normal verteilten Daten plot

Dies ist wahrscheinlich besser funktioniert auf Daten, die mehr schief normal ist:

Ein weiterer Schräg normaler Plot

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top