R: Взвешенный график Joyplot/Ridgeplot/Density?

Я пытаюсь создать джойплот, используя ggridges пакет (на основе ggplot2). Общая идея заключается в том, что джойплоты создают красиво масштабированные графики плотности. Тем не менее, я не могу произвести одно из них, используя взвешенную плотность. Есть ли какой-нибудь способ включения весов выборки (для взвешенной плотности) в расчет плотностей при создании джойплота?

Вот ссылка на документацию для ggridges пакет: https://cran.r-project.org/web/packages/ggridges/ggridges.pdf Я знаю, что многие пакеты на основе ggplot могут принимать дополнительную эстетику, но я не знаю, как добавить веса к этому типу геом.

Кроме того, вот пример невзвешенного джойплота в ggplot. Я пытаюсь преобразовать это в взвешенный график с плотностью, взвешенной в соответствии с весом.

# Load package, set seed
library(ggplot)
set.seed(1)

# Create an example dataset
dat <- data.frame(group = c(rep("A",100), rep("B",100)),
                  pweight = runif(200),
                  val = runif(200))

# Create an example of an unweighted joyplot
ggplot(dat, aes(x = val, y = group)) + geom_density_ridges(scale= 0.95)

1 ответ

Решение

Похоже, что способ сделать это заключается в использовании stat_density а не по умолчанию stat_density_ridges, Согласно документам, на которые вы ссылались:

Обратите внимание, что по умолчанию stat_density_ridges делает оценку плотности соединения по всем наборам данных. Это может не дать желаемого результата при использовании граненых графиков. В качестве альтернативы вы можете установить stat = "density" использовать stat_density, В этом случае требуется добавить эстетическое отображение height = ..density.. (см. примеры).

К счастью, stat_density (В отличие от stat_density_ridges) понимает эстетику weight и передаст его основному density вызов. Вы получите что-то вроде:

ggplot(dat, aes(x = val, y = group)) +
  geom_density_ridges(aes(height=..density..,  # Notice the additional
                          weight=pweight),     # aes mappings
                      scale= 0.95,
                      stat="density") # and use of stat_density

..density.. переменная автоматически генерируется stat_density,

Примечание: похоже, что при использовании stat_density диапазон оси x ведет себя немного по-другому: он подгоняет график плотности к диапазону данных и удаляет симпатичные хвосты. Вы можете легко исправить это, вручную расширив ось X, но я подумал, что стоит упомянуть.

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