Encontrar valores atípicos en un diagrama de dispersión

9

Tengo un conjunto de puntos de datos que se supone que se sientan en un lugar y siguen un patrón, pero hay algunos puntos de dispersión del lugar principal que causan incertidumbre en mi análisis final. Me gustaría obtener un lugar limpio para aplicarlo más tarde para mi análisis. Los puntos azules son más o menos los puntos de dispersión que quiero encontrar y los excluyen de una manera sofisticada sin hacerlo manualmente.ingrese la descripción de la imagen aquí

Estaba pensando en usar algo como Regresión de vecinos más cercanos, pero no estoy seguro de si es el mejor enfoque o no estoy muy familiarizado sobre cómo debería implementarse para obtener un resultado adecuado. Por cierto, quiero hacerlo sin ningún procedimiento de adaptación.

La versión transpuesta de los datos es la siguiente:

X=array([[ 0.87 , -0.01 ,  0.575,  1.212,  0.382,  0.418, -0.01 ,  0.474,
         0.432,  0.702,  0.574,  0.45 ,  0.334,  0.565,  0.414,  0.873,
         0.381,  1.103,  0.848,  0.503,  0.27 ,  0.416,  0.939,  1.211,
         1.106,  0.321,  0.709,  0.744,  0.309,  0.247,  0.47 , -0.107,
         0.925,  1.127,  0.833,  0.963,  0.385,  0.572,  0.437,  0.577,
         0.461,  0.474,  1.046,  0.892,  0.313,  1.009,  1.048,  0.349,
         1.189,  0.302,  0.278,  0.629,  0.36 ,  1.188,  0.273,  0.191,
        -0.068,  0.95 ,  1.044,  0.776,  0.726,  1.035,  0.817,  0.55 ,
         0.387,  0.476,  0.473,  0.863,  0.252,  0.664,  0.365,  0.244,
         0.238,  1.203,  0.339,  0.528,  0.326,  0.347,  0.385,  1.139,
         0.748,  0.879,  0.324,  0.265,  0.328,  0.815,  0.38 ,  0.884,
         0.571,  0.416,  0.485,  0.683,  0.496,  0.488,  1.204,  1.18 ,
         0.465,  0.34 ,  0.335,  0.447,  0.28 ,  1.02 ,  0.519,  0.335,
         1.037,  1.126,  0.323,  0.452,  0.201,  0.321,  0.285,  0.587,
         0.292,  0.228,  0.303,  0.844,  0.229,  1.077,  0.864,  0.515,
         0.071,  0.346,  0.255,  0.88 ,  0.24 ,  0.533,  0.725,  0.339,
         0.546,  0.841,  0.43 ,  0.568,  0.311,  0.401,  0.212,  0.691,
         0.565,  0.292,  0.295,  0.587,  0.545,  0.817,  0.324,  0.456,
         0.267,  0.226,  0.262,  0.338,  1.124,  0.373,  0.814,  1.241,
         0.661,  0.229,  0.416,  1.103,  0.226,  1.168,  0.616,  0.593,
         0.803,  1.124,  0.06 ,  0.573,  0.664,  0.882,  0.286,  0.139,
         1.095,  1.112,  1.167,  0.589,  0.3  ,  0.578,  0.727,  0.252,
         0.174,  0.317,  0.427,  1.184,  0.397,  0.43 ,  0.229,  0.261,
         0.632,  0.938,  0.576,  0.37 ,  0.497,  0.54 ,  0.306,  0.315,
         0.335,  0.24 ,  0.344,  0.93 ,  0.134,  0.4  ,  0.223,  1.224,
         1.187,  1.031,  0.25 ,  0.53 , -0.147,  0.087,  0.374,  0.496,
         0.441,  0.884,  0.971,  0.749,  0.432,  0.582,  0.198,  0.615,
         1.146,  0.475,  0.595,  0.304,  0.416,  0.645,  0.281,  0.576,
         1.139,  0.316,  0.892,  0.648,  0.826,  0.299,  0.381,  0.926,
         0.606],
       [-0.154, -0.392, -0.262,  0.214, -0.403, -0.363, -0.461, -0.326,
        -0.349, -0.21 , -0.286, -0.358, -0.436, -0.297, -0.394, -0.166,
        -0.389,  0.029, -0.124, -0.335, -0.419, -0.373, -0.121,  0.358,
         0.042, -0.408, -0.189, -0.213, -0.418, -0.479, -0.303, -0.645,
        -0.153,  0.098, -0.171, -0.066, -0.368, -0.273, -0.329, -0.295,
        -0.362, -0.305, -0.052, -0.171, -0.406, -0.102,  0.011, -0.375,
         0.126, -0.411, -0.42 , -0.27 , -0.407,  0.144, -0.419, -0.465,
        -0.036, -0.099,  0.007, -0.167, -0.205, -0.011, -0.151, -0.267,
        -0.368, -0.342, -0.299, -0.143, -0.42 , -0.232, -0.368, -0.417,
        -0.432,  0.171, -0.388, -0.319, -0.407, -0.379, -0.353,  0.043,
        -0.211, -0.14 , -0.373, -0.431, -0.383, -0.142, -0.345, -0.144,
        -0.302, -0.38 , -0.337, -0.2  , -0.321, -0.269,  0.406,  0.223,
        -0.322, -0.395, -0.379, -0.324, -0.424,  0.01 , -0.298, -0.386,
         0.018,  0.157, -0.384, -0.327, -0.442, -0.388, -0.387, -0.272,
        -0.397, -0.415, -0.388, -0.106, -0.504,  0.034, -0.153, -0.32 ,
        -0.271, -0.417, -0.417, -0.136, -0.447, -0.279, -0.225, -0.372,
        -0.316, -0.161, -0.331, -0.261, -0.409, -0.338, -0.437, -0.242,
        -0.328, -0.403, -0.433, -0.274, -0.331, -0.163, -0.361, -0.298,
        -0.392, -0.447, -0.429, -0.388,  0.11 , -0.348, -0.174,  0.244,
        -0.182, -0.424, -0.319,  0.088, -0.547,  0.189, -0.216, -0.228,
        -0.17 ,  0.125, -0.073, -0.266, -0.234, -0.108, -0.395, -0.395,
         0.131,  0.074,  0.514, -0.235, -0.389, -0.288, -0.22 , -0.416,
        -0.777, -0.358, -0.31 ,  0.817, -0.363, -0.328, -0.424, -0.416,
        -0.248, -0.093, -0.28 , -0.357, -0.348, -0.298, -0.384, -0.394,
        -0.362, -0.415, -0.349, -0.08 , -0.572, -0.07 , -0.423,  0.359,
         0.4  ,  0.099, -0.426, -0.252, -0.697, -0.508, -0.348, -0.254,
        -0.307, -0.116, -0.029, -0.201, -0.302, -0.25 , -0.44 , -0.233,
         0.274, -0.295, -0.223, -0.398, -0.298, -0.209, -0.389, -0.247,
         0.225, -0.395, -0.124, -0.237, -0.104, -0.361, -0.335, -0.083,
        -0.254]])
Dalek
fuente
¿Cómo identificas esos puntos azules?
Dan
@ Dan Sólo hay que poner algunos límites en xy yy les determinada. Pero tengo muchos de este tipo de gráficos con diferentes características y diferentes puntos de dispersión y quiero encontrar una forma confiable de excluirlos sin definirlos mirando los diagramas.
Dalek
1
¿Cómo se define un "patrón ordenado"? No veo ninguna razón de por qué esos puntos azules se excluirían además de la inspección visual. Si tuviera un criterio de exclusión, tendría más sentido.
Dan
@Dan basado en la aplicación que estoy buscando, los puntos azules para mí se consideran valores atípicos y dispersos de la característica principal.
Dalek
ok entonces, ¿qué definió la "característica principal"?
Dan

Respuestas:

10

Para comenzar a identificar los puntos "dispersos", considere centrarse en lugares donde la estimación de la densidad del núcleo es relativamente baja.

Esta sugerencia supone que poco o nada se sabe o se sospecha inicialmente sobre el "lugar" de los puntos, la curva o las curvas a lo largo de las cuales caerán la mayoría de ellos, y se hace con el espíritu de exploración semiautomática de los datos. (en lugar de probar hipótesis).

Es posible que deba jugar con el ancho del núcleo y el umbral de "relativamente bajo". Existen buenas formas automáticas para estimar el primero, mientras que el segundo podría identificarse mediante un análisis de las densidades en los puntos de datos (para identificar un grupo de valores bajos).


Ejemplo

La figura genera una combinación de dos tipos de datos: uno, que se muestra como puntos rojos, son datos de alta precisión, mientras que el otro, que se muestra como puntos azules, son datos de precisión relativamente baja obtenidos cerca del valor extremadamente bajo de X. En su fondo se encuentran (a) contornos de una estimación de densidad de grano (en escala de grises) y (b) la curva alrededor de la cual se generaron los puntos (en negro).

Figura

Los puntos con densidades relativamente bajas se han marcado automáticamente . (Las densidades en estos puntos son menos de un octavo de la densidad media entre todos los puntos). Incluyen la mayoría, pero no todos, de los puntos de baja precisión y algunos de los puntos de alta precisión (en la parte superior Correcto). Los puntos de baja precisión que se encuentran cerca de la curva (como extrapolados por los puntos de alta precisión) no se han marcado. El círculo de los puntos de alta precisión resalta el hecho de que donde sea que los puntos sean escasos, la traza de la curva subyacente será incierta. ¡Esta es una característica del enfoque sugerido, no una limitación!


Código

REl código para producir este ejemplo sigue. Utiliza la ksbiblioteca, que evalúa la anisotropía en el patrón de puntos para desarrollar una forma de núcleo orientada. Este enfoque funciona bien en los datos de muestra, cuya nube de puntos tiende a ser larga y delgada.

#
# Simulate some data.
#
f <- function(x) -0.55 + 0.45*x + 0.01/(1.2-x)^2 # The underlying curve

set.seed(17)
n1 <- 280; n2 <- 15
x <- c(1.2 - rbeta(n1,.9, .6), rep(0.1, n2))
y <- f(x)
d <- data.frame(x=x + c(rnorm(n1, 0, 0.025), rnorm(n2, 0, 0.1)),
                   y=y + c(rnorm(n1, 0, 0.025), rnorm(n2, 0, 0.33)),
                   group=c(rep(1, n1), rep(2, n2)))
d <- subset(d, subset=(y <= 1.0)) # Omit any high-y points
#
# Plot the density estimate.
#
require(ks)
p <- cbind(d$x, d$y)
dens <- kde(p)
n.levels <- 13
colors <- gray(seq(1, 0, length.out=n.levels))
plot(dens, display="filled.contour2", cont=seq(0, 100, length.out=n.levels),
     col=colors, xlab="X", ylab="Y")
#
# Evaluate densities at the data points.
#
dens <- kde(p, eval.points=p)
d$Density <- dens$estimate
#
# Plot the (correct) curve and the points.
#
curve(f(x), add=TRUE, to=1.2, col="Black")
points(d$x, d$y, ylim=c(-1,1), pch=19, cex=sqrt(d$Density/8),
     col=ifelse(d$group==1, "Red", "Blue"))
#
# Highlight some low-density points.
#
m <- mean(d$Density)
e <- subset(d, subset=(Density < m/10))
points(e$x, e$y, col="#00000080")
whuber
fuente
La razón por la que se proporcionan datos simulados es porque hice este análisis antes de que los datos se publicaran en la pregunta. Sin embargo, el código de simulación puede ser útil para probar este, o cualquier otro, procedimiento, y por lo tanto podría ser útil por derecho propio.
whuber
para obtener la curva subyacente, entonces calculó el coeficiente del ajuste utilizando un procedimiento de ajuste, ¿verdad? ¿Has asumido alguna función de ajuste?
Dalek
Ninguno en absoluto: vea el código, que usa solo la estimación de densidad del núcleo (tal como la devuelve kde) para identificar los puntos que se deben marcar. Si no hubiera simulado los datos de una forma funcional conocida (como se indica en f), no habría podido dibujar ninguna curva de referencia, ya que no se realizó ningún ajuste.
whuber
Me refería a la funcionalidad de f(x).
Dalek
@whuber, trama súper genial!
Dan