2009-09-30 3 views
74

Существует ли функция в R, соответствующая кривой на гистограмме?Установка кривой плотности на гистограмму в R

Допустим, вы имели следующую гистограмму

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

Это выглядит нормально, но это перекос. Я хочу подогнать нормальную кривую, которая перекошена, чтобы обернуть эту гистограмму.

Этот вопрос довольно простой, но я не могу найти ответ на R в Интернете.

+0

Хотите найти м и S такое, что гауссова распределения N (м, с) подходит к вашим данным? – SteinNorheim

+0

Я не уверен, что это значит ...> _> – user5243421

+10

@mathee: Я думаю, что он означает m = mean и s = стандартное отклонение. Гауссовское распределение - другое имя для нормального распределения. –

ответ

136

Если я правильно понимаю ваш вопрос, то вы, вероятно, хотите оценку плотности вместе с гистограммой:

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 

Редактировать долгое время спустя:

Вот немного более разодетые версия:

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) 

вместе с графиком она производит:

enter image description here

+1

+1 - можете ли вы также сделать это наоборот, то есть отрегулировать график плотности, чтобы он соответствовал гистограмме? – vonjd

+2

Я предлагаю указать дополнительный параметр 'lines (плотность (X, na.rm = TRUE)", поскольку вектор может содержать значения NA. – Anirudh

24

Вот как я это делаю:

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

бонус упражнения, чтобы сделать это с помощью пакета ggplot2 ...

+0

Однако, если вы хотите что-то перекошенное, вы можете либо сделать пример плотности сверху, преобразуйте свои данные (например, foo.log < - log (foo) и попробуйте выше) или попробуйте установить перекошенное распределение, такое как гамма или логнормальное (lognormal эквивалентно принятию журнала и установке нормального, btw). –

+2

Но это все еще требует оценки параметров вашего дистрибутива в первую очередь. –

+0

Это немного зависит от простого обсуждения R, поскольку мы получаем больше теоретической статистики, но вы можете попробовать эту ссылку для Gamma: http: //en.wikipedia .org/wiki/Gamma_distribution # Parameter_estimation Для lognormal просто возьмите журнал (при условии, что все данные положительные) и работайте с log-trans сформированные данные. Для чего-нибудь интересного, я думаю, вам придется работать со статистическим учебником. –

24

Такая вещь легко с 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() 

или чтобы имитировать результат решения Dirk's

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

Dirk объяснил, как построить функцию плотности над гистограммой. Но иногда вы можете пойти с более сильным предположением о перекошенном нормальном распределении и графике, а не плотности. Вы можете оценить параметры распределения и построить ее с помощью sn package:

> 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

Это, вероятно, лучше работает на данных, которые более Косонормальный:

Another skew-normal plot

1

I была та же проблема, но решение Дирка, похоже, не работало. я получаю это предупреждение об messege каждый раз

"prob" is not a graphical parameter 

Я прочитал истор и нашел около freq: логический вектор набор TRUE, по умолчанию.

код, который работал для меня

hist(x,freq=FALSE) 
lines(density(x),na.rm=TRUE) 
Смежные вопросы