2010-11-17 16 views
15

Tenemos algunos datos que representan muchas ejecuciones de modelos bajo diferentes escenarios. Para un único escenario, nos gustaría mostrar la media suavizada, con las áreas llenas que representan la desviación estándar en un punto particular en el tiempo, en lugar de la calidad del ajuste de suavizado.Muestra la devación estándar usando geom_smooth y ggplot

Por ejemplo:

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() 

produce un gráfico con dos carreras representadas, y una media alisada, pero a pesar de la SD entre los tramos está aumentando, se mantienen las barras de suaves del mismo tamaño. Me gustaría hacer que los alrededores del más suave representen la desviación estándar en un determinado intervalo de tiempo.

¿Hay una forma no intensiva de mano de obra para hacer esto, teniendo en cuenta muchas ejecuciones diferentes y variables de salida?

Respuesta

15

hola yo no estoy seguro si entiendo correctamente lo que quiere, pero por ejemplo,

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) 

nota que mean_se va a aparecer en la próxima versión de ggplot2.

+0

¡Eso es maravilloso, gracias! –

Cuestiones relacionadas