Процент перекрывающихся областей двух нормальных распределений


46

Мне было интересно, учитывая два нормальных распределения с и \ sigma_2, \ \ mu_2σ1, μ1σ2, μ2

  • Как я могу рассчитать процент перекрывающихся регионов двух распределений?
  • Я полагаю, что у этой проблемы есть определенное имя, знаете ли вы какое-либо конкретное имя, описывающее эту проблему?
  • Вам известно о какой-либо реализации этого (например, Java-код)?

2
Что вы имеете в виду с перекрывающимся регионом? Вы имеете в виду область, которая находится ниже обеих кривых плотности?
Ник Сабби

Я имею в виду пересечение двух областей
Али Салехи

4
Короче говоря, записывая два pdf как f и g , вы действительно хотите вычислить min(f(x),g(x))dx ? Не могли бы вы рассказать нам о контексте, в котором это происходит, и как это будет интерпретироваться?
whuber

Ответы:


41

Это также часто называют «коэффициентом перекрытия» (OVL). Поиск в Google даст вам много хитов. Вы можете найти номограмму для би-нормального случая здесь . Полезная статья может быть:

  • Генри Ф. Инман; Эдвин Л. Брэдли-младший (1989). Коэффициент перекрытия как мера соответствия между распределениями вероятностей и точечной оценкой перекрытия двух нормальных плотностей. Коммуникации в статистике - теория и методика, 18 (10), 3851-3874. ( Ссылка )

редактировать

Теперь вы заинтересовали меня этим больше, поэтому я решил создать R-код для этого (это простая интеграция). Я добавил график двух распределений, включая штриховку перекрывающейся области:

min.f1f2 <- function(x, mu1, mu2, sd1, sd2) {
    f1 <- dnorm(x, mean=mu1, sd=sd1)
    f2 <- dnorm(x, mean=mu2, sd=sd2)
    pmin(f1, f2)
}

mu1 <- 2;    sd1 <- 2
mu2 <- 1;    sd2 <- 1

xs <- seq(min(mu1 - 3*sd1, mu2 - 3*sd2), max(mu1 + 3*sd1, mu2 + 3*sd2), .01)
f1 <- dnorm(xs, mean=mu1, sd=sd1)
f2 <- dnorm(xs, mean=mu2, sd=sd2)

plot(xs, f1, type="l", ylim=c(0, max(f1,f2)), ylab="density")
lines(xs, f2, lty="dotted")
ys <- min.f1f2(xs, mu1=mu1, mu2=mu2, sd1=sd1, sd2=sd2)
xs <- c(xs, xs[1])
ys <- c(ys, ys[1])
polygon(xs, ys, col="gray")

### only works for sd1 = sd2
SMD <- (mu1-mu2)/sd1
2 * pnorm(-abs(SMD)/2)

### this works in general
integrate(min.f1f2, -Inf, Inf, mu1=mu1, mu2=mu2, sd1=sd1, sd2=sd2)

Для этого примера результат: 0.6099324с абсолютной ошибкой < 1e-04. Рисунок ниже.

пример


10
(+1) Поиск в Google дает как минимум три разных определения (Мацусита, Морисита и Вейцман). Ваша реализация Вейцмана.
whuber

1
0,60993 24 является приближением для 0,60993 43398 78944 33895 ....
whuber

10

Это определяется коэффициентом Бхаттачарьи . Для других распределений, см. Также обобщенную версию, расстояние Хеллингера между двумя распределениями.

Я не знаю ни одной библиотеки, чтобы вычислить это, но, учитывая явную формулировку в терминах расстояний Махаланобиса и определителя матриц дисперсии, реализация не должна быть проблемой.


3
Коэффициент Бхаттачарьи - это мера перекрытия, но не так ли?
Стефан Лоран,

7

Я не знаю, существует ли очевидный стандартный способ сделать это, но:

Сначала вы найдете точки пересечения между двумя плотностями. Это может быть легко достигнуто путем приравнивания обеих плотностей, что для нормального распределения должно привести к квадратному уравнению для x.

Что-то на:

(xμ2)22σ22(xμ1)22σ12=logσ1σ2

Это можно решить с помощью основного исчисления.

Таким образом, у вас есть ноль, одна или две точки пересечения. Теперь эти точки пересечения делят действительную линию на 1, 2 или три части, где любая из двух плотностей является самой низкой. Если ничего более математического не приходит на ум, просто попробуйте любую точку в одной из частей, чтобы найти, какая из них самая низкая.

Ваша ценность интереса теперь является суммой областей под кривой самой низкой плотности в каждой части. Эта область теперь может быть найдена из кумулятивной функции распределения (просто вычтите значение в обоих краях 'части').


4
(+1) На самом деле, когда , уравнение может быть решено с помощью квадратной формулы: нет необходимости в исчислении. Если мы устроим (wlg) для , то вторая плотность будет наименьшей между двумя нулями, а в противном случае первая плотность будет наименьшей. Это сокращает расчет до четырех оценок нормального CDF. Ситуация с еще проще, требует решения линейного уравнения и только двух оценок CDF. σ1σ2μ1μ2σ1=σ2
whuber

2
@whuber Не могли бы вы превратить это в полный ответ? Или, может, Ник сможет отредактировать его.
Александр Дубинский

@whuber Разве вы не имели в виду а не ? σ1σ2μ1μ2
Стефан Лоран

@ Stéphane Я думаю, вы правы в том, что SD определяют порядок: плотность с меньшим SD в конечном итоге будет иметь меньшие хвосты как в положительном, так и в отрицательном направлениях и, следовательно, будет иметь большие значения между нулями и меньшими значениями в других местах.
whuber

@whuber Да, и действительно, легко видеть, что порядок SD определяет знак коэффициента 2-го порядка полинома, полученного Ником.
Стефан Лоран

1

Для потомков решение Вольфганга у меня не сработало - я столкнулся с ошибками в integrateфункции. Поэтому я совместил это с ответом Ника Стаубе, чтобы разработать следующую небольшую функцию. Должно быть быстрее и менее глючно, чем при использовании числовой интеграции:

get_overlap_coef <- function(mu1, mu2, sd1, sd2){
  xs  <- seq(min(mu1 - 4*sd1, mu2 - 4*sd2), 
             max(mu1 + 4*sd1, mu2 + 4*sd2), 
             length.out = 500)
  f1  <- dnorm(xs, mean=mu1, sd=sd1)
  f2  <- dnorm(xs, mean=mu2, sd=sd2)
  int <- xs[which.max(pmin(f1, f2))]
  l   <- pnorm(int, mu1, sd1, lower.tail = mu1>mu2)
  r   <- pnorm(int, mu2, sd2, lower.tail = mu1<mu2)
  l+r
}

не должно ли это вернуться (l+r)/2?
RSHAP

0

Вот версия Java, Библиотека математики Apache Commons :

import org.apache.commons.math3.distribution.NormalDistribution;

public static double overlapArea(double mean1, double sd1, double mean2, double sd2) {

    NormalDistribution normalDistribution1 = new NormalDistribution(mean1, sd1);
    NormalDistribution normalDistribution2 = new NormalDistribution(mean2, sd2);

    double min = Math.min(mean1 - 6 * sd1, mean2 - 6 * sd2);
    double max = Math.max(mean1 + 6 * sd1, mean2 + 6 * sd2);
    double range = max - min;

    int resolution = (int) (range/Math.min(sd1, sd2));

    double partwidth = range / resolution;

    double intersectionArea = 0;

    int begin = (int)((Math.max(mean1 - 6 * sd1, mean2 - 6 * sd2)-min)/partwidth);
    int end = (int)((Math.min(mean1 + 6 * sd1, mean2 + 6 * sd2)-min)/partwidth);

    /// Divide the range into N partitions
    for (int ii = begin; ii < end; ii++) {

        double partMin = partwidth * ii;
        double partMax = partwidth * (ii + 1);

        double areaOfDist1 = normalDistribution1.probability(partMin, partMax);
        double areaOfDist2 = normalDistribution2.probability(partMin, partMax);

        intersectionArea += Math.min(areaOfDist1, areaOfDist2);
    }

    return intersectionArea;

}

0

Я думаю, что-то вроде этого может быть решением в MATLAB:

[overlap] = calc_overlap_twonormal(2,2,0,1,-20,20,0.01)

% numerical integral of the overlapping area of two normal distributions:
% s1,s2...sigma of the normal distributions 1 and 2
% mu1,mu2...center of the normal distributions 1 and 2
% xstart,xend,xinterval...defines start, end and interval width
% example: [overlap] = calc_overlap_twonormal(2,2,0,1,-10,10,0.01)

function [overlap2] = calc_overlap_twonormal(s1,s2,mu1,mu2,xstart,xend,xinterval)

clf
x_range=xstart:xinterval:xend;
plot(x_range,[normpdf(x_range,mu1,s1)' normpdf(x_range,mu2,s2)']);
hold on
area(x_range,min([normpdf(x_range,mu1,s1)' normpdf(x_range,mu2,s2)']'));
overlap=cumtrapz(x_range,min([normpdf(x_range,mu1,s1)' normpdf(x_range,mu2,s2)']'));
overlap2 = overlap(end);

[overlap] = calc_overlap_twonormal(2,2,0,1,-10,10,0.01) 

По крайней мере, я мог бы воспроизвести значение 0,8026, приведенное ниже Рис.1 в этом PDF-файле .

Вам просто нужно адаптировать начальное и конечное значения, а также значения интервала, чтобы быть точными, поскольку это только численное решение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.