R'de sıfır şişirilmiş bir parametrenin yoğunluğunu nasıl tahmin edebilirim?


10

Ben böyle görünüyor sıfırlar bir sürü veri kümesi var:

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

Yoğunluğu için bir çizgi çizmek istiyorum, ancak density()fonksiyon x'in negatif değerlerini hesaplayan hareketli bir pencere kullanıyor.

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

Bir density(... from, to)argüman var, ancak bunlar sadece hesaplamayı kesiyor gibi görünüyor, pencereyi değiştirmiyor, böylece 0'daki yoğunluk, aşağıdaki çizimde görülebileceği gibi verilerle tutarlı olacak şekilde:

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

(enterpolasyon değiştiyse, siyah çizginin 0'da gri çizgiden daha yüksek yoğunluğa sahip olmasını beklerdim)

Bu fonksiyona, yoğunluğun sıfırda daha iyi hesaplanmasını sağlayacak alternatifler var mı?

resim açıklamasını buraya girin

Yanıtlar:


14

Yoğunluk sıfırda sonsuzdur çünkü ayrı bir sivri uç içerir. Başakları sıfır oranını kullanarak tahmin etmeniz ve ardından yoğunluğun düzgün olduğunu varsayarak pozitif kısmını tahmin etmeniz gerekir. KDE sol tarafta sorunlara neden olacaktır çünkü negatif değerlere biraz ağırlık verecektir. Yararlı bir yaklaşım, günlüklere dönüştürmek, KDE kullanarak yoğunluğu tahmin etmek ve daha sonra geri dönüştürmektir. Bkz Wand Marron ve Ruppert (1991 JASA) bir referans için.

Aşağıdaki R fonksiyonu dönüştürülmüş yoğunluğu yapacak:

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)
}

Daha sonra aşağıdakiler istediğiniz çizimi verecektir:

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.

resim açıklamasını buraya girin


P(X=0)

P(X=0)

bu kullanışlı oluyor. fyi: Görünüşe göre, bw = "SJ" dönüştürülmemiş alandaki yoğunluğu etkilese de, logdensity "SJ" ve varsayılan "nrd0" kullanarak aynıdır ... SJ referansını okumak üzereyim: "Sheather ve Jones (1991) Çekirdek yoğunluğu tahmini için güvenilir veri tabanlı bant genişliği seçim yöntemi. " jstor.org/stable/2345597
Abe

4

Rob Hyndman ile sıfırlarla ayrı ayrı uğraşmanız gerektiğine katılıyorum. Sınırlı destekli bir değişkenin çekirdek yoğunluğu tahminiyle başa çıkmanın birkaç yöntemi vardır; bunlara 'yansıma', 'yeniden normalleştirme' ve 'doğrusal kombinasyon' dahildir. Bunlar R'nin densityişlevinde uygulanmış gibi görünmüyor , ancak Benn Jann'ın kdensStata paketinde mevcut .


1

Mantıksal bir alt sınırı olan (0 gibi ancak başka değerler olabilir) verileriniz varsa, verilerin aşağıya gitmeyeceğini ve normal çekirdek yoğunluğunun tahmini değerleri sınırın altına (veya bir üst sınırınız varsa) yerleştirdiğiniz başka bir seçenek veya her ikisi de) logspline tahminlerini kullanmaktır. R için logspline paketi bunları uygular ve işlevlerin sınırları belirtmek için argümanları vardır, böylece tahmin sınırlamaya gider, ancak ötesine geçmez ve hala 1'e ölçeklenir.

Ayrıca, oldlogsplineara sansürlemeyi dikkate alacak yöntemler ( işlev) vardır, bu nedenle bu 0'lar tam 0'lar değilse, ancak 0 ile başka bir sayı (örneğin bir algılama sınırı) arasındaki değerleri temsil ettiklerini bilmeniz için yuvarlanırsa, bu bilgiyi montaj fonksiyonuna verebilir.

Ekstra 0'lar doğruysa (yuvarlanmamış), ani veya nokta kütlesini tahmin etmek daha iyi bir yaklaşımdır, ancak logspline tahmini ile de birleştirilebilir.


0

Bant genişliğini azaltmayı deneyebilirsiniz (mavi çizgi içindir adjust=0.5), resim açıklamasını buraya girin

ancak muhtemelen KDE bu tür verilerle başa çıkmak için en iyi yöntem değildir.


tavsiye edeceğiniz başka bir yöntem var mı?
Abe

@Abe Peki, bu ne yapmak istediğinize bağlı ...
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.