Почему функция hist() не имеет области один

#r #histogram #area

#r #гистограмма #область

Вопрос:

При использовании hist() в R и настройке freq=FALSE я должен получить значения плотности. Однако у меня ее нет. Я получаю другие числа, чем когда он просто показывает количество. Мне все еще нужно нормализовать.

Например:

 > h = hist(c(1,2,1,3,1,4,5,4,5,8,2,4,1,7,6,10,7,4,3,7,3,5), freq=FALSE)
> h$density
  0.13636364 0.15909091 0.09090909 0.09090909 0.02272727
> sum(h$density)
  [1] 0.5
> h$density/sum(h$density)
  [1] 0.27272727 0.31818182 0.18181818 0.18181818 0.0454545
  

Ответ №1:

Если вы изучите остальную часть вывода гистограммы, вы заметите, что столбцы имеют длину 2:

 $breaks
[1]  0  2  4  6  8 10
  

Следовательно, вы должны умножить sum(h$density) на 2, чтобы получить область, равную единице. Вы можете ясно видеть это, если посмотрите на гистограмму.

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

Комментарии:

1. И для получения ширины используйте diff(h$breaks)

Ответ №2:

Область гистограммы, по сути, 1.0 . Что вы не принимаете во внимание, так это то, что каждый столбец имеет ширину в две единицы:

 > h$breaks
[1]  0  2  4  6  8 10
  

Ответ №3:

 sum(h$density*(h$breaks[-1] - h$breaks[-length(h$breaks)]))

[1] 1
  

Комментарии:

1. Или просто используйте sum(h$density*diff(h$breaks))

2. Спасибо! Вы каждый день чему-то учитесь. Приятно знать, потому что я делаю это довольно часто.

Ответ №4:

Плотность не совпадает с вероятностью. Плотность для гистограммы — это высота полосы. Вероятность — это площадь панели. Вам нужно умножить высоту на ширину, чтобы получить область. Попробуйте

 x <- c(1,2,1,3,1,4,5,4,5,8,2,4,1,7,6,10,7,4,3,7,3,5)
hh <- hist(x, probability = TRUE)
sum(diff(hh$breaks) * hh$density)
# [1] 1
  

Работает, потому что breaks содержит начальную / конечную точки для каждой из ячеек. Таким образом, принимая разницу между каждым значением, вы получаете общую ширину ячейки. Вы также можете with() более легко получить оба этих значения.

 x <- c(1,2,1,3,1,4,5,4,5,8,2,4,1,7,6,10,7,4,3,7,3,5)
with(hist(x, probability = TRUE), sum(diff(breaks) * density))
# [1] 1