Я ищу метод для расчета области перекрытия между двумя оценками плотности ядра в R, как мера сходства между двумя выборками. Чтобы уточнить, в следующем примере мне нужно было бы количественно определить площадь области пурпурного перекрытия:
library(ggplot2)
set.seed(1234)
d <- data.frame(variable=c(rep("a", 50), rep("b", 30)), value=c(rnorm(50), runif(30, 0, 3)))
ggplot(d, aes(value, fill=variable)) + geom_density(alpha=.4, color=NA)
Подобный вопрос обсуждался здесь , с той разницей, что мне нужно сделать это для произвольных эмпирических данных, а не для предопределенных нормальных распределений. В overlap
пакете рассматривает этот вопрос, но , видимо , только для данных временной метки, которая не работает для меня. Индекс Брей-Кертиса (как реализовано в функции vegan
пакета vegdist(method="bray")
) также представляется актуальным, но опять же для несколько других данных.
Меня интересует как теоретический подход, так и функции R, которые я мог бы использовать для его реализации.
источник
Ответы:
Область перекрытия двух оценок плотности ядра может быть аппроксимирована с любой желаемой степенью точности.
1) Поскольку исходные KDE, вероятно, были оценены по некоторой сетке, если сетка одинакова для обоих (или может быть легко сделана одинаковой), упражнение может быть так же просто, как просто взятьмин ( К1( х ) , К2( х ) ) в каждой точке, а затем с использованием правила трапеции или даже правила средней точки.
Если они находятся на разных сетках и не могут быть легко пересчитаны на одной сетке, можно использовать интерполяцию.
2) Вы можете найти точку (или точки) пересечения и интегрировать нижний из двух KDE в каждом интервале, где каждый ниже. На приведенной выше диаграмме вы бы интегрировали синюю кривую слева от пересечения и розовую справа, используя любые доступные вам средства. Это можно сделать по существу точно, рассматривая область под каждым компонентом ядра слева или справа от этой точки отсечения.1часК( х - хячас)
Тем не менее , вышеприведенные комментарии должны быть четко учтены - это не обязательно очень важно.
источник
Для полноты, вот как я закончил делать это в R:
Как уже отмечалось, существует неопределенность и субъективность, связанные с генерацией KDE, а также с интеграцией.
источник
overlapping
который оценивает область перекрытия 2 (или более) эмпирических распределений. Ознакомьтесь с документацией здесь: rdocumentation.org/packages/overlapping/versions/1.5.0/topics/…Во-первых, я могу ошибаться, но я думаю, что ваше решение не сработает в том случае, если есть несколько точек, где пересекаются оценки плотности ядра (KDE). Во-вторых, хотя
overlap
пакет был создан для использования с данными временной метки, вы все равно можете использовать его для оценки области перекрытия любых двух KDE. Вам просто нужно изменить масштаб ваших данных, чтобы они варьировались от 0 до 2π.Например :
источник