Tengo el siguiente conjunto de datos que intento trazar con ggplot2, es una serie temporal de tres experimentos A1, B1 y C1 y cada experimento tiene tres repeticiones.R: ¿Cómo eliminar los valores atípicos de un suavizador en ggplot2?
Estoy tratando de agregar una estadística que detecta y elimina valores atípicos antes de devolver un suavizador (media y varianza?). He escrito mi propia función atípica (no se muestra) pero espero que ya haya una función para hacer esto, simplemente no la he encontrado.
He visto stat_sum_df ("median_hilow", geom = "smooth") de algunos ejemplos en el libro ggplot2, pero no entendí el documento de ayuda de Hmisc para ver si elimina valores atípicos o no.
¿Existe una función para eliminar valores atípicos como este en ggplot, o donde podría modificar mi código a continuación para agregar mi propia función?
EDITAR: Acabo de ver esto (How to use Outlier Tests in R Code) y observo que Hadley recomienda el uso de un método robusto como rlm. Estoy trazando curvas de crecimiento bacteriano, por lo que no creo que un modelo lineal sea el mejor, pero se agradecerá cualquier consejo sobre otros modelos o el uso o uso de modelos robustos en esta situación.
library (ggplot2)
data = data.frame (day = c(1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7), od =
c(
0.1,1.0,0.5,0.7
,0.13,0.33,0.54,0.76
,0.1,0.35,0.54,0.73
,1.3,1.5,1.75,1.7
,1.3,1.3,1.0,1.6
,1.7,1.6,1.75,1.7
,2.1,2.3,2.5,2.7
,2.5,2.6,2.6,2.8
,2.3,2.5,2.8,3.8),
series_id = c(
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1"),
replicate = c(
"A1.1","A1.1","A1.1","A1.1",
"A1.2","A1.2","A1.2","A1.2",
"A1.3","A1.3","A1.3","A1.3",
"B1.1","B1.1","B1.1","B1.1",
"B1.2","B1.2","B1.2","B1.2",
"B1.3","B1.3","B1.3","B1.3",
"C1.1","C1.1","C1.1","C1.1",
"C1.2","C1.2","C1.2","C1.2",
"C1.3","C1.3","C1.3","C1.3"))
> data
day od series_id replicate
1 1 0.10 A1 A1.1
2 3 1.00 A1 A1.1
3 5 0.50 A1 A1.1
4 7 0.70 A1 A1.1
5 1 0.13 A1 A1.2
6 3 0.33 A1 A1.2
7 5 0.54 A1 A1.2
8 7 0.76 A1 A1.2
9 1 0.10 A1 A1.3
10 3 0.35 A1 A1.3
11 5 0.54 A1 A1.3
12 7 0.73 A1 A1.3
13 1 1.30 B1 B1.1
... etc...
Esto es lo que tengo hasta ahora y está trabajando muy bien, pero los valores atípicos no se eliminan:
r <- ggplot(data = data, aes(x = day, y = od))
r + geom_point(aes(group = replicate, color = series_id)) + # add points
geom_line(aes(group = replicate, color = series_id)) + # add lines
geom_smooth(aes(group = series_id)) # add smoother, average of each replicate
EDIT: Me acaba de añadir dos gráficos siguientes muestran ejemplos de los problemas de valores atípicos que estoy teniendo de los datos reales en lugar de los datos de ejemplo anteriores.
Las primeras tramas muestran la serie p26s4 y alrededor del día 32 algo realmente extraño sucedió en dos de las réplicas, mostrando 2 valores atípicos.
La segunda gráfica muestra la serie p22s5 y el día 18, algo extraño continuó con la lectura de ese día, probablemente un error de máquina, creo.
Por el momento estoy observando los datos, para comprobar que las curvas de crecimiento se ven bien. Después de tomar el consejo de Hadley y establecer familia = "simétrica", estoy seguro de que el loess smooth hace un trabajo decente al ignorar los valores atípicos.
p26s4 shows around day 32 something really weird went on in two of the replicates, showing 2 outliers http://img696.imageshack.us/img696/8743/p26s4loess.png p22s5 shows that on day 18, something weird went on with the reading that day, likely machine error I think http://img521.imageshack.us/img521/8083/p22s5loess.png
@ Peter/@ Hadley, lo siguiente que me gustaría hacer es tratar de adaptarse a una logística, Gompertz o curva de crecimiento de Richard a estos datos en lugar de un loess y calcular el crecimiento tasa en la etapa exponencial. Eventualmente planeo usar el paquete grofit en R (http://cran.r-project.org/web/packages/grofit/index.html), pero por ahora me gustaría trazar estos manualmente usando ggplot2 si es posible. Si tiene algún apuntador, sería muy apreciado.
obtengo 'error: parámetros desconocidos: family' cuando intento esto. – JayCo
¡Lo descubrí! La sintaxis correcta es 'geom_smooth (method = loess, method.args = list (family =" simétrico "))' – JayCo