[R-es] Grafico de medias con barra de desviacion para varias series de datos

Argel Gastélum Arellánez argel.gastelum en gmail.com
Lun Sep 24 19:38:34 CEST 2012


El 23/09/12 09:18, Eric escribió:
> Estimada comunidad, tengo el siguiente problema:
>
> Estoy haciendo un experimento de toxicidad de solventes para 
> microalgas, por ahora tengo los datos de un solvente en 5 diferentes 
> concentraciones y un control, cada unidad experimental tiene 3 
> repeticiones, y necesito graficar las curvas de crecimiento del 
> cultivo de algas. Tendria 6 curvas de crecimiento. Puse los datos en 
> la tabla que adjunto como archivo .csv. La primera columna corresponde 
> a los dias de crecimiento del alga y deberia ir en el eje X, la 
> segunda columna indica la repeticion, la tercera columna indica el 
> tipo de solvente usado ss=sin solvente y lim=limoneno, la columna con 
> indica la concentracion del solvente y va de 1 a 5, la columna ABS es 
> la medicion que se hizo e indica la absorbancia de la muestra.
>
>  He intentado con PlotMeans y lattice pero no logro obtener el grafico 
> que deseo. Es como si fuera necesario fundir esos dos paquetes para 
> obtener loque necesito, ya que PlotMeans me permite graficar las 
> medias con las barras de desviacion, pero no permite (al menos no he 
> encontrado como) clasificar o diferenciar las concentraciones, por su 
> lado con lattice puedo diferenciar las concentraciones pero no puedo 
> graficar el promedio con las barras de desviacion (al menos no se como 
> hacerlo) ... este es mi problema, alguna sugerencia ??
>
> Un abrazo a todos y gracias por su tiempo.
>
> Eric.

     Hola Eric, ¿tal vez algo como esto es lo que necesitas?. Es un poco 
largo y a mano, seguramente hay paquetes que lo hacen de forma mucho más 
simplificada, espero te sirva... Saludos!




#-------------------------------------------------------------------------------

# Crecimiento de algas, efecto de solventes.

DATOS <- read.table("curvadecrecimientobraunii2.csv", header=T, sep="\t")

DATOS

class(DATOS$dia)

class(DATOS$con)

DATOS$con <- factor(DATOS$con)

class(DATOS$con)

class(DATOS$Abs)

#-------------------------------------------------------------------------------

# FUNCIÓN PARA CALCULAR MEDIAS Y DESVIACIONES ESTÁNDAR:

x.s <- function(respuesta = "", factor = "", datos, nombre.experimento = 
"Nombre No Definido", nombre.respuesta = "Nombre No Definido", 
nombre.factor = "Nombre No Definido"){

     # Esta función calcula las "medias" y las "desviaciones estándar" 
de una "variable de respuesta" para cada nivel de una "variable 
explicativa" o "factor", mostrando los resultados en forma de una tabla.

     # Preparar el marco de datos:
     RESPUESTA <- datos[respuesta]
     FACTOR <- datos[factor]
     MARCO.DE.DATOS <- data.frame(FACTOR, RESPUESTA)
     attributes(MARCO.DE.DATOS)$names <- c("FACTOR", "RESPUESTA")

     cat("\n \n \n \n")

     # Calcular las medias de la respuesta para cada nivel del factor.
     medias <- c()
     for(i in 1:length(levels(MARCO.DE.DATOS$FACTOR))){
         medias <- c(medias,
mean(MARCO.DE.DATOS$RESPUESTA[MARCO.DE.DATOS$FACTOR == 
(levels(MARCO.DE.DATOS$FACTOR)[i])]))
     }

     # Calcular las desviaciones estándar de la respuesta
     # para cada nivel del factor.
     desv.est <- c()
     for(i in 1:length(levels(MARCO.DE.DATOS$FACTOR))){
         desv.est <- c(desv.est,
sd(MARCO.DE.DATOS$RESPUESTA[MARCO.DE.DATOS$FACTOR == 
(levels(MARCO.DE.DATOS$FACTOR)[i])]))
     }

     # Generar la tabla de datos:
     tabla <- data.frame(medias, desv.est)
     attributes(tabla)$row.names <- levels(MARCO.DE.DATOS$FACTOR)
     attributes(tabla)$names <- c("Media", "Desviación estándar")

     # Para que se muestre en consola el resultado, independientemente 
de que se asigne el resultado a un objeto:
     cat("\n ESTADÍSTICA DESCRIPTIVA \n", "\n EXPERIMENTO:", 
nombre.experimento,
         "\n RESPUESTA:", nombre.respuesta, "\n FACTOR:", nombre.factor, 
"\n", "\n")
     print(tabla)

     # Para poder asignar el resultado a un objeto determinado:
     return(list(TITULO = "ESTADÍSTICA DESCRIPTIVA", EXPERIMENTO = 
nombre.experimento, RESPUESTA = nombre.respuesta, FACTOR = 
nombre.factor, TABLA = tabla))

}

#-------------------------------------------------------------------------------

# Subset de datos para con = 0:

DATOS.indices.NO_con0 <- which(DATOS$con != c("0"))
DATOS.indices.NO_con0
DATOS.con0 <- DATOS[-DATOS.indices.NO_con0, ]
DATOS.con0
DATOS.con0$con <- factor(DATOS.con0$con)
DATOS.con0

# Verificando el tipo de dato para cada columna:

class(DATOS.con0)
class(DATOS.con0$dia)
DATOS.con0$dia <- factor(DATOS.con0$dia)
class(DATOS.con0$dia)
class(DATOS.con0$con)
class(DATOS.con0$Abs)

DESCRIPTIVA.con0 <- x.s(respuesta = "Abs", factor = "dia", datos = 
DATOS.con0, nombre.experimento = "Solventes y crecimiento, con = 0", 
nombre.respuesta = "Absorbancia", nombre.factor = "Tiempo (días)")

TABLA.con0 <- DESCRIPTIVA.con0$TABLA

TABLA.con0

#-------------------------------------------------------------------------------

# Subset de datos para con = 1:

DATOS.indices.NO_con1 <- which(DATOS$con != c("1"))
DATOS.indices.NO_con1
DATOS.con1 <- DATOS[-DATOS.indices.NO_con1, ]
DATOS.con1
DATOS.con1$con <- factor(DATOS.con1$con)
DATOS.con1

# Verificando el tipo de dato para cada columna:

class(DATOS.con1)
class(DATOS.con1$dia)
DATOS.con1$dia <- factor(DATOS.con1$dia)
class(DATOS.con1$dia)
class(DATOS.con1$con)
class(DATOS.con1$Abs)

DESCRIPTIVA.con1 <- x.s(respuesta = "Abs", factor = "dia", datos = 
DATOS.con1, nombre.experimento = "Solventes y crecimiento, con = 1", 
nombre.respuesta = "Absorbancia", nombre.factor = "Tiempo (días)")

TABLA.con1 <- DESCRIPTIVA.con1$TABLA

TABLA.con1

#-------------------------------------------------------------------------------

# Para graficar las barras de error con "errbar"
library(sfsmisc)

par(mar = c(5, 4, 2, 2) + 0.2) # Modifica los márgenes: c(bottom, left, 
top, right), los valores por default son c(5, 4, 4, 2).
par(las=1) # Orientación de los números en los ejes: 0: always parallel 
to the axis [default], 1: always horizontal, 2: always perpendicular to 
the axis, 3: always vertical.
plot(as.numeric(attributes(TABLA.con0)$row.names), TABLA.con0$Media, 
axes = T, ylim = c(0, 250), xlab = list("Tiempo (días)", cex = 1.2, col 
= "black", font = 2), ylab = list("Abs",  cex = 1.2, col = "black", font 
= 2), type = "n", col = "black", main = "Crecimiento vs tiempo", xlim = 
c(0, 5), lwd = 2)

par(new=T) # Para graficar la nueva gráfica sobre la misma gráfica anterior.

errbar(as.numeric(attributes(TABLA.con0)$row.names), TABLA.con0$Media, 
yplus = TABLA.con0$Media + TABLA.con0[, 2], yminus = TABLA.con0$Media - 
TABLA.con0[, 2], axes = F, ylim = c(0, 250), xlab = "", ylab = "", type 
= "l", col = "black", main = "", xlim = c(0, 5), lwd = 2, lty = 1)

points(as.numeric(attributes(TABLA.con0)$row.names), TABLA.con0$Media, 
cex = 1.2, pch = 21, col = "black", bg = "black")

par(new=T) # Para graficar la nueva gráfica sobre la misma gráfica anterior.

par(fg="blue")
errbar(as.numeric(attributes(TABLA.con1)$row.names), TABLA.con1$Media, 
yplus = TABLA.con1$Media + TABLA.con1[, 2], yminus = TABLA.con1$Media - 
TABLA.con1[, 2], axes = F, ylim = c(0, 250), xlab = "", ylab = "", type 
= "l", col = "blue", main = "", xlim = c(0, 5), lwd = 2, lty = 2)

points(as.numeric(attributes(TABLA.con1)$row.names), TABLA.con1$Media, 
cex = 1.2, pch = 21, col = "blue", bg = "blue")

#-------------------------------------------------------------------------------

legend(
     "bottomright", # Posición en la gráfica.
     legend = c( # Leyendas a colocar.
         "con = 0",
         "con = 1"
     ),
     bty = "n", # Con borde "o", sin borde "n".
     col = c("black", "blue"), # Color de línea y de borde de símbolo.
     lty = c(1, 2), # Tipo de línea.
     lwd = c(2, 2), # Grosor de línea.
     pch = c(21, 21), # Tipo de símbolo.
     pt.bg = c("black", "blue") # Color de relleno del símbolo.
)

#-------------------------------------------------------------------------------



Más información sobre la lista de distribución R-help-es