दो सामान्य वितरण के अतिव्यापी क्षेत्रों का प्रतिशत


46

मैं सोच रहा था, दो सामान्य वितरण औरσ1, μ1σ2, μ2

  • मैं दो वितरणों के अतिव्यापी क्षेत्रों के प्रतिशत की गणना कैसे कर सकता हूं?
  • मुझे लगता है कि इस समस्या का एक विशिष्ट नाम है, क्या आप इस समस्या का वर्णन करने वाले किसी विशेष नाम से अवगत हैं?
  • क्या आप इसे (जैसे जावा कोड) के किसी भी कार्यान्वयन के बारे में जानते हैं?

2
अतिव्यापी क्षेत्र के साथ आपका क्या मतलब है? क्या आपका मतलब उस क्षेत्र से है जो दोनों घनत्व घटता है?
निक सब्बे

मेरा मतलब दो क्षेत्रों के चौराहे से है
अली सलेही

4
संक्षेप में, दो pdfs को और रूप में लिखते हुए , क्या आप वास्तव में गणना करना चाहते हैं ? क्या आप हमें उस संदर्भ के बारे में बता सकते हैं जिसमें यह बात उठती है और इसकी व्याख्या कैसे की जाएगी? fgmin(f(x),g(x))dx
whuber

जवाबों:


41

इसे अक्सर "अतिव्यापी गुणांक" (OVL) भी कहा जाता है। इसके लिए Googling आपको बहुत सारे हिट देगा। आप यहां द्वि-सामान्य मामले के लिए एक नाममात्र पा सकते हैं । एक उपयोगी कागज हो सकता है:

  • हेनरी एफ। इनमैन; एडविन एल। ब्रैडली जूनियर (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) Googling कम से कम तीन अलग-अलग परिभाषाओं (Matsushita, Morisita, और Weitzman) को बदल देता है। आपका कार्यान्वयन वेत्ज़मैन का है।
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μ1μ2σ1=σ2
व्हीबर

2
क्या आप इसे पूर्ण उत्तर में बदल सकते हैं? या शायद निक उसे संपादित कर सकते हैं।
9:13 पर फ़िजीशियन डबिन्स्की

@whuber क्या आपने बजाय ? μ 1μ 2σ1σ2μ1μ2
स्टीफन लॉरेंट

@ स्टीफन मुझे लगता है कि आप सही हैं कि एसडी आदेश का निर्धारण करते हैं: छोटे एसडी के साथ घनत्व अंततः सकारात्मक और नकारात्मक दोनों दिशाओं में छोटी पूंछ होगा और इसलिए शून्य और छोटे मूल्यों के बीच कहीं और बड़ा मान होगा।
whuber

@whuber हां, और वास्तव में यह देखना आसान है कि एसडी के आदेश निक द्वारा प्राप्त पोलिनोम के 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

यहाँ जावा संस्करण है, अपाचे कॉमन्स गणित पुस्तकालय :

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) 

कम से कम मैं इस पीडीएफ में Fig.1 के नीचे दिए गए 0.8026 के मूल्य को पुन: पेश कर सकता हूं ।

आपको केवल सटीक होने के लिए शुरुआत और अंत और अंतराल मूल्यों को अनुकूलित करने की आवश्यकता है क्योंकि यह केवल एक संख्यात्मक समाधान है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.