Ampirik olasılık yoğunlukları arasındaki çakışma nasıl hesaplanır?


14

İki örnek arasındaki benzerlik ölçüsü olarak, R iki çekirdek yoğunluk tahminleri arasındaki örtüşme alanını hesaplamak için bir yöntem arıyorum. Açıklamak için, aşağıdaki örnekte, morumsu örtüşen bölgenin alanını ölçmem gerekir:

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)

resim açıklamasını buraya girin

Benzer bir soru tartışıldı burada fark doğrusu önceden normal dağılım dışındaki keyfi ampirik veriler için bunu yapmak gerektiğini olmak. overlapPaket adresleri bu soru, ama görünüşe göre sadece benim için iş değil damgası veriler için. Bray-Curtis endeksi ( veganpaketin vegdist(method="bray")işlevinde uygulandığı şekliyle ) da yine de biraz farklı veriler için alakalı görünüyor.

Hem teorik yaklaşımla hem de bunu uygulamak için kullanabileceğim R fonksiyonlarıyla ilgileniyorum.


2
"mor alanı ölçmek" tahminte bir problemdir, hipotez testinde değil, bu yüzden "bunu standart, kabul edilebilir bir istatistiksel test kullanarak başarmayı" ümit edemezsiniz . Kendinizle çelişiyorsunuz. Lütfen gerçekten ne istediğinizi açıklığa kavuşturun . İstediğiniz tek şey iki KDE'nin çakışma alanının tahmini ise, bu basit bir hesaplamadır.
Glen_b

@Glen_b yorum için teşekkürler, istatistikçi olmayan düşüncemi açıklığa kavuşturmaya yardımcı oldu. KDE'ler arasındaki çakışma alanının gerçekten aradığım şey olduğuna inanıyorum - bunu yansıtmak için soruyu düzenledim.
mmk

2
Bu yöntemde keyfilik riski konusunda çok endişe duyarım. Çekirdek bant genişliğine bağlı olarak, herhangi iki veri kümesi arasındaki hesaplanan örtüşme , aralığında seçilen herhangi bir değere eşit olacak şekilde yapılabilir . Varsayılan bant genişlikleri bu amaç için optimize edilmemiştir ve bu nedenle muhtemelen şaşırtıcı, keyfi veya tutarsız sonuçlar verebilir. Doğal sınırlara sahip veri kümeleri (negatif olmayan veriler veya oranlar vb.) Ayrıca istenmeyen kenar efektleri getirecektir. Bunun yerine ne yapmalı? Bu hesaplamanın nedeniyle başlayın: Bu "benzerlik" ne anlama geliyor? (0,1)
whuber

Aynı soru birkaç ay sonra ortaya çıktı ancak kesişme noktalarına atıfta bulunuldu, ancak dikkate alınabilecek bazı geçerli notlar vardı. Bahsedilen soruda yaklaşık iki ampirik dağılım vardır. Bu yazı sadece çekirdek yoğunluk tahmini ve normal dağılımlar için cevap verdiğinden bağlantıyı ekliyorum. Aşağıdaki link bence ampirik dağılım çiftleri için soruya uzanıyor. stats.stackexchange.com/questions/122857/… - Barnaby 7 saat önce
Barnaby

Yanıtlar:


9

İki çekirdek yoğunluk tahmininin üst üste binme alanı, istenen herhangi bir doğruluk derecesine yakın olabilir.

1) Orijinal KDE'ler muhtemelen bazı ızgaralar üzerinde değerlendirildiğinden, ızgara her ikisi için de aynıysa (veya kolayca aynı hale getirilebiliyorsa), egzersiz sadece almak kadar kolay olabilir her noktada ve daha sonra yamuk kuralı, hatta bir orta nokta kuralı kullanarak.min(K1(x),K2(x))

İkisi farklı ızgaralar üzerindeyse ve aynı ızgarada kolayca yeniden hesaplanamıyorsa, enterpolasyon kullanılabilir.

2) Kavşak noktasını (veya noktalarını) bulabilir ve her bir aralığın daha düşük olduğu her aralıkta iki KDE'nin altını entegre edebilirsiniz. Yukarıdaki şemanızda, kavşağın solundaki mavi eğriyi ve sağdaki pembe eğriyi istediğiniz / sahip olduğunuz araçlarla entegre edersiniz. Bu esasen, her kesme bileşeninin altındaki kesme noktasının solundaki veya sağındaki alan dikkate alınarak yapılabilir .1hK(xxih)

Ancak , whuber'ın yukarıdaki yorumları açıkça akılda tutulmalıdır - bu mutlaka yapılması gereken çok anlamlı bir şey değildir.


Birinci yöntem ve yöntem 2 ile ilişkili hatayı nasıl hesaplarsınız?
olliepower

Normal koşullarda, her ikisi de çekirdek yoğunluğu tahminlerindeki hataya kıyasla minik olacaktır, bu yüzden çok fazla endişelenmeyeceğim. Hata sınırları trapezoidal yöntemlerde ve elbette diğer sayısal entegrasyonlarda hesaplanabilir - bu tür hesaplamalar oldukça standarttır - ancak KDE'lerin büyük belirsizlikleri olduğu göz önüne alındığında anlamsız bir endişe kaynağıdır. Yöntem 2, hesaplamaların biriken yuvarlama hatası için doğru olacaktır.
Glen_b

1
Bu metodoloji önerileri mantıklı, cevabınız için çok teşekkürler. Bunu R'de uygulamaya çalışacağım, ancak acemi olarak bunu nasıl temiz bir şekilde kodlayacağınıza dair önerilerle ilgileneceğim.
mmk

10

Tamlık uğruna, bunu R'de nasıl bitirdim:

# simulate two samples
a <- rnorm(100)
b <- rnorm(100, 2)

# define limits of a common grid, adding a buffer so that tails aren't cut off
lower <- min(c(a, b)) - 1 
upper <- max(c(a, b)) + 1

# generate kernel densities
da <- density(a, from=lower, to=upper)
db <- density(b, from=lower, to=upper)
d <- data.frame(x=da$x, a=da$y, b=db$y)

# calculate intersection densities
d$w <- pmin(d$a, d$b)

# integrate areas under curves
library(sfsmisc)
total <- integrate.xy(d$x, d$a) + integrate.xy(d$x, d$b)
intersection <- integrate.xy(d$x, d$w)

# compute overlap coefficient
overlap <- 2 * intersection / total

Belirtildiği gibi, KDE kuşağında ve entegrasyonda doğal bir belirsizlik ve öznellik vardır.


2
Artık CRAN üzerinde overlapping2 (veya daha fazla) ampirik dağılımın örtüşme alanını tahmin eden bir paket var . Buradaki belgelere göz atın: rdocumentation.org/packages/overlapping/versions/1.5.0/topics/…
Stefan Avey

Toplam şöyle olmalıdır: total = integrate.xy (d a) + integrate.xy (d b) - integrate.xy (d w), üst üste binen paket kullanılarak onaylanabilir. x,dx,dx,d
Rafael

@ mmk bunu 2D yoğunlukları için yapabilir misiniz?
OverFlow Police

4

Birincisi, yanılıyor olabilirim ama Çekirdek Yoğunluk Tahminlerinin (KDE) kesiştiği birden fazla nokta olması durumunda çözümünüzün işe yaramayacağını düşünüyorum. İkincisi, overlappaket zaman damgası verileriyle kullanılmak üzere oluşturulmuş olsa da , herhangi iki KDE'nin çakışma alanını tahmin etmek için yine de kullanabilirsiniz. Verilerinizi 0 ile 2π arasında değişecek şekilde yeniden ölçeklendirmeniz yeterlidir.
Örneğin :

# simulate two sample    
 a <- rnorm(100)
 b <- rnorm(100, 2)

# To use overplapTrue(){overlap} the scale must be in radian (i.e. 0 to 2pi)
# To keep the *relative* value of a and b the same, combine a and b in the
# same dataframe before rescaling. You'll need to load the ‘scales‘ library.
# But first add a "Source" column to be able to distinguish between a and b
# after they are combined.
 a = data.frame( value = a, Source = "a" )
 b = data.frame( value = b, Source = "b" )
 d = rbind(a, b)
 library(scales) 
 d$value <- rescale( d$value, to = c(0,2*pi) )

# Now you can created the rescaled a and b vectors
 a <- d[d$Source == "a", 1]
 b <- d[d$Source == "b", 1]

# You can then calculate the area of overlap as you did previously.
# It should give almost exactly the same answers.
# Or you can use either the overlapTrue() and overlapEst() function 
# provided with the overlap packages. 
# Note that with these function the KDE are fitted using von Mises kernel.
 library(overlap)
  # Using overlapTrue():
   # define limits of a common grid, adding a buffer so that tails aren't cut off
     lower <- min(d$value)-1 
     upper <- max(d$value)+1
   # generate kernel densities
     da <- density(a, from=lower, to=upper, adjust = 1)
     db <- density(b, from=lower, to=upper, adjust = 1)
   # Compute overlap coefficient
     overlapTrue(da$y,db$y)


  # Using overlapEst():            
    overlapEst(a, b, kmax = 3, adjust=c(0.8, 1, 4), n.grid = 500)

# You can also plot the two KDEs and the region of overlap using overlapPlot()
# but sadly I haven't found a way of changing the x scale so that the scale 
# range correspond to the initial x value and not the rescaled value.
# You can only change the maximum value of the scale using the xscale argument 
# (i.e. it always range from 0 to n, where n is set with xscale = n).
# So if some of your data take negative value, you're probably better off with
# a different plotting method. You can change the x label with the xlab
# argument.  
  overlapPlot(a, b, xscale = 10, xlab= "x metrics", rug=T)
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.