Вопрос

Есть ли функция в R, которая подгоняет кривую к гистограмме?

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Дополнительным упражнением является выполнение этого с помощью пакета ggplot2 ...

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

Вероятно, это лучше работает с данными, которые более асимметричны:

Another skew-normal plot

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

"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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top