R Hist: взаимосвязь между значением «перерывов» и количеством / размером ячеек

Что касается функции 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 единицы» или что-то совершенно другое?

Я был бы очень признателен за любой намек, помощь, указатели любого рода.

Спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 073
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В документации для 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))

Histogram with 4 bins

Обратите внимание, что вам нужно использовать 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))

Histogram 2

Дальнейшее объяснение 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

Не очень.

Так что это может быть легко и красиво, но без хорошего контроля по количеству ящиков ИЛИ вы можете контролировать количество мусорных ведер за счет большего количества работы и более уродливых границ.

WoW, большое спасибо за это прекрасное объяснение. Кроме того, я хочу спросить: что на самом деле означает breaks = n? означает ли это, что я "хочу получить" n критических точек (BP)? почему в моем случае break = 3 приводит к 4 BP, а break = 9 приводит к 13 BP? Есть ли действительно алгоритм для их вычисления и поиска?

MMEL 02.05.2018 04:46

Добавление к ответу.

G5W 02.05.2018 15:15

Большое спасибо за этот замечательный ответ! Это лучший и наиболее полный ответ, который я когда-либо получал или видел на SOF. Вы, очевидно, являетесь экспертом по R и обладаете искусством объяснять вещи. Я считаю, что ваш ответ намного лучше, чем справочная страница? Hist. Я думаю, что использование вами возвращенных вычисленных значений с помощью plot = FALSE и демонстраций, которые вы предоставили с их использованием, было наиболее полезным.

MMEL 02.05.2018 22:43

Рад, что ответ вам помог.

G5W 02.05.2018 22:47

Согласно R (R version 3.3.2) help: ?hist, The default for breaks is "Sturges". Должен быть способ разбить данные.

Nick Dong 19.03.2019 16:25

Другие вопросы по теме