Создайте гистограмму для взвешенных значений

Если у меня есть вектор (например, v<-runif(1000)), я могу построить его гистограмму (которая будет выглядеть более или менее как горизонтальная линия, потому что v — это выборка из равномерного распределения).

Однако предположим, что у меня есть вектор и связанные с ним веса (например, w<-seq(1,1000) в дополнение к v<-sort(runif(1000))). Например, это результат table() на гораздо большем наборе данных.

Как построить новую гистограмму? (в этом примере она должна быть более или менее похожа на строку y=x).

Я думаю, что я мог бы обратить вспять эффекты table, используя rep (hist(rep(v,w))), но это "решение" кажется уродливым и ресурсоемким (создает промежуточный вектор размера sum(w)), и оно поддерживает только целые веса.


person sds    schedule 07.11.2013    source источник
comment
Вы можете добавить weight к эстетическому отображению в ggplot, а затем использовать geom_histogram   -  person Jake Burkhead    schedule 07.11.2013
comment
@JakeBurkhead Я этого не знал! Не могли бы вы добавить это в качестве ответа?   -  person musically_ut    schedule 07.11.2013
comment
Вы также можете plot table. Однако результат не совсем гистограмма.   -  person BenBarnes    schedule 07.11.2013


Ответы (3)


Пакет plotrix имеет функцию weighted.hist, которая делает то, что вы хотите:

w<-seq(1,1000)
v<-sort(runif(1000))
weighted.hist(v, w)

Пример ‹code›weighted.hist‹/code›

person musically_ut    schedule 07.11.2013
comment
К вашему сведению, ссылка мертва. Вот информация о пакете cran.r-project.org/web/ пакеты/plotrix/index.html - person Adam_G; 15.06.2015
comment
@Adam_G Спасибо! Обновил ссылку в ответе. - person musically_ut; 15.06.2015
comment
Функция глючит: когда я пытаюсь добавить к ней кривую, она не строит ее в нужном месте... Попробуйте, например, `weighted.hist(rnorm(T),rep(1,T)/T,col =пшеница);кривая(dnorm(x),добавить=ИСТИНА)` - person Xi'an; 25.11.2015
comment
Почему линии идут ниже оси x? или, скорее, как вы можете остановить линии, идущие ниже оси x? - person dpel; 22.03.2016
comment
@DavidPell Это галочки на оси x. Это может помочь избавиться от них: .com/questions/10393076/ - person musically_ut; 22.03.2016
comment
@musically_ut окей, честно - вопрос стиля. Я смог удалить их с помощью: weighted.hist(v,w, xaxis=FALSE) - person dpel; 22.03.2016

library(ggplot2)
w <- seq(1,1000)
v <- sort(runif(1000))

foo <- data.frame(v, w)

ggplot(foo, aes(v, weight = w)) + geom_histogram()

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

person Jake Burkhead    schedule 07.11.2013
comment
Это фантастика; так легко делать взвешенные гистограммы - и это работает! Но вес не указан в документации (ggplot 3.1.1) как эстетика для geom_histogram(...). Как вы узнали об этом? - person jlhoward; 07.06.2019
comment
Он используется в примерах для geom_histogram. Не знаю, как я узнал об этом 5+ лет назад. - person Jake Burkhead; 07.06.2019

Альтернативой из пакета weights является wtd.hist()

w<-seq(1,1000) v<-sort(runif(1000)) wtd.hist(x=v,weight=w) введите здесь описание изображения

person dpel    schedule 22.03.2016