2016-02-06 4 views
2

Я пытаюсь построить график, в котором я рисую нормально распределенные переменные, показывающие их среднее значение по оси x и стандартное отклонение (SD) по оси y. Своего рода график плотности, но вместо того, чтобы иметь плотность по оси y, я хочу иметь SD (значение).Иллюстрировать среднее и стандартное отклонение в графике плотности ggplot2

Я работаю с ниже данными,

set.seed(1) 
mu1 <- rnorm(10^5, mean = 1, sd = 1) 
mu3 <- rnorm(10^5, mean = 3, sd = 2) 

два нормально распределенных переменных. Здесь их среднее и сд,

# install.packages("tidyverse", dependencies = TRUE) 
require(tidyverse) 
tibble(mu1, mu3) %>% summarise_all(funs(mean, sd)) 
#> # A tibble: 1 x 4 
#> mu1_mean mu3_mean mu1_sd mu3_sd 
#>  <dbl> <dbl>  <dbl> <dbl> 
#> 1 0.9993454 3.000825 0.9982848 1.998234 

Я играл с и другие пакеты, чтобы приблизиться к тому, что я хочу. Я также пробовал копировать this function из сюжетного плана, делающего что-то подобное, добившись успеха.

Вот мой старт,

tibble(mu1, mu3) %>% gather() %>% ggplot() + 
    geom_density(aes(x = value, colour = key)) + 
    labs(x = 'mean', y = 'currently density, but I would like sd') 

plot

+2

У вас есть пример сюжета вы имеете в виду? (Может быть рисунок). Какое сообщение должен передать ваш сюжет? – Heroka

+0

Я более или менее хочу, что в сюжете вы видите, но я хочу стандартное отклонение по оси y вместо плотности. Имеет ли это смысл? –

+3

Не совсем мне, так как sd - только одно число. Он не меняется по распределению (как показывает плотность). – Heroka

ответ

7

Среднее значение и стандартное отклонение измеряется по шкале х, так что вам нужно, чтобы построить их вдоль оси х. Ось y представляет собой плотность точек в пределах заданного x-интервала и аналогична высоте баров в гистограмме.

Возможно, это даст вам что-то вроде того, что вы искали: В приведенном ниже коде добавлена ​​горизонтальная линия, которая охватывает стандартное отклонение каждого графика плотности, а также осколки, чтобы отметить их местоположение по оси x. Строка sd находится по y-значению, где ширина распределения равна стандартным отклонениям. Если вы хотите, вы могли бы дополнительно (или вместо этого) заполнить регион, натянутый стандартным отклонением.

library(dplyr) 

# Densities 
n = 2^10 
df = data.frame(x = c(density(foo,n=n)$x, density(bar,n=n)$x), 
       y = c(density(foo,n=n)$y, density(bar,n=n)$y), 
       group=rep(c("foo","bar"), each=n)) 

## Mean and SD 
msd = melt(data.frame(foo=foo, bar=bar)) %>% 
     group_by(group=variable) %>% summarise(mean=mean(value), sd=sd(value)) 

# Find y value (of density) where sd has same width as density 
msd$y = unlist(lapply(unique(df$group), function(g) { 
    d = df[df$group==g,] 
    d$y[which.min(abs(d$x - (msd$mean[msd$group==g] - msd$sd[msd$group==g])))] 
})) 

ggplot(df, aes(x=x, y=y, colour=group)) + 
    geom_line() + labs(x = NULL) + 
    geom_segment(data=msd, aes(y=y,yend=y, x=mean - sd, xend=mean + sd), lty="21") + 
    geom_point(data=msd, aes(y=y, x=mean)) + 
    geom_segment(data=msd, aes(x=mean-sd, xend=mean-sd, y=0, yend=y), alpha=0.5, lty="21") + 
    geom_segment(data=msd, aes(x=mean+sd, xend=mean+sd, y=0, yend=y), alpha=0.5, lty="21") 

enter image description here

+0

Что такое «%>%», это не работает для меня, это какая-то труба? Я этого никогда не видел. –

+1

Да, это оператор трубы из пакета 'dplyr'. См. Раздел «трубопровод» [виньетка 'dplyr'] (https://cran.r-project.org/web/packages/dplyr/vignettes/dplyr.html). – eipi10