Mengintegrasikan penduga kepadatan kernel dalam 2D

12

Saya datang dari pertanyaan ini kalau-kalau ada yang ingin mengikuti jejak.

Pada dasarnya saya memiliki kumpulan data Ω terdiri dari objek N mana setiap objek memiliki sejumlah nilai terukur yang melekat padanya (dua dalam kasus ini):

Ω=o1[x1,y1],o2[x2,y2],...,oN[xN,yN]

Saya perlu cara untuk menentukan probabilitas baru objek p[xp,yp] dari milik Ω jadi saya disarankan dalam pertanyaan itu untuk mendapatkan kepadatan probabilitas f melalui estimator densitas kernel, yang saya percaya saya sudah punya .f^

Karena tujuan saya adalah untuk mendapatkan probabilitas objek baru ini ( p[xp,yp] ) dari milik ini 2D kumpulan data Ω , saya diberitahu untuk mengintegrasikan pdf f lebih " nilai-nilai dari dukungan yang densitas kurang dari yang Anda amati ". The "mengamati" kepadatan f dievaluasi dalam objek baru p , yaitu: f ( x p , y p ) . Jadi saya perlu memecahkan persamaan:f^f^pf^(xp,yp)

x,y:f^(x,y)<f^(xp,yp)f^(x,y)dxdy

PDF dari kumpulan data 2D saya (diperoleh melalui modul stats.gaussian_kde python ) terlihat seperti ini:

masukkan deskripsi gambar di sini

di mana titik merah mewakili objek baru diplot pada PDF dari kumpulan data saya.p[xp,yp]

Jadi pertanyaannya adalah: bagaimana saya bisa menghitung integral di atas untuk batas ketika pdf terlihat seperti itu?x,y:f^(x,y)<f^(xp,yp)


Menambahkan

Saya melakukan beberapa tes untuk melihat seberapa baik metode Monte Carlo yang saya sebutkan di salah satu komentar bekerja. Inilah yang saya dapat:

meja

Nilai-nilai tampak sedikit lebih bervariasi untuk daerah kepadatan lebih rendah dengan kedua bandwidth menunjukkan variasi yang kurang lebih sama. Variasi terbesar dalam tabel terjadi untuk titik (x, y) = (2,4,1.5) membandingkan nilai sampel 2500,000 1000 Silverman, yang memberikan perbedaan 0.0126atau ~1.3%. Dalam kasus saya ini sebagian besar dapat diterima.

Sunting : Saya baru saja memperhatikan bahwa dalam 2 dimensi aturan Scott sama dengan Silverman sesuai dengan definisi yang diberikan di sini .

Gabriel
sumber
2
Pernahkah Anda memperhatikan estimator Anda bukan unimodal, tetapi rekomendasi yang Anda ikuti secara eksplisit hanya berlaku untuk distribusi "unimodal"? Itu tidak berarti Anda melakukan sesuatu yang salah, tetapi itu harus menghasilkan pemikiran keras tentang apa artinya jawabannya.
whuber
Hai @whuber, sebenarnya jawaban dalam pertanyaan itu mengatakan bahwa "berperilaku baik" untuk distribusi unimodal, jadi saya pikir mungkin itu bisa mengatasi masalah saya dengan beberapa modifikasi. Apakah "berperilaku baik" berarti "hanya bekerja" dalam jargon statistik (pertanyaan jujur)? Bersulang.
Gabriel
Perhatian utama saya adalah bahwa KDE mungkin sensitif terhadap pilihan bandwidth dan saya berharap Anda tidak terpisahkan, terutama untuk tempat-tempat marginal seperti yang ditunjukkan dalam ilustrasi, akan sangat sensitif terhadap pilihan. (Kalkulasi itu sendiri, omong-omong, mudah sekali Anda telah membuat gambar raster seperti ini: itu sebanding dengan nilai rata-rata dalam gambar di antara titik-titik yang nilainya kurang dari titik "penyelidikan".) Anda dapat mendekati ini dengan menghitung jawaban untuk berbagai bandwidth yang masuk akal dan melihat apakah ia berubah dalam cara material apa pun dalam rentang itu. Jika tidak, Anda baik-baik saja.
Whuber
f^
Berapa banyak pengamatan yang Anda miliki dalam dataset Anda?
Hong Ooi

Jawaban:

11

Cara sederhana adalah merasterisasi domain integrasi dan menghitung pendekatan diskrit ke integral.

Ada beberapa hal yang harus diperhatikan:

  1. Pastikan untuk mencakup lebih dari batas poin: Anda harus menyertakan semua lokasi di mana estimasi kepadatan kernel akan memiliki nilai yang cukup besar. Ini berarti Anda perlu memperluas titik dengan tiga hingga empat kali bandwidth kernel (untuk kernel Gaussian).

  2. Hasilnya akan sedikit berbeda dengan resolusi raster. Resolusi perlu sebagian kecil dari bandwidth. Karena waktu perhitungan proporsional dengan jumlah sel dalam raster, hampir tidak ada waktu ekstra untuk melakukan serangkaian perhitungan menggunakan resolusi yang lebih kasar daripada yang dimaksud: periksa bahwa hasil untuk yang lebih kasar konvergen pada hasil untuk resolusi terbaik. Jika tidak, resolusi yang lebih baik mungkin diperlukan.

Berikut ini adalah ilustrasi untuk dataset 256 poin:

Gambar 1

Poin ditampilkan sebagai titik-titik hitam yang ditumpangkan pada dua perkiraan kepadatan kernel. Enam poin merah besar adalah "probe" di mana algoritma dievaluasi. Ini telah dilakukan untuk empat bandwidth (default antara 1,8 (vertikal) dan 3 (horizontal), 1/2, 1, dan 5 unit) pada resolusi 1000 oleh 1000 sel. Matriks scatterplot berikut menunjukkan seberapa kuat hasil bergantung pada bandwidth untuk enam titik penyelidikan ini, yang mencakup berbagai kepadatan:

Gambar 2

Variasi terjadi karena dua alasan. Jelas perkiraan kepadatan berbeda, memperkenalkan satu bentuk variasi. Lebih penting lagi, perbedaan dalam estimasi kepadatan dapat menciptakan perbedaan besar pada setiap titik ("penyelidikan"). Variasi yang terakhir adalah yang terbesar di sekitar "pinggiran" kepadatan menengah dari kelompok titik - tepatnya lokasi tempat perhitungan ini paling sering digunakan.

Ini menunjukkan perlunya kehati-hatian yang substansial dalam menggunakan dan menafsirkan hasil perhitungan ini, karena mereka bisa sangat sensitif terhadap keputusan yang relatif sewenang-wenang (bandwidth untuk digunakan).


Kode R

Algoritma ini terkandung dalam setengah lusin baris fungsi pertama f,. Untuk menggambarkan penggunaannya, sisa kode menghasilkan angka-angka sebelumnya.

library(MASS)     # kde2d
library(spatstat) # im class
f <- function(xy, n, x, y, ...) {
  #
  # Estimate the total where the density does not exceed that at (x,y).
  #
  # `xy` is a 2 by ... array of points.
  # `n`  specifies the numbers of rows and columns to use.
  # `x` and `y` are coordinates of "probe" points.
  # `...` is passed on to `kde2d`.
  #
  # Returns a list:
  #   image:    a raster of the kernel density
  #   integral: the estimates at the probe points.
  #   density:  the estimated densities at the probe points.
  #
  xy.kde <- kde2d(xy[1,], xy[2,], n=n, ...)
  xy.im <- im(t(xy.kde$z), xcol=xy.kde$x, yrow=xy.kde$y) # Allows interpolation $
  z <- interp.im(xy.im, x, y)                            # Densities at the probe points
  c.0 <- sum(xy.kde$z)                                   # Normalization factor $
  i <- sapply(z, function(a) sum(xy.kde$z[xy.kde$z < a])) / c.0
  return(list(image=xy.im, integral=i, density=z))
}
#
# Generate data.
#
n <- 256
set.seed(17)
xy <- matrix(c(rnorm(k <- ceiling(2*n * 0.8), mean=c(6,3), sd=c(3/2, 1)), 
               rnorm(2*n-k, mean=c(2,6), sd=1/2)), nrow=2)
#
# Example of using `f`.
#
y.probe <- 1:6
x.probe <- rep(6, length(y.probe))
lims <- c(min(xy[1,])-15, max(xy[1,])+15, min(xy[2,])-15, max(xy[2,]+15))
ex <- f(xy, 200, x.probe, y.probe, lim=lims)
ex$density; ex$integral
#
# Compare the effects of raster resolution and bandwidth.
#
res <- c(8, 40, 200, 1000)
system.time(
  est.0 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, lims=lims)$integral))
est.0
system.time(
  est.1 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=1, lims=lims)$integral))
est.1
system.time(
  est.2 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=1/2, lims=lims)$integral))
est.2
system.time(
  est.3 <- sapply(res, 
           function(i) f(xy, i, x.probe, y.probe, h=5, lims=lims)$integral))
est.3
results <- data.frame(Default=est.0[,4], Hp5=est.2[,4], 
                      H1=est.1[,4], H5=est.3[,4])
#
# Compare the integrals at the highest resolution.
#
par(mfrow=c(1,1))
panel <- function(x, y, ...) {
  points(x, y)
  abline(c(0,1), col="Red")
}
pairs(results, lower.panel=panel)
#
# Display two of the density estimates, the data, and the probe points.
#
par(mfrow=c(1,2))
xy.im <- f(xy, 200, x.probe, y.probe, h=0.5)$image
plot(xy.im, main="Bandwidth=1/2", col=terrain.colors(256))
points(t(xy), pch=".", col="Black")
points(x.probe, y.probe, pch=19, col="Red", cex=.5)

xy.im <- f(xy, 200, x.probe, y.probe, h=5)$image
plot(xy.im, main="Bandwidth=5", col=terrain.colors(256))
points(t(xy), pch=".", col="Black")
points(x.probe, y.probe, pch=19, col="Red", cex=.5)
whuber
sumber
Jawaban yang luar biasa, meskipun saya tidak yakin saya mengerti arti dari Defaultdan Hp5bandwidth (saya berasumsi H1dan H5berarti h=1dan h=5) Apakah Hp5nilainya h=1/2? Kalau begitu apa Default?
Gabriel
1
kde2dbandwidth.nrd31.8515
Jadi, apakah saya memahami dengan benar jika saya mengatakan bahwa ketika saya meningkatkan bandwidth yang digunakan, tingkat hasilnya kdejuga meningkat (dan jadi saya perlu memperpanjang batas integrasi)? Mengingat bahwa saya dapat hidup dengan kesalahan <10%dalam nilai integral yang dihasilkan, apa pendapat Anda tentang penggunaan aturan Scott?
Gabriel
Saya pikir karena aturan ini dikembangkan untuk tujuan yang sama sekali berbeda, Anda harus curiga mereka mungkin tidak berkinerja baik untuk tujuan Anda, terutama jika ingin menerapkan saran yang dibuat di stats.stackexchange.com/questions/63263 . Terlalu dini untuk khawatir tentang aturan praktis yang mungkin Anda gunakan untuk KDE; pada tahap ini Anda harus benar-benar peduli apakah seluruh pendekatan akan bekerja dengan andal.
whuber
1
Gosok di atas. Saya lakukan memiliki cara untuk mengetahui apakah pelaksanaan bekerja dan bahkan kuantifikasi seberapa baik itu bekerja. Ini agak rumit dan memakan waktu, tetapi saya bisa (harus bisa) melakukannya.
Gabriel
1

x0f^xf^(x)<f^(x0)

f^(x0)x

Hong Ooi
sumber
Beberapa analisis kuantitatif rekomendasi ini, atau setidaknya satu contoh aplikasi yang sebenarnya, akan diterima. Saya menduga bahwa keakuratan proposal Anda sangat tergantung pada bentuk kernel. Ini akan membuat saya enggan mengandalkan perhitungan seperti itu tanpa mempelajari sifat-sifatnya secara substansial.
whuber