Pytanie Dopasowanie krzywej gęstości do histogramu w R


Czy istnieje funkcja R, która pasuje do krzywej do histogramu?

Załóżmy, że masz następujący histogram

hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))

Wygląda normalnie, ale jest przekrzywiona. Chcę dopasować normalną krzywą, która jest przekrzywiona, aby zawinąć się wokół tego histogramu.

To pytanie jest raczej podstawowe, ale nie mogę znaleźć odpowiedzi na R w Internecie.


76
2017-09-30 11:23


pochodzenie


Czy chcesz znaleźć m i s takie, że rozkład Gaussa N (m, s) pasuje do twoich danych? - SteinNorheim
Nie jestem pewien, co to oznacza ...> _> - user5243421
@mathee: Myślę, że on oznacza m = średnia, a s = odchylenie standardowe. Rozkład Gaussa to inna nazwa rozkładu normalnego. - Peter Mortensen


Odpowiedzi:


Jeśli poprawnie zrozumiem twoje pytanie, prawdopodobnie chcesz oszacować gęstość wraz z histogramem:

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

Edytuj długo poźniej:

Oto nieco bardziej wystrojona wersja:

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) 

wraz z wykresem produkuje:

enter image description here


138
2017-09-30 12:02



+1 - czy możesz zrobić to na odwrót, to znaczy dostosować wykres gęstości, aby pasował do histogramu? - vonjd
Sugeruję podanie dodatkowego parametru lines(density(X,na.rm= TRUE) ponieważ wektor może zawierać wartości NA. - Anirudh


Takie rzeczy są łatwe dzięki 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()

lub naśladować wynik rozwiązania Dirka

ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..), binwidth = 5) + 
  geom_density()

25
2017-09-30 18:30





Oto sposób, w jaki to robię:

foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)

Dodatkowym ćwiczeniem jest zrobienie tego z pakietem ggplot2 ...


24
2017-09-30 13:32



Jeśli jednak chcesz czegoś, co jest przekrzywione, możesz zrobić przykład gęstości z góry, przekształcić swoje dane (np. Foo.log & lt; - log (foo) i wypróbować powyższe), lub spróbuj dopasować przekrzywioną dystrybucję, taką jak gamma lub lognormal (lognormal jest równoważne z logowaniem i dopasowaniem normalnego, btw). - John Johnson
Ale to wciąż wymaga najpierw oszacowania parametrów twojej dystrybucji. - Dirk Eddelbuettel
Jest to nieco odległe od zwykłego omawiania R, ponieważ dostajemy bardziej teoretyczne statystyki, ale możesz spróbować tego linku dla Gammy: en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation  Dla lognormal, po prostu weź log (zakładając, że wszystkie dane są pozytywne) i pracuj z danymi przekształconymi przez log. Jeśli chodzi o coś bardziej wyszukanego, myślę, że musiałbyś pracować z podręcznikiem statystycznym. - John Johnson
Myślę, że nie rozumiesz, w jaki sposób zarówno oryginalny plakat, jak i wszystkie inne odpowiedzi są całkiem zadowolone z używania nieparametrycznych danych szacunkowych - takich jak histogram ze starej szkoły lub nieco bardziej współczesny, oparty na danych, densistyczny szacunek. Parametryczne oszacowania są świetne, jeśli masz uzasadnione podejrzenie, że jest dystrybucja. Ale tak nie było w tym przypadku. - Dirk Eddelbuettel


Sztylet wyjaśnił, jak wykreślić funkcję gęstości na histogramie. Ale czasami możesz chcieć pójść z silniejszym założeniem skośnego rozkładu normalnego i spisać to zamiast gęstości. Możesz oszacować parametry rozkładu i narysować go za pomocą pakiet sn:

> 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 distributed data plot

Prawdopodobnie działa lepiej na danych, które są bardziej skośne-normalne:

Another skew-normal plot


11
2018-02-13 07:10





Miałem ten sam problem, ale rozwiązanie Dirka nie działało. Dostawałem to ostrzeżenie za każdym razem

"prob" is not a graphical parameter

Przeczytałem ... hist i znalazłem freq: logiczny wektor ustawia domyślnie wartość PRAWDA.

Kod, który pracował dla mnie jest

hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)

1
2018-01-21 14:34