Corsario proporciona una buena solución en un comentario: use la función de densidad del núcleo para probar la inclusión dentro de un conjunto de niveles.
Otra interpretación de la pregunta es que solicita un procedimiento para evaluar la inclusión dentro de las elipses creadas por una aproximación normal bivariada a los datos. Para comenzar, generemos algunos datos que se parecen a la ilustración de la pregunta:
library(mvtnorm) # References rmvnorm()
set.seed(17)
p <- rmvnorm(1000, c(250000, 20000), matrix(c(100000^2, 22000^2, 22000^2, 6000^2),2,2))
Las elipses están determinadas por el primer y segundo momento de los datos:
center <- apply(p, 2, mean)
sigma <- cov(p)
La fórmula requiere la inversión de la matriz de varianza-covarianza:
sigma.inv = solve(sigma, matrix(c(1,0,0,1),2,2))
La función de "altura" de elipse es el negativo del logaritmo de la densidad normal bivariada :
ellipse <- function(s,t) {u<-c(s,t)-center; u %*% sigma.inv %*% u / 2}
(He ignorado una constante aditiva igual a .)log(2πdet(Σ)−−−−−−√)
Para probar esto , dibujemos algunos de sus contornos. Eso requiere generar una cuadrícula de puntos en las direcciones x e y:
n <- 50
x <- (0:(n-1)) * (500000/(n-1))
y <- (0:(n-1)) * (50000/(n-1))
Calcule la función de altura en esta cuadrícula y tracela:
z <- mapply(ellipse, as.vector(rep(x,n)), as.vector(outer(rep(0,n), y, `+`)))
plot(p, pch=20, xlim=c(0,500000), ylim=c(0,50000), xlab="Packets", ylab="Flows")
contour(x,y,matrix(z,n,n), levels=(0:10), col = terrain.colors(11), add=TRUE)
Evidentemente funciona. Por lo tanto, la prueba para determinar si un punto encuentra dentro de un contorno elíptico en el nivel es(s,t)c
ellipse(s,t) <= c
Mathematica hace el trabajo de la misma manera: calcula la matriz de varianza-covarianza de los datos, invierte eso, construye la ellipse
función y estás listo.
La trama es sencilla con la
ellipse()
función delmixtools
paquete para R:fuente
Primer enfoque
Puede probar este enfoque en Mathematica.
Generemos algunos datos bivariados:
Entonces necesitamos cargar este paquete:
Y ahora:
da una salida que define una elipse de confianza del 90%. Los valores que obtiene de esta salida tienen el siguiente formato:
x1 y x2 especifican el punto en el que la elipse en el centro, r1 y r2 especifican los radios del semieje, y d1, d2, d3 y d4 especifican la dirección de alineación.
También puedes trazar esto:
La forma paramétrica general de la elipse es:
Y puedes trazarlo de esta manera:
Puede realizar una verificación basada en información geométrica pura: si la distancia euclidiana entre el centro de la elipse (ellPar [[1,1]]) y su punto de datos es mayor que la distancia entre el centro de la elipse y el borde de la elipse (obviamente, en la misma dirección en la que se encuentra su punto), entonces ese punto de datos está fuera de la elipse.
Segundo enfoque
Este enfoque se basa en la distribución fluida del núcleo.
Estos son algunos datos distribuidos de manera similar a sus datos:
Obtenemos una distribución de kernel suave en estos valores de datos:
Obtenemos un resultado numérico para cada punto de datos:
Arreglamos un umbral y seleccionamos todos los datos que son más altos que este umbral:
Aquí obtenemos los datos que quedan fuera de la región:
Y ahora podemos trazar todos los datos:
Los puntos de color verde son los que están por encima del umbral y los puntos de color rojo son los que están por debajo del umbral.
fuente
La
ellipse
función en elellipse
paquete para R generará estas elipses (en realidad un polígono que se aproxima a la elipse). Podrías usar esa elipse.Lo que en realidad podría ser más fácil es calcular la altura de la densidad en su punto y ver si es más alta (dentro de la elipse) o más baja (fuera de la elipse) que el valor del contorno en la elipse. Lasχ2
ellipse
funciones internas usan un valor para crear la elipse, puede comenzar allí para encontrar la altura a usar.fuente
Encontré la respuesta en: /programming/2397097/how-can-a-data-ellipse-be-superimposed-on-a-ggplot2-scatterplot
fuente