Показать стандартное отклонение, используя geom_smooth и ggplot - PullRequest
15 голосов
/ 17 ноября 2010

У нас есть некоторые данные, которые представляют множество прогонов модели в разных сценариях.Для одного сценария мы хотели бы отобразить сглаженное среднее с заполненными областями, представляющими стандартное отклонение в конкретный момент времени, а не качество соответствия сглаживания.

Например:

d <- as.data.frame( rbind( cbind( 1:20, 1:20,1 ), cbind(1:20, -1:-20,2 ) ) )
names(d)<-c("Time","Value","Run")
ggplot( d, aes(x=Time,y=Value) ) + geom_line( aes(group=Run) ) + geom_smooth()

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

Существует ли не требующий больших трудозатрат способ сделать это, учитывая множество различных прогонов и выходных переменных?

Ответы [ 2 ]

16 голосов
/ 17 ноября 2010

привет, я не уверен, правильно ли я понимаю, что вы хотите, но, например,

d <- data.frame(Time=rep(1:20, 4), 
                Value=rnorm(80, rep(1:20, 4)+rep(1:4*2, each=20)),
                Run=gl(4,20))

mean_se <- function(x, mult = 1) {  
  x <- na.omit(x)
  se <- mult * sqrt(var(x) / length(x))
  mean <- mean(x)
  data.frame(y = mean, ymin = mean - se, ymax = mean + se)
}

ggplot( d, aes(x=Time,y=Value) ) + geom_line( aes(group=Run) ) + 
  geom_smooth(se=FALSE) + 
  stat_summary(fun.data=mean_se, geom="ribbon", alpha=0.25)

обратите внимание, что mean_se появится в следующей версии ggplot2.

0 голосов
/ 17 мая 2019

Принятый ответ работает, только если измерения выровнены / дискретизированы по x. В случае непрерывных данных вы можете использовать скользящее окно и добавить пользовательскую ленту

iris %>%
    ## apply same grouping as for plot
    group_by(Species) %>%
    ## Important sort along x!
    arrange(Petal.Length) %>%
    ## calculate rolling mean and sd
    mutate(rolling_sd=rollapply(Petal.Width, width=10, sd,  fill=NA), rolling_mean=rollmean(Petal.Width, k=10, fill=NA)) %>%  # table_browser()
    ## build the plot
    ggplot(aes(Petal.Length, Petal.Width, color = Species)) +
    # optionally we could rather plot the rolling mean instead of the geom_smooth loess fit
    # geom_line(aes(y=rolling_mean), color="black") +
    geom_ribbon(aes(ymin=rolling_mean-rolling_sd/2, ymax=rolling_mean+rolling_sd/2), fill="lightgray", color="lightgray", alpha=.8) +
    geom_point(size = 1, alpha = .7) +
    geom_smooth(se=FALSE)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...