Припасування кривої щільності до гістограми в R


91

Чи існує функція в R, яка відповідає кривій гістограмі?

Скажімо, у вас була наступна гістограма

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

Це виглядає нормально, але перекошено. Я хочу відповідати нормальній кривій, яка перекошена, щоб обернути цю гістограму.

Це питання досить базове, але, здається, я не можу знайти відповідь на R в Інтернеті.


Ви хочете знайти m і s такими, щоб гауссовий розподіл N (m, s) відповідав вашим даним?
SteinNorheim

Я не впевнений, що це означає ...> _>
user5243421

10
@mathee: Я думаю, він має на увазі m = середнє, а s = стандартне відхилення. Гаусів розподіл - інша назва нормального розподілу.
Пітер Мортенсен,

Відповіді:


154

Якщо я правильно розумію ваше запитання, то вам, мабуть, потрібна оцінка щільності разом із гістограмою:

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) 

разом з графіком, який він створює:

введіть тут опис зображення


3
+1 - чи можете ви зробити це і навпаки, тобто регулюючи графік щільності відповідно до гістограми?
vonjd

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

30

З 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()

або імітувати результат рішення Дірка

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

28

Ось як я це роблю:

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

Бонусною вправою є зробити це за допомогою пакета ggplot2 ...


Однак, якщо ви хочете щось перекошене, ви можете зробити приклад щільності зверху, перетворити свої дані (наприклад, foo.log & lt; - log (foo) і спробувати вищезазначене), або спробувати встановити перекошений розподіл, наприклад гамма або логарифмічна норма (логарифмічна норма еквівалентна взяттю колоди та встановленню нормальної, до речі).
Джон Джонсон,

2
Але для цього все-таки потрібно спочатку оцінити параметри вашого розподілу.
Dirk Eddelbuettel

Це трохи далеко від простого обговорення R, оскільки ми заглиблюємось більше в теоретичну статистику, але ви можете спробувати це посилання для Gamma: en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation Для lognormal, просто візьміть журнал (припускаючи, всі дані позитивні) і працюйте з даними, перетвореними в журнал. Якщо хтось любитель, я думаю, вам доведеться попрацювати з підручником статистики.
Джон Джонсон,

3
Я думаю, ви неправильно розумієте, наскільки оригінальний плакат, як і всі інші відповіді, цілком задоволені використанням непараметричних оцінок - наприклад, гістограми старої школи чи дещо більш сучасної оцінки на основі даних. Параметричні оцінки чудові, якщо у вас є вагомі причини підозрювати розподіл. Але тут це було не так.
Dirk Eddelbuettel

11

Дірк пояснив, як побудувати графік функції щільності над гістограмою. Але іноді вам може знадобитися більш тверде припущення про похибку нормального розподілу і побудуйте це замість щільності. Ви можете оцінити параметри розподілу та скласти його за допомогою пакета 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 

Графік розподілених даних із косим розміром

Можливо, це працює краще для даних, які є більш перекошеними:

Черговий перекіс-нормальний сюжет


3

У мене була та сама проблема, але рішення Дірка, здається, не спрацювало. Я отримував це попередження щоразу

"prob" is not a graphical parameter

Я прочитав ?histі дізнався проfreq: a logical vector set TRUE by default.

код, який працював у мене, є

hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.