Ответ 1
Чтобы ответить на запрос рассчитать вероятности, а не плотности:
h <- hist(vec, breaks = 100, plot=FALSE)
h$counts=h$counts/sum(h$counts)
plot(h)
У меня возникли проблемы с построением гистограммы как 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. Это то, чего я хочу. Я делаю это неправильно, и есть другой способ сделать это?
Я знаю, сколько у меня очков. Есть ли способ разделить количество каждого бина в гистограмме частоты на это число?
Чтобы ответить на запрос рассчитать вероятности, а не плотности:
h <- hist(vec, breaks = 100, plot=FALSE)
h$counts=h$counts/sum(h$counts)
plot(h)
Вы уверены? Это работает для меня:
> 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
По умолчанию количество разрывов составляет около 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 какое-то значение?
Я заметил, что в гистограмме плотность = относительная частота/ширина соответствующей ширины бункера
Пример 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
R имеет ошибку или что-то в этом роде. Если у вас есть дискретные данные в data.frame(с 1 столбцом) и называть гист (DF, freq = FALSE) на нем, относительная плотность будет неправильной (суммирование до > 1). Это не должно произойти, насколько я могу судить.
Решение состоит в том, чтобы сначала вызвать unlist() для объекта. Это фиксирует график.
(Я тоже изменил текст, данные из http://www.electionstudies.org/studypages/anes_timeseries_2012/anes_timeseries_2012.htm)