Corsario предлагает хорошее решение в комментарии: используйте функцию плотности ядра для проверки на включение в набор уровней.
Другая интерпретация этого вопроса заключается в том, что он запрашивает процедуру проверки на включение в эллипсы, создаваемые двумерным нормальным приближением к данным. Для начала давайте сгенерируем некоторые данные, которые выглядят как иллюстрации в вопросе:
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))
Эллипсы определяются первым и вторым моментами данных:
center <- apply(p, 2, mean)
sigma <- cov(p)
Формула требует инверсии дисперсионно-ковариационной матрицы:
sigma.inv = solve(sigma, matrix(c(1,0,0,1),2,2))
Функция «высота» эллипса является отрицательной величиной логарифма двумерной нормальной плотности :
ellipse <- function(s,t) {u<-c(s,t)-center; u %*% sigma.inv %*% u / 2}
журнал( 2 πдет ( Σ )------√)
Чтобы проверить это , давайте нарисуем некоторые его контуры. Это требует создания сетки точек в направлениях x и y:
n <- 50
x <- (0:(n-1)) * (500000/(n-1))
y <- (0:(n-1)) * (50000/(n-1))
Вычислите функцию высоты в этой сетке и постройте ее:
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)
Очевидно, это работает. Следовательно, тест для определения того, находится ли точка внутри эллиптического контура на уровне является( с , т )с
ellipse(s,t) <= c
Mathematica выполняет свою работу аналогичным образом: вычисляет матрицу дисперсии-ковариации данных, инвертирует ее, создает ellipse
функцию, и все готово.
Сюжет прост с
ellipse()
функциейmixtools
пакета для R:источник
Первый подход
Вы можете попробовать этот подход в Mathematica.
Давайте сгенерируем некоторые двумерные данные:
Затем нам нужно загрузить этот пакет:
И сейчас:
дает вывод, который определяет 90% -ый доверительный эллипс. Значения, полученные из этого вывода, имеют следующий формат:
x1 и x2 указывают точку, в которой эллипс в центре, r1 и r2 задают радиусы полуоси, а d1, d2, d3 и d4 задают направление выравнивания.
Вы также можете построить это:
Общая параметрическая форма эллипса:
И вы можете построить это так:
Вы можете выполнить проверку на основе чисто геометрической информации: если евклидово расстояние между центром эллипса (ellPar [[1,1]]) и вашей точкой данных больше, чем расстояние между центром эллипса и границей эллипс (очевидно, в том же направлении, в котором находится ваша точка), то эта точка данных находится вне эллипса.
Второй подход
Этот подход основан на плавном распределении ядра.
Вот некоторые данные, распространяемые аналогично вашим данным:
Мы получаем плавное распределение ядра по этим значениям данных:
Мы получаем числовой результат для каждой точки данных:
Мы фиксируем порог и выбираем все данные, которые выше этого порога:
Здесь мы получаем данные, которые выходят за пределы региона:
И теперь мы можем построить все данные:
Точки зеленого цвета - это точки выше порога, а точки красного цвета - точки ниже порога.
источник
ellipse
Функция вellipse
пакете для R будет генерировать эти эллипсы ( на самом деле многоугольник приближая эллипс). Вы могли бы использовать этот эллипс.ellipse
источник
Я нашел ответ по адресу: /programming/2397097/how-can-a-data-ellipse-be-superimpposed-on-a-ggplot2-scatterplot
источник