2016-12-22 4 views
3

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

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

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) 

enter image description here

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

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

enter image description here

Это тот же гистограмму, как первый, но с частотами. Все еще не выглядит так хорошо.

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) 

enter image description here

Еще одна попытка, но не повезло. Может быть, потому, что я использую 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") 

enter image description here

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

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


Update раствором

Благодаря Zheyuan Ли и другие! Я оставлю это для своих собственных ссылок и, надеюсь, и других.

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

enter image description here

+0

В сценариях, где я не знаю распределения раньше времени (т. Е. Всех эмпирических сценариев), я использую плотность ядра (иногда без гистограммы). Если ваша цель - увидеть, насколько данные соответствуют определенному дистрибутиву, вы можете графически отобразить плотность ядра вместе с известным распределением. – lmo

+0

@ lmo Мне нравится эта идея. Кажется, что мое ядро ​​уходит с гистограммы в отрицательное направление. Его надоедливое, но о хорошо .. Спасибо вам обоим. – Brandon

+0

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

ответ

2

ОК, так что вы просто борется с тем, что density выходит за рамки "естественного ареала". Ну, просто установите cut = 0. Вы, возможно, захотите прочитать plot.density extends “xlim” beyond the range of my data. Why and how to fix it? для чего. В этом ответе я использовал 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) 

enter image description here

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

+0

Ahhh! Я вижу сейчас. Ничего себе это удобно. По большей части кажется, что я все обдумал. Спасибо за разъяснение и терпение. Очень ценится. – Brandon