Pregunta

Tengo el siguiente conjunto de datos que estoy tratando de trazar con GGPLOT2, es una serie temporal de tres experimentos A1, B1 y C1 y cada experimento tuvo tres réplicas.

Estoy tratando de agregar una estadística que detecte y elimine los valores atípicos antes de devolver una más suave (¿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 mirado stat_sum_df ("mediano_hilow", geom = "suave") de algunos ejemplos en el libro GGPLOT2, pero no entendí el documento de ayuda de HMISC para ver si elimina los valores atípicos o no.

¿Existe una función para eliminar valores atípicos como este en GGPLOT, o dónde enmendaría mi código a continuación para agregar mi propia función?

Editar: acabo de ver esto (Cómo usar pruebas atípicas en el código R) y observe que Hadley recomienda usar un método robusto como RLM. Estoy tramando curvas de crecimiento bacteriano, por lo que no creo que un modelo lineal sea el mejor, pero se agradecería cualquier consejo sobre otros modelos o usando o usando 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á funcionando bien, pero no se eliminan los valores atípicos:

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

Editar: Acabo de agregar dos gráficos a continuación que muestran ejemplos de los problemas atípicos que tengo 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 continuó en dos de las réplicas, mostrando 2 valores atípicos.

La segunda trama muestra la serie P22S5 y el día 18, algo extraño continuó con la lectura ese día, probable error de la máquina, creo.

En este momento, estoy revuelto los datos, para verificar que las curvas de crecimiento se vean bien. Después de tomar el consejo de Hadley y establecer la familia = "Symétrico", estoy seguro de que loss más suave 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 p22s5 shows that on day 18, something weird went on with the reading that day, likely machine error I think

@Peter/@Hadley, lo siguiente que me gustaría hacer es tratar de ajustar una curva de crecimiento logística, Gompertz o Richard a estos datos en lugar de una Loess y calcular la tasa de crecimiento en la etapa exponencial. Finalmente, planeo usar el paquete Grofit en R (http://cran.r-project.org/web/packages/grofit/index.html), pero por ahora me gustaría trazarlos manualmente usando GGPLOT2 si es posible. Si tiene algún consejo, sería muy apreciado.

¿Fue útil?

Solución

¿Has probado el family = "symmetric" argumentar 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 X valores, y ciertamente no parece haber evidencia fuerte de una desviación de la linealidad.

Otros consejos

Primero, no estoy seguro de que un 'valiente atípico' se define adecuadamente en datos tan pequeños.

En segundo lugar, entonces tendrías que decidir a qué te refieres con "atípico", es decir, ¿es una de las drogas, una de las réplicas o uno de los puntos de tiempo?

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

Finalmente, creo que parte del punto de usar un más suave es que trata bien con valores atípicos, siempre que haya suficientes datos. Pero tienes muy poco.

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

espero que esto ayude

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top