Показать стандартное отклонение с помощью geom_smooth и ggplot

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

Например:

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 между циклами увеличивается, более плавные полосы остаются одинаковыми. Я бы хотел, чтобы окружения более гладкого изображения представляли собой стандартное отклонение с заданным временным интервалом.

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

Ответы

Ответ 1

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

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.

Ответ 2

Принятый ответ работает, только если измерения выровнены/дискретизированы по 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