2010-04-10 31 views
5

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.

Respuesta

14

¿Ha probado el argumento family = "symmetric" al geom_smooth (que a su vez pasará a loess)? Esto hará que el loess sea resistente a los valores atípicos.

Sin embargo, mirando sus datos, ¿por qué cree que un ajuste lineal no es adecuado? Solo tiene 4 valores x, y ciertamente no parece haber una fuerte evidencia de una desviación de la linealidad.

+0

obtengo 'error: parámetros desconocidos: family' cuando intento esto. – JayCo

+1

¡Lo descubrí! La sintaxis correcta es 'geom_smooth (method = loess, method.args = list (family =" simétrico "))' – JayCo

2

En primer lugar, no estoy seguro de que un 'valor atípico' esté definido correctamente en datos tan pequeños.

En segundo lugar, entonces tendría que decidir qué quiere decir con "atípico", es decir, ¿es uno de los medicamentos, uno de los repetidores o uno de los puntos de tiempo?

Como señala Hadley, hay poca evidencia de desviación de la linealidad.

Por último, creo que una parte del punto de utilizar un suavizador es que se relaciona bien con los valores atípicos, siempre que haya suficientes datos. Pero tienes muy poco.

Entonces, tengo que preguntar exactamente por qué quiere eliminar valores atípicos. Es decir, ¿qué vas a hacer con estos datos (además de hacer buenas tramas)?

espero que esto ayude a

Cuestiones relacionadas