Tỷ lệ vùng chồng lấp của hai phân phối bình thường


46

Tôi đã tự hỏi, đã đưa ra hai bản phân phối bình thường với vàσ1, μ1σ2, μ2

  • Làm thế nào tôi có thể tính tỷ lệ phần trăm của các vùng chồng lấp của hai bản phân phối?
  • Tôi cho rằng vấn đề này có một tên cụ thể, bạn có biết bất kỳ tên cụ thể nào mô tả vấn đề này không?
  • Bạn có biết về bất kỳ triển khai nào của điều này (ví dụ: mã Java) không?

2
Bạn có ý nghĩa gì với khu vực chồng chéo? Bạn có nghĩa là khu vực dưới cả hai đường cong mật độ?
Nick Sabbe

Ý tôi là giao điểm của hai khu vực
Ali Salehi

4
Nói tóm lại, viết hai pdf là và , bạn có thực sự muốn tính không? Bạn có thể khai sáng cho chúng tôi về bối cảnh mà điều này phát sinh và làm thế nào nó sẽ được giải thích? đụgmin(f(x),g(x))dx
whuber

Câu trả lời:


41

Điều này cũng thường được gọi là "hệ số chồng chéo" (OVL). Googling cho điều này sẽ cung cấp cho bạn rất nhiều hit. Bạn có thể tìm thấy một biểu đồ cho trường hợp bi-normal ở đây . Một bài báo hữu ích có thể là:

  • Henry F. Inman; Edwin L. Bradley Jr (1989). Hệ số chồng lấp như là thước đo thỏa thuận giữa phân phối xác suất và ước tính điểm của sự chồng chéo của hai mật độ thông thường. Truyền thông trong Thống kê - Lý thuyết và Phương pháp, 18 (10), 3851-3874. ( Liên kết )

Biên tập

Bây giờ bạn đã khiến tôi quan tâm đến điều này nhiều hơn, vì vậy tôi đã tiếp tục và tạo mã R để tính toán điều này (đó là một sự tích hợp đơn giản). Tôi đã ném vào một âm mưu của hai bản phân phối, bao gồm cả bóng của vùng chồng lấp:

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)

Trong ví dụ này, kết quả là: 0.6099324với lỗi tuyệt đối < 1e-04. Hình bên dưới.

Thí dụ


10
(+1) Googling bật lên ít nhất ba định nghĩa riêng biệt (Matsushita, Morisita và Weitzman). Việc thực hiện của bạn là của Weitzman.
whuber

1
0,60993 24 là một xấp xỉ cho 0,60993 43398 78944 33895 ....
whuber

10

Điều này được đưa ra bởi hệ số Bhattacharyya . Đối với các bản phân phối khác, xem thêm phiên bản tổng quát, khoảng cách Hellinger giữa hai bản phân phối.

Tôi không biết bất kỳ thư viện nào để tính toán điều này, nhưng với công thức rõ ràng về khoảng cách Mahalanobis và yếu tố quyết định của ma trận phương sai, việc thực hiện không phải là một vấn đề.


3
Hệ số Bhattacharyya là thước đo của sự chồng chéo nhưng nó không giống nhau, phải không?
Stéphane Laurent

7

Tôi không biết nếu có một cách tiêu chuẩn rõ ràng để làm điều này, nhưng:

Đầu tiên, bạn tìm thấy các điểm giao nhau giữa hai mật độ. Điều này có thể dễ dàng đạt được bằng cách đánh đồng cả hai mật độ, đối với phân phối chuẩn, sẽ dẫn đến một phương trình bậc hai cho x.

(x-μ2)22σ22-(x-μ1)22σ12= =đăng nhậpσ1σ2

Điều này có thể được giải quyết với tính toán cơ bản.

Do đó, bạn có điểm 0, một hoặc hai điểm giao nhau. Bây giờ, các điểm giao nhau này chia dòng thực thành 1, 2 hoặc ba phần, trong đó một trong hai mật độ là phần thấp nhất. Nếu không có gì toán học xuất hiện trong đầu, chỉ cần thử bất kỳ điểm nào trong một trong các phần để tìm điểm nào thấp nhất.

Giá trị quan tâm của bạn bây giờ là tổng của các khu vực dưới đường cong mật độ thấp nhất trong mỗi phần. Bây giờ khu vực này có thể được tìm thấy từ hàm phân phối tích lũy (chỉ cần trừ giá trị ở cả hai cạnh của 'phần'.


4
σ1σ2μ1μ2σ1= =σ2

2
@whuber Bạn có thể biến điều này thành một câu trả lời đầy đủ không? Hoặc có lẽ Nick có thể chỉnh sửa của mình.
Alexanderr Dubinsky

σ1σ2μ1μ2

@ Stéphane Tôi nghĩ rằng bạn đúng khi các SD xác định thứ tự: mật độ với SD nhỏ hơn cuối cùng sẽ có các đuôi nhỏ hơn theo cả hai hướng tích cực và tiêu cực và do đó sẽ có các giá trị lớn hơn giữa các số 0 và các giá trị nhỏ hơn ở nơi khác.
whuber

@whuber Có, và thực sự dễ dàng nhận thấy rằng thứ tự của các SD xác định dấu hiệu của hệ số bậc 2 của đa thức xuất phát từ Nick.
Stéphane Laurent

1

Đối với hậu thế, giải pháp của wolfgang không hiệu quả với tôi. Tôi gặp phải lỗi trong integratechức năng. Vì vậy, tôi đã kết hợp nó với câu trả lời của Nick Staubbe để phát triển chức năng nhỏ sau đây. Nên nhanh hơn và ít lỗi hơn so với sử dụng tích hợp số:

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
}

nó có nên trở lại (l+r)/2không?
RSHAP

0

Đây là phiên bản Java, Thư viện toán học 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

Tôi nghĩ một cái gì đó như thế này có thể là giải pháp trong 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) 

Ít nhất tôi có thể tái tạo giá trị 0,8026 được đưa ra bên dưới Hình 1 trong pdf này .

Bạn chỉ cần điều chỉnh các giá trị bắt đầu và kết thúc và khoảng chính xác vì đây chỉ là một giải pháp số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.