Что касается функции HIST / hist () в R / Может ли кто-нибудь помочь мне найти:
очень простое определение, объясняющее взаимосвязь между указанным значением «разрывов» и количеством бинов, созданных в гистограмме?
Например, я использую базовый набор данных, предоставляемый инструментом R:
data(mtcars)
hist(mtcars$mpg, break=3) --> will draw 3 bins (really??? weird!)
hist(mtcars$mpg, break=4) --> will draw 5 bins
hist(mtcars$mpg, break=5) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=6) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=7) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=8) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=9) --> will draw 11 bins (why???)
Почему разрывы = 4,5,6,7,8 приводят к одному и тому же количеству ящиков, а разрывы = 3 приводят только к 4 ячейкам, ...?
Документацию R, которую вы можете найти на? Hist или по следующей ссылке: http: //localhost//library/graphics/html/hist.html
на самом деле не помогло, и я попытался установить какую-либо связь между значением, указанным в "breaks =", размером корзины и количеством корзин, и я не смог найти легкую или простую формулу или объяснение для вычитания такой "ссылки".
Я просто не понимаю, что значит "breaks = 3"? Означает ли это «3 перерыва» или «перерыв через каждые 3 единицы» или что-то совершенно другое?
Я был бы очень признателен за любой намек, помощь, указатели любого рода.
Спасибо.
В документации для hist
сказано, что когда вы указываете разрывы как одно число (как вы это делали), тогда
the number is a suggestion only; as the breakpoints will be set to pretty values
Если вы перейдете по ссылке на документацию для pretty
, там написано
The values are chosen so that they are 1, 2 or 5 times a power of 10.
Вы не можете охватить промежуток между 10 и 35 в 4 равномерно распределенных кратных 1,2, 5 или 10, поэтому он выбрал 5 интервалов (6 точек разрыва). Если вам действительно нужны четыре равномерно расположенных ящика, вы можете использовать
hist(mtcars$mpg, seq(10,35, length.out=5))
Обратите внимание, что вам нужно использовать length.out = 5, чтобы получить четыре ячейки (четыре начальные точки плюс одна дополнительная конечная точка). Конечно, это не дает «хорошеньких» значений.
Если вам не нравится, что отметки на оси x не совпадают с ячейками (мне не нравится), вы можете оставить оси в hist
и добавить их самостоятельно.
H = hist(mtcars$mpg, seq(10,35, length.out=5), axes=FALSE, ylim=c(0,14))
axis(side=1, at=seq(10,35, length.out=5))
axis(side=2, pretty(0:14))
breaks
В документации ?hist
под перерывами сказано, что существует 5 типов значений, которые вы можете использовать для перерывов. Вы используете:
a single number giving the number of cells for the histogram
НО, как указано выше, в документации добавлено:
the number is a suggestion only; the breakpoints will be set to pretty values.
Поэтому, когда вы даете hist
аргумент breaks=4
, он знает, что вы хочу 4 бина, но он также будет настаивать на использовании «красивых» значений для границ, то есть равномерно распределенных кратных 1,2, 5 раз в степени десяти. Также могут быть ограничения на конечные точки.
Давайте исследуем, что он делает с вашими данными mtcars $ mpg.
Вы можете получить много информации о том, что делает hist
, сохранив возвращаемое значение. Я также подавлю фактическое построение гистограммы, поскольку сейчас меня интересует только значение.
HV = hist(mtcars$mpg, 4, plot=FALSE)
Вы можете распечатать HV и увидеть, что там много информации
насчет гистограммы. Все, о чем мы здесь заботимся, хранится в breaks
.
HV$breaks
[1] 10 15 20 25 30 35
Это дает 6 граничных значений для ячеек (для 5 ячеек требуется
6 граничных значений). Но мы просили 4 ящика, а не 5! Если вы разделитесь
диапазон 10-35 в четыре ячейки, вы получите границы
10, 16,25, 22,5, 28,75 и 35. Это не "красивые" граничные значения.
Вместо этого hist
использует функцию pretty
, чтобы найти более подходящие значения для границ, но это означает, что он должен отказаться от использования 4 интервалов.
Сколько точек останова мы получаем для диапазона значений разрывов? Попробуем 2 перерыва до 20 перерывов.
sapply(2:20, function(n)
length(hist(mtcars$mpg, n, plot=FALSE)$breaks))
[1] 4 4 6 6 6 6 6 13 13 13 13 13 13 13 13 25 25 25 25
Еще раз обратите внимание: 4 точки останова означают 3 ячейки. 6 точек останова означают 5 ячеек. Всего четыре разных расщепления, которые создаются. Кто они такие?
unique(lapply(2:20, function(n) hist(mtcars$mpg, n, plot=FALSE)$breaks))
[[1]]
[1] 10 20 30 40
[[2]]
[1] 10 15 20 25 30 35
[[3]]
[1] 10 12 14 16 18 20 22 24 26 28 30 32 34
[[4]]
[1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Границы меняются на 10, 5 2 или 1 - красивые границы.
Если вы хотите иметь больший контроль, вам нужно указать
где вы хотите границ. Это то, что я сделал в приведенном выше примере. Один из других вариантов указания breaks
:
a vector giving the breakpoints between histogram cells
Это то, что я использовал, когда указывал seq(10,35, length.out=5)
.
Но обратите внимание на значения:
seq(10,35, length.out=5)
[1] 10.00 16.25 22.50 28.75 35.00
Не очень.
Так что это может быть легко и красиво, но без хорошего контроля по количеству ящиков ИЛИ вы можете контролировать количество мусорных ведер за счет большего количества работы и более уродливых границ.
Добавление к ответу.
Большое спасибо за этот замечательный ответ! Это лучший и наиболее полный ответ, который я когда-либо получал или видел на SOF. Вы, очевидно, являетесь экспертом по R и обладаете искусством объяснять вещи. Я считаю, что ваш ответ намного лучше, чем справочная страница? Hist. Я думаю, что использование вами возвращенных вычисленных значений с помощью plot = FALSE и демонстраций, которые вы предоставили с их использованием, было наиболее полезным.
Рад, что ответ вам помог.
Согласно R (R version 3.3.2) help: ?hist
, The default for breaks is "Sturges"
. Должен быть способ разбить данные.
WoW, большое спасибо за это прекрасное объяснение. Кроме того, я хочу спросить: что на самом деле означает breaks = n? означает ли это, что я "хочу получить" n критических точек (BP)? почему в моем случае break = 3 приводит к 4 BP, а break = 9 приводит к 13 BP? Есть ли действительно алгоритм для их вычисления и поиска?