Làm thế nào để tính toán sự chồng chéo giữa mật độ xác suất theo kinh nghiệm?


14

Tôi đang tìm một phương pháp để tính diện tích chồng lấp giữa hai ước tính mật độ hạt nhân trong R, như là một phép đo tương tự giữa hai mẫu. Để làm rõ, trong ví dụ sau, tôi sẽ cần định lượng diện tích của vùng chồng lấn tịnh độ:

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)

nhập mô tả hình ảnh ở đây

Một câu hỏi tương tự đã được thảo luận ở đây , sự khác biệt là tôi cần phải làm điều này cho dữ liệu thực nghiệm tùy ý thay vì phân phối bình thường được xác định trước. Các overlapđịa chỉ gói câu hỏi này, nhưng dường như chỉ dành cho dữ liệu dấu thời gian, mà không làm việc cho tôi. Chỉ số Bray-Curtis (như được thực hiện trong chức năng vegancủa gói vegdist(method="bray")) cũng có vẻ phù hợp nhưng một lần nữa cho dữ liệu hơi khác nhau.

Tôi quan tâm đến cả cách tiếp cận lý thuyết và các hàm R mà tôi có thể sử dụng để thực hiện nó.


2
"Định lượng vùng màu tím" là một vấn đề trong ước tính, không phải trong kiểm tra giả thuyết, vì vậy bạn không thể hy vọng "hoàn thành việc này bằng cách sử dụng một bài kiểm tra thống kê tiêu chuẩn ". Bạn mâu thuẫn với chính mình. Hãy làm rõ những gì bạn thực sự muốn. Nếu tất cả những gì bạn muốn là ước tính diện tích chồng lấp của hai KDE, thì đó là một phép tính đơn giản.
Glen_b -Reinstate Monica

@Glen_b cảm ơn vì nhận xét, đã giúp làm rõ suy nghĩ phi thống kê của tôi. Tôi tin rằng khu vực chồng chéo giữa các KDE thực sự là những gì tôi đang tìm kiếm - Tôi đã chỉnh sửa câu hỏi để phản ánh điều đó.
mmk

2
Tôi sẽ rất lo lắng về nguy cơ độc đoán trong phương pháp này. Tùy thuộc vào băng thông kernel, sự chồng lấp được tính toán giữa hai bộ dữ liệu bất kỳ có thể được thực hiện bằng với bất kỳ giá trị được chọn nào trong khoảng . Băng thông mặc định không được tối ưu hóa cho mục đích này và do đó có thể hiểu được có thể mang lại kết quả đáng ngạc nhiên, tùy ý hoặc không nhất quán. Các bộ dữ liệu có giới hạn tự nhiên (như dữ liệu hoặc tỷ lệ không âm, v.v.) sẽ tiếp tục giới thiệu các hiệu ứng cạnh không mong muốn. Thay vào đó, phải làm gì? Bắt đầu với lý do cho tính toán này: "sự giống nhau" này có nghĩa là gì? (0,1)
whuber

Câu hỏi tương tự xuất hiện vài tháng sau đó nhưng được đề cập đến các điểm giao nhau tuy nhiên có một số lưu ý hợp lệ có thể được xem xét. Trong câu hỏi được đề cập là về hai phân phối theo kinh nghiệm. Tôi thêm liên kết vì bài đăng này chỉ trả lời điều này thông qua ước tính mật độ hạt nhân và cho các phân phối bình thường. Liên kết dưới đây tôi nghĩ mở rộng về câu hỏi cho các cặp phân phối theo kinh nghiệm. stats.stackexchange.com/questions/122857/ Mạnh - Barnaby 7 giờ trước
Barnaby

Câu trả lời:


9

Diện tích chồng lấp của hai ước tính mật độ hạt nhân có thể xấp xỉ với bất kỳ mức độ chính xác mong muốn nào.

1) Vì các KDE ban đầu có thể đã được đánh giá qua một số lưới, nếu lưới giống nhau cho cả hai (hoặc có thể dễ dàng thực hiện giống nhau), bài tập có thể dễ dàng như chỉ cần lấy tại mỗi điểm và sau đó sử dụng quy tắc hình thang hoặc thậm chí là quy tắc trung điểm.min(K1(x),K2(x))

Nếu cả hai nằm trên các lưới khác nhau và không thể dễ dàng tính toán lại trên cùng một lưới, phép nội suy có thể được sử dụng.

2) Bạn có thể tìm thấy điểm (hoặc điểm) của giao điểm và tích hợp điểm thấp hơn của hai KDE trong mỗi khoảng thời gian nơi mỗi điểm thấp hơn. Trong sơ đồ của bạn ở trên, bạn sẽ tích hợp đường cong màu xanh ở bên trái của giao lộ và đường màu hồng ở bên phải bằng bất kỳ phương tiện nào bạn muốn / có sẵn. Điều này có thể được thực hiện chính xác bằng cách xem xét khu vực dưới mỗi thành phần hạt nhân ở bên trái hoặc bên phải của điểm giới hạn đó.1hK(xxih)

Tuy nhiên , các ý kiến ​​của người đăng ký ở trên cần được ghi nhớ rõ ràng - đây không hẳn là một việc rất có ý nghĩa.


Làm thế nào để bạn tính toán lỗi liên quan đến phương pháp một và phương pháp 2?
olliepower

Trong trường hợp bình thường, cả hai sẽ rất nhỏ so với sai số trong ước tính mật độ hạt nhân, vì vậy tôi sẽ không lo lắng quá nhiều. Tất nhiên, các giới hạn lỗi có thể được tính toán trên các phương pháp hình thang và tích hợp số khác - các tính toán như vậy là khá chuẩn - nhưng thật đáng lo ngại khi các KDE có độ không đảm bảo lớn. Phương pháp 2 sẽ chính xác với sai số làm tròn tích lũy của các phép tính.
Glen_b -Reinstate Monica

1
Những đề xuất phương pháp này có ý nghĩa, cảm ơn rất nhiều cho câu trả lời của bạn. Tôi sẽ làm việc để thực hiện điều này trong R, nhưng như một người mới, tôi sẽ quan tâm đến các đề xuất về cách viết mã này một cách sạch sẽ.
mmk

10

Để hoàn thiện, đây là cách tôi kết thúc việc này trong R:

# 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

Như đã lưu ý, có sự không chắc chắn và chủ quan vốn có liên quan đến thế hệ KDE và cả trong quá trình tích hợp.


2
Hiện tại có một gói trên CRAN được gọi là overlappingước tính diện tích chồng lấp của 2 (hoặc nhiều hơn) phân phối theo kinh nghiệm. Kiểm tra tài liệu ở đây: rdocumentation.org/packages/overlaps/versions/1.5.0/topics/ cảm
Stefan Avey

x,dx,dx,d

@mmk bạn có thể làm điều này cho mật độ 2D không?
Không nói dối

4

Đầu tiên, tôi có thể sai nhưng tôi nghĩ giải pháp của bạn sẽ không hoạt động trong trường hợp có nhiều điểm trong đó Ước tính mật độ hạt nhân (KDE) giao nhau. Thứ hai, mặc dù overlapgói được tạo để sử dụng với dữ liệu dấu thời gian, bạn vẫn có thể sử dụng gói đó để ước tính diện tích chồng lấp của hai KDE bất kỳ. Bạn chỉ cần thay đổi dữ liệu của mình để nó nằm trong khoảng từ 0 đến 2π.
Ví dụ như :

# 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)
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.