Сила R для построения гистограммы по вероятности (относительная частота)

У меня возникли проблемы с построением гистограммы как pdf (вероятность)

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

hist(data[,1], freq = FALSE, xlim = c(-1,1), breaks = 800)

Чему я должен изменить эту строку? Мне нужно распределение вероятности и большое количество ящиков. (У меня 6 миллионов точек данных)

Это в справке R, но я не знаю, как ее переопределить:

freq logical; если TRUE, график гистограммы представляет собой представление частоты, составляющая отсчетов результата; если FALSE, вероятность плотности, плотности компонентов (так, чтобы гистограмма имела общая площадь одного). По умолчанию TRUE, если и только если разрывы эквидистант (и вероятность не указана).

Спасибо

изменить: подробности

hmm, поэтому мой сюжет идет выше 1, что довольно запутанно, если это вероятность. Теперь я вижу, как это связано с шириной бункера. Я более или менее хочу сделать каждый бин стоимостью 1 балл, имея еще много бункеров. Другими словами, высота бункера не должна превышать 1.0, если только она не равна 1.0, а все остальные бункеры равны 0.0. В настоящее время у меня есть бункеры, которые создают горб вокруг 15.0

изменить: высота на% точек в корзине @Dwin: Итак, как мне построить вероятность? Я понимаю, что интеграция по-прежнему даст мне 1,0 из-за единиц по оси x, но это не то, что я хочу. Скажем, у меня есть 100 очков, и 5 из них попадают в первый ящик, а затем этот бункер должен быть на высоте 0,05. Это то, чего я хочу. Я делаю это неправильно, и есть другой способ сделать это?

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

Ответы

Ответ 1

Чтобы ответить на запрос рассчитать вероятности, а не плотности:

h <- hist(vec, breaks = 100, plot=FALSE)
h$counts=h$counts/sum(h$counts)
plot(h)

Ответ 2

Вы уверены? Это работает для меня:

> vec <- rnorm(6000000)
> 
> h <- hist(vec, breaks = 800, freq = FALSE)
> sum(h$density)
[1] 100
> unique(zapsmall(diff(h$breaks)))
[1] 0.01

Умножьте последние два результата, и вы получите сумму плотности вероятности 1. Помните, что ширина бункера здесь важна.

Это с

> sessionInfo()
R version 3.0.1 RC (2013-05-11 r62732)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8    
 [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.0.1

Ответ 3

По умолчанию количество разрывов составляет около log2(N), где N - 6 миллионов в вашем случае, поэтому должно быть 22. Если вы видите только 4 перерыва, это может быть связано с тем, что в вашем вызове есть xlim. Это не изменяет основную гистограмму, это влияет только на то, какая часть ее построена. Если вы делаете

h <- hist(data[,1], freq=FALSE, breaks=800)
sum(h$density * diff(h$breaks))

вы должны получить результат 1.


Плотность ваших данных связана с единицами измерения; поэтому вы хотите убедиться, что "высота бункера не должна превышать 1.0", действительно имеет смысл. Например, предположим, что у нас есть куча измерений в футах. Мы строим гистограмму измерений как плотность. Затем мы преобразуем все измерения в дюймы (умножением на 12) и проведем еще одну гистограмму плотности. Высота плотности будет 1/12 от оригинала, хотя данные по существу одинаковы. Точно так же вы можете сделать ваши высоты бункера все меньше 1, умножив все ваши номера на 15.

Значит ли значение 1.0 какое-то значение?

Ответ 4

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

Пример 1:

nums = c (10, 41, 10, 28, 22, 8, 31, 3, 9, 9)

h2 = hist (nums, plot = F)

rf2 = h2 $counts/sum (h2 $counts)

d2 = rf2/diff (h2 $breaks)

h2 $плотность

[1] 0,06 0,00 0,02 0,01 0,01

d2

[1] 0,06 0,00 0,02 0,01 0,01

Пример 2:

nums = c (10, 41, 10, 28, 22, 8, 31, 3, 9, 9)

h3 = hist (nums, plot = F, breaks = c (1,30,40,50))

rf3 = h3 $counts/sum (h3 $counts)

d3 = rf3/diff (h3 $breaks)

h3 $плотность

[1] 0,02758621 0,01000000 0,01000000

d3

[1] 0,02758621 0,01000000 0,01000000

Ответ 5

R имеет ошибку или что-то в этом роде. Если у вас есть дискретные данные в data.frame(с 1 столбцом) и называть гист (DF, freq = FALSE) на нем, относительная плотность будет неправильной (суммирование до > 1). Это не должно произойти, насколько я могу судить.

Решение состоит в том, чтобы сначала вызвать unlist() для объекта. Это фиксирует график. enter image description hereenter image description here (Я тоже изменил текст, данные из http://www.electionstudies.org/studypages/anes_timeseries_2012/anes_timeseries_2012.htm)