Есть ли в R функция, которая соответствует кривой гистограмме?
Допустим, у вас была следующая гистограмма
hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
Выглядит нормально, но перекошено. Я хочу подобрать нормальную кривую, которая перекошена, чтобы обернуть эту гистограмму.
Это довольно простой вопрос, но я не могу найти ответ для R в Интернете.
r
histogram
curve-fitting
r-faq
user5243421
источник
источник
Ответы:
Если я правильно понял ваш вопрос, то вам, вероятно, понадобится оценка плотности вместе с гистограммой:
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)
вместе с графиком, который он производит:
источник
lines(density(X,na.rm= TRUE)
поскольку вектор может содержать значения NA.Это просто с 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
Вероятно, это лучше работает с данными, которые более искажены:
источник
У меня была та же проблема, но решение Дирка, похоже, не сработало. Я получал это предупреждение каждый раз
"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)
источник