Estou procurando um método para calcular a área de sobreposição entre duas estimativas de densidade de kernel em R, como uma medida de similaridade entre duas amostras. Para esclarecer, no exemplo a seguir, eu precisaria quantificar a área da região sobreposta arroxeada:
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)
Uma pergunta semelhante foi discutida aqui , a diferença é que eu preciso fazer isso para dados empíricos arbitrários, em vez de distribuições normais predefinidas. O overlap
pacote aborda essa questão, mas aparentemente apenas para dados de registro de data e hora, o que não funciona para mim. O índice Bray-Curtis (conforme implementado na função vegan
do pacote vegdist(method="bray")
) também parece relevante, mas novamente para dados um pouco diferentes.
Estou interessado na abordagem teórica e nas funções R que eu poderia empregar para implementá-la.
Respostas:
A área de sobreposição de duas estimativas de densidade de kernel pode ser aproximada para qualquer grau de precisão desejado.
1) Como os KDEs originais provavelmente foram avaliados em alguma grade, se a grade é a mesma para ambos (ou pode ser facilmente igual), o exercício pode ser tão fácil quanto simplesmente tomar em cada ponto e, em seguida, usando a regra trapezoidal ou mesmo uma regra do ponto médio.min ( K1( x ) , K2( x ) )
Se os dois estiverem em grades diferentes e não puderem ser recalculados facilmente na mesma grade, a interpolação poderá ser usada.
2) Você pode encontrar o (s) ponto (s) de interseção e integrar o mais baixo dos dois KDEs em cada intervalo em que cada um é mais baixo. No diagrama acima, você integraria a curva azul à esquerda da interseção e a rosa à direita por qualquer meio que desejar / disponível. Isso pode ser feito essencialmente exatamente considerando a área sob cada componente do kernel à esquerda ou à direita desse ponto de corte.1hK( x - xEuh)
No entanto , os comentários acima devem ser claramente lembrados - isso não é necessariamente uma coisa muito significativa a se fazer.
fonte
Por uma questão de integridade, eis como eu acabei fazendo isso no R:
Como observado, há incerteza e subjetividade inerentes envolvidas na geração do KDE e também na integração.
fonte
overlapping
que estima a área de sobreposição de 2 (ou mais) distribuições empíricas. Confira a documentação aqui: rdocumentation.org/packages/overlapping/versions/1.5.0/topics/...Primeiro, posso estar errado, mas acho que sua solução não funcionaria caso houvesse múltiplos pontos em que as estimativas de densidade de kernel (KDE) se cruzam. Segundo, embora o
overlap
pacote tenha sido criado para ser usado com dados de registro de data e hora, você ainda pode usá-lo para estimar a área de sobreposição de dois KDEs. Você simplesmente precisa redimensionar seus dados para que eles variam de 0 a 2π.Por exemplo :
fonte