2015-06-01 6 views
2

В настоящее время я рисую несколько различных распределений первых отличий от ряда моделей регрессии в ggplot. Чтобы облегчить интерпретацию различий, я хочу отметить 2,5% и 97,5% процентилей каждого дистрибутива. Поскольку я буду делать довольно много графиков, и поскольку данные сгруппированы в два измерения (модель и тип), я бы хотел определить и построить соответствующие процентили в среде ggplot. Построение распределений с использованием граней позволяет мне точно, где я хочу, за исключением процентов. Я мог бы, конечно, сделать это более вручную, но в идеале я хотел бы найти решение, где я все еще могу использовать facet_grid, так как это избавило меня от многих хлопот, пытаясь совместить разные сюжеты.Границы квантов распределения в ggplot2 с гранями

Вот пример использования моделируемых данных:

df.example <- data.frame(model = rep(c("a", "b"), length.out = 500), 
         type = rep(c("t1", "t2", "t2", "t1"), 
         length.outh = 250), value = rnorm(1000)) 

ggplot(df.example, aes(x = value)) + 
facet_grid(type ~ model) + 
geom_density(aes(fill = model, colour = model)) 

Я пытался добавить квантили двух способов. Первый выдает сообщение об ошибке:

ggplot(df.example, aes(x = value)) + 
facet_grid(. ~ model) + 
geom_density(aes(fill = model, colour = model)) + 
geom_vline(aes(x = value), xintercept = quantile(value, probs = c(.025, .975))) 
Error in quantile(value, probs = c(0.025, 0.975)) : object 'value' not found 

Хотя второй один получает меня квантили для полной переменной, а не для суб-плотностей. То есть построенные квантиля одинаковы для всех четырех плотностей.

ggplot(df.example, aes(x = value)) + 
facet_grid(type ~ model) + 
geom_density(aes(fill = model, colour = model)) + 
geom_vline(xintercept = quantile(df.example$value, probs = c(.025, .975))) 

Я поэтому интересно, если есть способ построить конкретные квантили для каждой подгруппы в среде ggplot2?

Очень цените любой вход.

ответ

3

Вы можете рассчитать квантили заранее.

Используя ваш пример данных:

library (dplyr) 
d2 <- df.example %>% 
    group_by(model, type) %>% 
    summarize(lower = quantile(value, probs = .025), 
      upper = quantile(value, probs = .975)) 

А затем построить так:

ggplot(df.example, aes(x = value)) + 
    facet_grid(type ~ model) + 
    geom_density(aes(fill = model, colour = model)) + 
    geom_vline(data = d2, aes(xintercept = lower)) + 
    geom_vline(data = d2, aes(xintercept = upper)) 

enter image description here

+1

Отличное предложение. Благодаря! – chrstnsn

5

Использования plyr (или dplyr, data.table) для предвычисления этих значений ...

set.seed(1) 
# ... 

df.q <- ddply(df.example, .(model, type), 
       summarize, q=quantile(value, c(.025, .975)))  
p + geom_vline(aes(xintercept=q), data=df.q) 

plot

+0

Отличное предложение. Благодаря! – chrstnsn

0

Хороший вопрос. Более общая версия того же вопроса: как вы называете функции на подмножествах данных при использовании граней? Это кажется очень полезной функцией, поэтому я искал, но ничего не мог найти.

Ответы, которые уже даны, являются отличными. Другим вариантом является использование multiplot() в качестве способа выполнения огранки вручную.

+0

Согласен. Оба решения очень аккуратные, но, как вы заметили, на самом деле не решает проблему, которую я задаю в своем вопросе. Это действительно очень интересная функция для ggplot. – chrstnsn

Смежные вопросы