İki normal dağılımın üst üste gelen bölgelerinin yüzdesi


46

Merak ediyorum, ve ile iki normal dağılım verildi.σ 2 , μ 2σ1, μ1σ2, μ2

  • İki dağılımın üst üste gelen bölgelerinin yüzdesini nasıl hesaplayabilirim?
  • Bu sorunun belirli bir adı olduğunu varsayalım, bu sorunu tanımlayan herhangi bir adın farkında mısınız?
  • Bunun herhangi bir uygulamasından haberdar mısınız (örneğin, Java kodu)?

2
Örtüşen bölge ile ne demek istiyorsunuz? Her iki yoğunluk eğrisinin altındaki alanı mı kastediyorsunuz?
Nick Sabbe,

İki alanın kesişmesini kastediyorum
Ali Salehi

4
Kısacası, iki pdfs'i ve olarak yazmak, gerçekten değerini hesaplamak ister misiniz ? Bizi bunun ortaya çıktığı bağlam ve bunun nasıl yorumlanacağı hakkında aydınlatabilir misiniz? fgmin(f(x),g(x))dx
whuber

Yanıtlar:


41

Buna genellikle "örtüşen katsayısı" (OVL) da denir. Bunun için googling size birçok hit verecektir. İki-normal durum için nomogramı burada bulabilirsiniz . Yararlı bir makale olabilir:

  • Henry F. Inman; Edwin L. Bradley Jr (1989). Olasılık dağılımları ile iki normal yoğunluğun örtüşmesinin nokta tahmini arasındaki anlaşmanın bir ölçüsü olarak örtüşen katsayısı. İstatistikte İletişim - Kuram ve Yöntem, 18 (10), 3851-3874. ( Bağlantı )

Düzenle

Şimdi beni daha çok ilgilendirdim, bu yüzden devam ettim ve bunu hesaplamak için R kodu yarattım (basit bir entegrasyon). Örtüşen bölgenin gölgelenmesi de dahil olmak üzere iki dağıtımın bir komplesine attım:

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)

Bu örnek için, sonuç: 0.6099324mutlak hata ile < 1e-04. Aşağıdaki şekil.

Örnek


10
(+1) Googling en az üç ayrı tanım ortaya çıkarır (Matsushita, Morisita ve Weitzman). Uygulaman Weitzman'ın.
whuber

1
0.60993 24, 0.60993 43398 78944 33895 ... için bir yaklaşık değerdir.
whuber

10

Bu Bhattacharyya katsayısı tarafından verilir . Diğer dağıtımlar için, genelleştirilmiş versiyona bakınız, Hellinger iki dağıtım arasındaki mesafeye.

Bunu hesaplayacak hiçbir kitaplık bilmiyorum, ancak Mahalanobis mesafeleri ve varyans matrislerinin belirleyicisi olarak açık formülasyona bakıldığında, uygulama bir sorun olmamalı.


3
Bhattacharyya katsayısı bir örtüşme ölçüsüdür, fakat aynı değildir, değil mi?
Stéphane Laurent

7

Bunu yapmanın bariz bir standart yolu olup olmadığını bilmiyorum ama:

İlk önce, iki yoğunluk arasındaki kesişme noktalarını bulursunuz. Bu, normal dağılım için x için ikinci dereceden bir denklemle sonuçlanması gereken her iki yoğunluğu eşitleyerek kolayca elde edilebilir.

yakın bir şey:

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

Bu, temel matematik ile çözülebilir.

Böylece sıfır, bir veya iki kesişme noktanız olur. Şimdi, bu kesişme noktaları gerçek çizgiyi 1, 2 veya üç parçaya böler; burada iki yoğunluğun herhangi biri en düşük olandır. Başka matematiksel bir şey aklına gelmezse, hangisinin en düşük olduğunu bulmak için parçalardan birinin içindeki herhangi bir noktayı deneyin.

İlgilendiğiniz değer, şimdi her bölümdeki en düşük yoğunluk eğrisinin altındaki alanların toplamıdır. Bu alan şimdi kümülatif dağılım fonksiyonundan bulunabilir (sadece değeri 'kısmın' her iki köşesinden de çıkarın.


4
(+1) Aslında, olduğunda, denklem ikinci dereceden formülle çözülebilir: hesaplamaya gerek yoktur. için düzenleme yaparsak (wlg) , ikinci yoğunluk iki sıfır arasında en küçük ve aksi takdirde ilk yoğunluk en küçüktür. Bu, hesaplamayı Normal CDF'nin dört değerlendirmesine indirger. İle durum lineer bir denklem çözümünü ve CDF iki değerlendirme gerektiren, daha basittir. μ 1μ 2 σ 1 = σ 2σ1σ2μ1μ2σ1=σ2
whuber

2
@whuber Bunu tam bir cevaba çevirebilir misiniz? Ya da belki Nick onun düzenleyebilir.
Aleksandr Dubinsky,

@whuber Bunu mu demek istediniz yerine ? μ 1μ 2σ1σ2μ1μ2
Stéphane Laurent

@ Stéphane SD'lerin sırayı belirlediğinin doğru olduğunu düşünüyorum: daha küçük SD'li yoğunluğun sonunda hem pozitif hem de negatif yönde daha küçük kuyrukları olacak ve bu nedenle sıfırlar ile başka yerlerdeki daha küçük değerler arasında daha büyük değerler olacaktır.
whuber

@whuber Evet ve gerçekten de, SD'lerin sırasının, Nick tarafından elde edilen polinomun 2. sıra katsayısının işaretini belirlediğini görmek kolaydır.
Stéphane Laurent

1

Kurtuluş için, wolfgang'ın çözümü benim için işe yaramadı - integratefonksiyonda hatalara rastladım . Bu yüzden Nick Staubbe'nin cevabını aşağıdaki küçük fonksiyonu geliştirmek için birleştirdim. Sayısal entegrasyon kullanmaktan daha hızlı ve daha az sorunlu olmalı:

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
}

geri dönmemeli (l+r)/2mi?
RSHAP

0

İşte Apache Commons Matematik Kütüphanesi Java versiyonu :

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’da bunun gibi bir çözüm olabileceğini düşünüyorum:

[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) 

En azından ben, Şekil 1 aşağıda verilen değeri 0,8026 üretebiliyordu bu pdf .

Sadece başlangıç ​​ve bitiş ve aralık değerlerini hassas bir şekilde uyarlamanız gerekir, çünkü bu sadece sayısal bir çözümdür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.