Как подогнать кривую к гистограмме


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

Хотя данные здесь не видны, вот некоторые переменные, которые я использую, чтобы вы могли видеть, что они представляют в коде ниже.

Differences <- subset(Score_Differences, select = Difference, drop = T)
m = mean(Differences)
std = sqrt(var(Differences))

Вот самая первая кривая, которую я произвожу (код кажется наиболее распространенным и простым для понимания). но сама кривая не подходит так хорошо).

hist(Differences, density = 15, breaks = 15, probability = TRUE, xlab = "Score Differences", ylim = c(0,.1), main = "Normal Curve for Score Differences")
curve(dnorm(x,m,std),col = "Red", lwd = 2, add = TRUE)

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

Мне это очень нравится, но не нравится кривая, идущая в отрицательную область.

hist(Differences, probability = TRUE)
lines(density(Differences), col = "Red", lwd = 2)
lines(density(Differences, adjust = 2), lwd = 2, col = "Blue")

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

Это та же гистограмма, что и первая, но с частотами. И все равно выглядит не очень хорошо.
h = hist(Differences, density = 15, breaks = 15, xlab = "Score Differences", main = "Normal Curve for Score Differences")
xfit = seq(min(Differences),max(Differences))
yfit = dnorm(xfit,m,std)
yfit = yfit*diff(h$mids[1:2])*length(Differences)
lines(xfit, yfit, col = "Red", lwd = 2)

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

Еще одна попытка, но не повезло. Может быть, потому, что я использую qnorm, когда данные явно не нормальны. Кривая уходит в отрицательную опять направление.

sample_x = seq(qnorm(.001, m, std), qnorm(.999, m, std), length.out = l)
binwidth = 3
breaks = seq(floor(min(Differences)), ceiling(max(Differences)), binwidth)
hist(Differences, breaks)
lines(sample_x, l*dnorm(sample_x, m, std)*binwidth, col = "Red")

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

Единственная кривая, которая визуально выглядит хорошо, - это 2-я, но кривая падает в отрицательном направлении.

Мой вопрос: "Есть ли "стандартный способ" поместить кривую на гистограмму?"Эти данные, безусловно, не являются нормальными. 3 из процедур, которые я представил здесь, взяты из аналогичных постов, но у меня, очевидно, есть некоторые проблемы. Я чувствую, что все методы подгонки кривой будут зависеть от данных, с которыми вы работаете с.


Обновление с помощью решения

Спасибо Чжэюань Ли и другим! Я оставлю это для моей собственной справки и, надеюсь, других тоже.

hist(Differences, probability = TRUE)
lines(density(Differences, cut = 0), col = "Red", lwd = 2)
lines(density(Differences, adjust = 2, cut = 0), lwd = 2, col = "Blue")

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

1 3

1 ответ:

Итак, вы просто боретесь с тем фактом, что density выходит за пределы "естественного диапазона". Ну, просто установите cut = 0. Возможно, вы захотите почитать plot.density расширяет "xlim" за пределы диапазона моих данных. Почему и как это исправить? Почему. В этом ответе я использовал from и to. Но теперь я использую cut.

## consider a mixture, that does not follow any parametric distribution family
## note, by construction, this is a strictly positive random variable
set.seed(0)
x <- rbeta(1000, 3, 5) + rexp(1000, 0.5)

## (kernel) density estimation offers a flexible nonparametric approach
d <- density(x, cut = 0)

## you can plot histogram and density on the density scale
hist(x, prob = TRUE, breaks = 50)
lines(d, col = 2)

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

Заметим, что по cut = 0 оценка плотности производится строго в пределах range(x). За пределами этого диапазона плотность равна 0.