Tengo un marco de datos que consta de dos columnas de variables (mezclando validación y prueba de datos). Calculé las desviaciones estándar de la media para ambas columnas y ahora quiero recortar los datos para eliminar puntos fuera de las barras de error.

¿Cómo puedo eliminar los puntos fuera del 'área amarilla' donde no se encuentran dentro de 1 desviación estándar de la media?

enter image description here

Para ejemplificar mi problema, esta es una pequeña parte del marco de datos, incluidas las funciones utilizadas hasta ahora.

ppv_dataset <- data.frame(NPVF=c(537428267.18, 593361648.89, 239331813.71, 564188133.09, 309720858.48, 286511353.97, 240790667.83, 484104247.40), 
                       npv=c(406866996.1019452, 679310854.3856647, 3816961.8569191, 685153713.2962445, 677629647.0433271, 450006801.2676973, 192824789.9761059, 492550821.6983585))

x <- apply((ppv_dataset$NPVF/100000000), 2, mean)
x.sd <- apply((ppv_dataset$NPVF/100000000), 2, sd)
y <- apply((ppv_dataset$npv/100000000), 2, mean)
y.sd <- apply((ppv_dataset$npv/100000000), 2, sd)

x_coordinates <- seq(0,8,by=1)
y_coordinates <- seq(0,8,by=1)

 # Add error bars

arrows(x0=x_coordinates-x.sd, y0=y_coordinates, x1=x_coordinates+x.sd, y1=y_coordinates, code=3, angle=90, length=0.1)
arrows(x0=y_coordinates, y0=x_coordinates-x.sd, x1=y_coordinates, y1=x_coordinates+x.sd, code=3, angle=90, length=0.1)

ingrese la descripción de la imagen aquí Cualquier ayuda sería maravillosa.

1
Sharon Soler 10 may. 2021 a las 21:11

1 respuesta

La mejor respuesta

Es un poco difícil seguir su ejemplo, pero esto puede ayudar. Todo su código de ejemplo falla con sus datos de muestra. El comando apply no se puede usar con un vector y usted escala sus estadísticas dividiendo por 1e8 pero no sus datos. Esto puede ser lo que quieras. Según la leyenda de su primera figura, la línea es npv = NPVF con NPVF en el eje xy npv en el eje y. Eso significa que las desviaciones verticales y horizontales de la línea son iguales pero con signos invertidos para cualquier punto. Podemos agregar dos columnas a sus datos después de escalar los datos en 1e8:

ppv_dataset <- ppv_dataset/1e8
ppv_dataset$Diff <- with(ppv_dataset, NPVF - npv)
std <- sd(ppv_dataset$Diff)
ppv_dataset$Z <- ppv_dataset$Diff/std
pv_dataset
    NPVF     npv      Diff         Z
1 5.3743 4.06867  1.305613  0.697659
2 5.9336 6.79311 -0.859492 -0.459273
3 2.3933 0.03817  2.355149  1.258482
4 5.6419 6.85154 -1.209656 -0.646384
5 3.0972 6.77630 -3.679088 -1.965933
6 2.8651 4.50007 -1.634954 -0.873644
7 2.4079 1.92825  0.479659  0.256307
8 4.8410 4.92551 -0.084466 -0.045135

Diff es la diferencia entre NPVF y npv y Z es Diff dividido por la desviación estándar. Sus valores atípicos son filas con un valor absoluto mayor que 1. Esos son los dos puntos fuera del cuadro amarillo en su segunda figura. El siguiente código los elimina:

ppv_dataset[abs(ppv_dataset$Z) < 1, ]
#     NPVF    npv      Diff         Z
# 1 5.3743 4.0687  1.305613  0.697659
# 2 5.9336 6.7931 -0.859492 -0.459273
# 4 5.6419 6.8515 -1.209656 -0.646384
# 6 2.8651 4.5001 -1.634954 -0.873644
# 7 2.4079 1.9282  0.479659  0.256307
# 8 4.8410 4.9255 -0.084466 -0.045135

Aquí hay una versión simple de su trama:

notout <- abs(ppv_dataset$Z) < 1
out <- abs(ppv_dataset$Z) > 1
plot(ppv_dataset[notout, 1:2], xlim=c(0, 10), ylim=c(0, 10), pch=16, col="blue", asp=1)
points(ppv_dataset[out, 1:2], pch=16, col="red")
abline(a=0, b=1)
bounds <- cbind(x=c(0, 10, 10, 0), y=c(std, 10+std, 10-std, -std))
polygon(bounds, lty=3)

Plot

1
dcarlson 11 may. 2021 a las 16:02