Corsario zapewnia dobre rozwiązanie w komentarzu: użyj funkcji gęstości jądra, aby sprawdzić, czy ma zostać włączony do zestawu poziomów.
Inna interpretacja tego pytania polega na tym, że wymaga procedury testowania włączenia w elipsy utworzone przez dwuwymiarowe normalne przybliżenie danych. Na początek wygenerujmy dane, które wyglądają jak na ilustracji w pytaniu:
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))
Elipsy są określane przez pierwszy i drugi moment danych:
center <- apply(p, 2, mean)
sigma <- cov(p)
Formuła wymaga odwrócenia macierzy wariancji-kowariancji:
sigma.inv = solve(sigma, matrix(c(1,0,0,1),2,2))
Funkcja „wysokości” elipsy jest ujemna logarytmu dwuwymiarowej normalnej gęstości :
ellipse <- function(s,t) {u<-c(s,t)-center; u %*% sigma.inv %*% u / 2}
(Zignorowałem stałą addytywną równą log( 2 πdet ( Σ )------√) .)
Aby to przetestować , narysujmy niektóre jego kontury. Wymaga to wygenerowania siatki punktów w kierunkach xiy:
n <- 50
x <- (0:(n-1)) * (500000/(n-1))
y <- (0:(n-1)) * (50000/(n-1))
Oblicz funkcję wysokości na tej siatce i wykreśl ją:
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)
Najwyraźniej to działa. Dlatego test mający na celu ustalenie, czy punkt leży wewnątrz konturu eliptycznego na poziomie jest( s , t )do
ellipse(s,t) <= c
Mathematica wykonuje zadanie w ten sam sposób: oblicz macierz wariancji-kowariancji danych, odwróć to, skonstruuj ellipse
funkcję i gotowe.
Fabuła jest prosta z
ellipse()
funkcjąmixtools
pakietu dla R:źródło
Pierwsze podejście
Możesz spróbować tego podejścia w Mathematica.
Wygenerujmy dane dwuwymiarowe:
Następnie musimy załadować ten pakiet:
I teraz:
daje wynik, który definiuje 90% elipsę ufności. Wartości otrzymane z tego wyniku są w następującym formacie:
x1 i x2 określają punkt, w którym elipsa w środku, r1 i r2 określają promienie półosi, a d1, d2, d3 i d4 określają kierunek wyrównania.
Możesz również wykreślić to:
Ogólna parametryczna forma elipsy to:
Możesz wykreślić to w ten sposób:
Możesz wykonać sprawdzenie w oparciu o informacje czysto geometryczne: jeśli odległość euklidesowa między środkiem elipsy (ellPar [[1,1]]) a punktem danych jest większa niż odległość między środkiem elipsy a granicą elipsa (oczywiście w tym samym kierunku, w którym znajduje się twój punkt), wtedy ten punkt danych znajduje się poza elipsą.
Drugie podejście
To podejście opiera się na płynnej dystrybucji jądra.
Oto niektóre dane dystrybuowane w podobny sposób jak Twoje dane:
Uzyskujemy płynny rozkład jądra na tych wartościach danych:
Otrzymujemy wynik liczbowy dla każdego punktu danych:
Naprawiamy próg i wybieramy wszystkie dane, które są wyższe niż ten próg:
Tutaj otrzymujemy dane spoza regionu:
A teraz możemy wykreślić wszystkie dane:
Punkty w kolorze zielonym są powyżej progu, a punkty w kolorze czerwonym są poniżej progu.
źródło
ellipse
Funkcji wellipse
pakiecie dla R generuje te elipsy (a właściwie wielobok zbliżony do elipsy). Możesz użyć tej elipsy.ellipse
źródło
Znalazłem odpowiedź na: /programming/2397097/how-can-a-data-ellipse-be-superimposed-on-a-ggplot2-scatterplot
źródło