Установка кривой плотности на гистограмму в R
Есть ли функция в R, которая подходит для кривой к гистограмме?
Скажем, у вас была следующая гистограмма
hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
Это выглядит нормально, но он перекошен. Я хочу поместить нормальную кривую, которая перекошена, чтобы обернуть эту гистограмму.
Этот вопрос довольно простой, но я не могу найти ответ на R в Интернете.
Ответы
Ответ 1
Если я правильно понял ваш вопрос, то вы, вероятно, захотите оценить плотность вместе с гистограммой:
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]()
Ответ 2
Такая вещь легко с 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()
Ответ 3
Вот как я это делаю:
foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)
Бонусное упражнение - это сделать с пакетом ggplot2...
Ответ 4
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]()
Ответ 5
У меня была та же проблема, но решение Dirk, похоже, не работало.
Я получал это предупреждение messege каждый раз
"prob" is not a graphical parameter
Я прочитал "hist" и нашел около freq
: логический вектор установлен по умолчанию TRUE.
код, который работал у меня, это
hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)