Czy w R jest funkcja dopasowująca krzywą do histogramu?
Powiedzmy, ż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 przekrzywiony. Chcę dopasować normalną krzywą, która jest skośna, aby zawijać się wokół tego histogramu.
To pytanie jest raczej podstawowe, ale nie mogę znaleźć odpowiedzi na R w Internecie.
r
histogram
curve-fitting
r-faq
user5243421
źródło
źródło
Odpowiedzi:
Jeśli dobrze rozumiem 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 póź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 generowanym wykresem:
źródło
lines(density(X,na.rm= TRUE)
ponieważ wektor może zawierać wartości NA.Z ggplot2 jest to łatwe
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 aby naśladować wynik z rozwiązania Dirka
ggplot(dataset, aes(x = X)) + geom_histogram(aes(y = ..density..), binwidth = 5) + geom_density()
źródło
Oto jak 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 ...
źródło
Dirk 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 wykreślić to zamiast gęstości. Możesz oszacować parametry dystrybucji i wykreślić ją za pomocą pakietu 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
Prawdopodobnie działa to lepiej w przypadku danych, które są bardziej normalne:
źródło
Miałem ten sam problem, ale rozwiązanie Dirka wydawało się nie działać. Za każdym razem otrzymywałem to ostrzeżenie
"prob" is not a graphical parameter
Przeczytałem
?hist
i znalazłemfreq: a logical vector set TRUE by default.
kod, który działał dla mnie, to
hist(x,freq=FALSE) lines(density(x),na.rm=TRUE)
źródło