Bagaimana saya bisa memperkirakan kepadatan parameter nol-inflasi dalam R?

10

Saya memiliki kumpulan data dengan banyak nol yang terlihat seperti ini:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)

Saya ingin menggambar garis untuk kepadatannya, tetapi density()fungsinya menggunakan jendela bergerak yang menghitung nilai negatif x.

lines(density(x), col = 'grey')

Ada density(... from, to)argumen, tetapi ini tampaknya hanya memotong perhitungan, tidak mengubah jendela sehingga kepadatan pada 0 konsisten dengan data seperti yang dapat dilihat oleh plot berikut:

lines(density(x, from = 0), col = 'black')

(jika interpolasi diubah, saya akan berharap bahwa garis hitam akan memiliki kepadatan lebih tinggi pada 0 daripada garis abu-abu)

Apakah ada alternatif untuk fungsi ini yang akan memberikan perhitungan kepadatan yang lebih baik pada nol?

masukkan deskripsi gambar di sini

Abe
sumber

Jawaban:

14

Kepadatannya tak terhingga pada nol karena termasuk lonjakan diskrit. Anda perlu memperkirakan lonjakan menggunakan proporsi nol, dan kemudian memperkirakan bagian positif dari kepadatan dengan asumsi itu halus. KDE akan menyebabkan masalah di ujung kiri karena akan memberi bobot pada nilai negatif. Salah satu pendekatan yang bermanfaat adalah mentransformasikan ke log, memperkirakan kepadatan menggunakan KDE, dan kemudian mentransformasikannya kembali. Lihat Wand, Marron & Ruppert (JASA 1991) untuk referensi.

Fungsi R berikut akan melakukan kerapatan yang ditransformasikan:

logdensity <- function (x, bw = "SJ") 
{
    y <- log(x)
    g <- density(y, bw = bw, n = 1001)
    xgrid <- exp(g$x)
    g$y <- c(0, g$y/xgrid)
    g$x <- c(0, xgrid)
    return(g)
}

Maka yang berikut ini akan memberikan plot yang Anda inginkan:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)
fit <- logdensity(x[x>0]) # Only take density of positive part
lines(fit$x,fit$y*mean(x>0),col="red") # Scale density by proportion positive
abline(v=0,col="blue") # Add spike at zero.

masukkan deskripsi gambar di sini

Rob Hyndman
sumber
P(X=0)
P(X=0)
ini berguna. fyi: tampaknya, meskipun bw = "SJ" memengaruhi kepadatan di ruang yang tidak diubah, logdensitasnya sama dengan menggunakan "SJ" dan default "nrd0" ... Saya akan membaca referensi SJ: "Sheather and Jones (1991) Metode pemilihan bandwidth berbasis data yang dapat diandalkan untuk estimasi kepadatan kernel. " jstor.org/stable/2345597
Abe
4

Saya setuju dengan Rob Hyndman bahwa Anda perlu berurusan dengan nol secara terpisah. Ada beberapa metode untuk menangani estimasi kerapatan kernel dari suatu variabel dengan dukungan terbatas, termasuk 'refleksi', 'rernormalisasi' dan 'kombinasi linear'. Ini tampaknya tidak diimplementasikan dalam densityfungsi R , tetapi tersedia dalam paket Benn Jann kdensuntuk Stata .

onestop
sumber
1

Opsi lain ketika Anda memiliki data dengan batas bawah logis (seperti 0, tetapi bisa menjadi nilai lain) yang Anda tahu data tidak akan di bawah dan estimasi kepadatan kernel biasa menempatkan nilai di bawah batas itu (atau jika Anda memiliki batas atas , atau keduanya) adalah dengan menggunakan estimasi logspline. Paket logspline untuk R mengimplementasikan ini dan fungsi memiliki argumen untuk menentukan batas sehingga estimasi akan pergi ke batas, tetapi tidak melampaui dan masih skala ke 1.

Ada juga metode ( oldlogsplinefungsi) yang akan memperhitungkan sensor interval akun, jadi jika 0 itu tidak tepat 0, tetapi dibulatkan sehingga Anda tahu mereka mewakili nilai antara 0 dan beberapa angka lainnya (misalnya batas deteksi) maka Anda dapat memberikan informasi itu ke fungsi pemasangan.

Jika 0 ekstra benar 0 (tidak bulat) maka memperkirakan lonjakan atau titik massa adalah pendekatan yang lebih baik, tetapi juga dapat dikombinasikan dengan estimasi logspline.

Greg Snow
sumber
0

Anda dapat mencoba menurunkan bandwidth (garis biru adalah untuk adjust=0.5), masukkan deskripsi gambar di sini

tapi mungkin KDE bukan metode terbaik untuk menangani data seperti itu.


sumber
apakah ada metode lain yang akan Anda rekomendasikan?
Abe
@ Ya Yah, ini tergantung pada apa yang ingin Anda lakukan ...