Corsario fournit une bonne solution dans un commentaire: utilisez la fonction de densité du noyau pour tester l'inclusion dans un ensemble de niveaux.
Une autre interprétation de la question est qu'elle demande une procédure pour tester l'inclusion dans les ellipses créées par une approximation normale bivariée des données. Pour commencer, générons des données qui ressemblent à l'illustration de la question:
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))
Les ellipses sont déterminées par les premier et deuxième moments des données:
center <- apply(p, 2, mean)
sigma <- cov(p)
La formule nécessite l'inversion de la matrice variance-covariance:
sigma.inv = solve(sigma, matrix(c(1,0,0,1),2,2))
La fonction "hauteur" de l'ellipse est le négatif du logarithme de la densité normale bivariée :
ellipse <- function(s,t) {u<-c(s,t)-center; u %*% sigma.inv %*% u / 2}
(J'ai ignoré une constante additive égale à .)log(2πdet(Σ)−−−−−−√)
Pour tester cela , dessinons certains de ses contours. Cela nécessite de générer une grille de points dans les directions x et y:
n <- 50
x <- (0:(n-1)) * (500000/(n-1))
y <- (0:(n-1)) * (50000/(n-1))
Calculez la fonction de hauteur sur cette grille et tracez-la:
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)
Evidemment ça marche. Par conséquent, le test pour déterminer si un point se trouve à l'intérieur d'un contour elliptique au niveau est(s,t)c
ellipse(s,t) <= c
Mathematica fait le travail de la même manière: calculez la matrice de variance-covariance des données, inversez-la, construisez la ellipse
fonction, et vous êtes tous ensemble.
L'intrigue est simple avec la
ellipse()
fonction dumixtools
package pour R:la source
Première approche
Vous pouvez essayer cette approche dans Mathematica.
Générons quelques données bivariées:
Ensuite, nous devons charger ce package:
Et maintenant:
donne une sortie qui définit une ellipse de confiance à 90%. Les valeurs que vous obtenez à partir de cette sortie sont au format suivant:
x1 et x2 spécifient le point auquel l'ellipse centrée, r1 et r2 spécifient les rayons semi-axes, et d1, d2, d3 et d4 spécifient la direction d'alignement.
Vous pouvez également tracer ceci:
La forme paramétrique générale de l'ellipse est:
Et vous pouvez le tracer de cette façon:
Vous pouvez effectuer une vérification basée sur des informations géométriques pures: si la distance euclidienne entre le centre de l'ellipse (ellPar [[1,1]]) et votre point de données est supérieure à la distance entre le centre de l'ellipse et la frontière de l'ellipse (évidemment, dans la même direction où se trouve votre point), alors ce point de données est en dehors de l'ellipse.
Deuxième approche
Cette approche est basée sur la distribution fluide du noyau.
Voici quelques données distribuées de manière similaire à vos données:
Nous obtenons une distribution fluide du noyau sur ces valeurs de données:
Nous obtenons un résultat numérique pour chaque point de données:
Nous fixons un seuil et nous sélectionnons toutes les données supérieures à ce seuil:
Ici, nous obtenons les données qui se trouvent en dehors de la région:
Et maintenant, nous pouvons tracer toutes les données:
Les points de couleur verte sont ceux au-dessus du seuil et les points de couleur rouge sont ceux au-dessous du seuil.
la source
La
ellipse
fonction dans leellipse
package pour R générera ces ellipses (en fait un polygone se rapprochant de l'ellipse). Vous pouvez utiliser cette ellipse.Ce qui pourrait en fait être plus facile, c'est de calculer la hauteur de la densité à votre point et de voir si elle est plus élevée (à l'intérieur de l'ellipse) ou plus basse (à l'extérieur de l'ellipse) que la valeur du contour à l'ellipse. Lesχ2
ellipse
fonctions internes utilisent une valeur pour créer l'ellipse, vous pouvez commencer par là pour trouver la hauteur à utiliser.la source
J'ai trouvé la réponse sur: /programming/2397097/how-can-a-data-ellipse-be-superimposed-on-a-ggplot2-scatterplot
la source