Corsario bietet eine gute Lösung in einem Kommentar: Verwenden Sie die Kerneldichtefunktion, um die Aufnahme in einen Levelsatz zu testen.
Eine andere Interpretation der Frage besteht darin, dass ein Verfahren zum Testen der Aufnahme in die Ellipsen angefordert wird, die durch eine bivariate normale Annäherung an die Daten erzeugt werden. Lassen Sie uns zunächst einige Daten generieren, die der Abbildung in der Frage entsprechen:
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))
Die Ellipsen werden durch den ersten und zweiten Moment der Daten bestimmt:
center <- apply(p, 2, mean)
sigma <- cov(p)
Die Formel erfordert die Inversion der Varianz-Kovarianz-Matrix:
sigma.inv = solve(sigma, matrix(c(1,0,0,1),2,2))
Die Ellipsenfunktion "Höhe" ist das Negative des Logarithmus der bivariaten Normaldichte :
ellipse <- function(s,t) {u<-c(s,t)-center; u %*% sigma.inv %*% u / 2}
(Ich habe eine additive Konstante gleich log ( 2 π √) ignoriertLog( 2 πdet ( Σ )- -- -- -- -- -- -√) .)
Um dies zu testen , zeichnen wir einige seiner Konturen. Dazu muss ein Punktgitter in x- und y-Richtung erstellt werden:
n <- 50
x <- (0:(n-1)) * (500000/(n-1))
y <- (0:(n-1)) * (50000/(n-1))
Berechnen Sie die Höhenfunktion in diesem Raster und zeichnen Sie sie auf:
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)
Offensichtlich funktioniert es. Daher der Test, um festzustellen, ob ein Punkt innerhalb einer elliptischen Kontur auf Ebene c liegt( s , t )c liegt,
ellipse(s,t) <= c
Mathematica erledigt den Job auf die gleiche Weise: Berechnen Sie die Varianz-Kovarianz-Matrix der Daten, invertieren Sie diese, konstruieren Sie die ellipse
Funktion, und schon sind Sie fertig.
Die Darstellung ist mit der
ellipse()
Funktion desmixtools
Pakets für R einfach :quelle
Erste Ansatz
Sie können diesen Ansatz in Mathematica ausprobieren.
Lassen Sie uns einige bivariate Daten generieren:
Dann müssen wir dieses Paket laden:
Und nun:
gibt eine Ausgabe aus, die eine 90% -Konfidenzellipse definiert. Die Werte, die Sie von dieser Ausgabe erhalten, haben das folgende Format:
x1 und x2 geben den Punkt an, an dem die Ellipse zentriert ist, r1 und r2 die Halbachsenradien und d1, d2, d3 und d4 die Ausrichtungsrichtung.
Sie können dies auch zeichnen:
Die allgemeine parametrische Form der Ellipse lautet:
Und Sie können es so zeichnen:
Sie können eine Überprüfung basierend auf reinen geometrischen Informationen durchführen: Wenn der euklidische Abstand zwischen dem Mittelpunkt der Ellipse (ellPar [[1,1]]) und Ihrem Datenpunkt größer ist als der Abstand zwischen dem Mittelpunkt der Ellipse und dem Rand von die Ellipse (offensichtlich in der gleichen Richtung, in der sich Ihr Punkt befindet), dann befindet sich dieser Datenpunkt außerhalb der Ellipse.
Zweiter Ansatz
Dieser Ansatz basiert auf der reibungslosen Kernelverteilung.
Dies sind einige Daten, die auf ähnliche Weise wie Ihre Daten verteilt werden:
Wir erhalten eine reibungslose Kernelverteilung für diese Datenwerte:
Wir erhalten für jeden Datenpunkt ein numerisches Ergebnis:
Wir legen einen Schwellenwert fest und wählen alle Daten aus, die höher als dieser Schwellenwert sind:
Hier erhalten wir die Daten, die außerhalb der Region liegen:
Und jetzt können wir alle Daten zeichnen:
Die grün gefärbten Punkte befinden sich oberhalb des Schwellenwerts und die rot gefärbten Punkte befinden sich unterhalb des Schwellenwerts.
quelle
Die
ellipse
Funktion in derellipse
Paket für R generiert diese Ellipsen (tatsächlich ein Polygon, das sich der Ellipse annähert). Sie könnten diese Ellipse verwenden.ellipse
quelle
Ich fand die Antwort unter: /programming/2397097/how-can-a-data-ellipse-be-superimposed-on-a-ggplot2-scatterplot
quelle