R'de negatif olmayan değişkenlerin yoğunluk grafikleri için iyi yöntemler?


36
plot(density(rexp(100))

Açıkçası sıfırın solundaki tüm yoğunluk yanlılığı temsil ediyor.

İstatist olmayanlar için bazı verileri özetlemeye çalışıyorum ve negatif olmayan verilerin neden sıfıra sol tarafa yoğunluğa sahip olduğuna dair sorulardan kaçınmak istiyorum. Grafikler randomizasyon kontrolü içindir; Değişkenlerin tedavi ve kontrol gruplarına göre dağılımını göstermek istiyorum. Dağılımlar genellikle üsteldir. Histogramlar çeşitli nedenlerden dolayı aldatıcıdır.

Hızlı bir google araması, istatistikçiler tarafından negatif olmayan çekirdekler üzerinde çalışmamı sağlıyor, örneğin: bu .

Ancak bunların herhangi biri R'de uygulanmış mı? Uygulanan yöntemlerden herhangi biri betimsel istatistikler için bir şekilde "en iyisi" mi?

EDIT: fromKomut şu anki sorunumu çözebilse bile , herhangi birinin negatif olmayan yoğunluk tahmini üzerine literatüre dayalı bir çekirdek uygulayıp uygulamadığını bilmek güzel olurdu.


3
İstediğiniz şey değil, fakat özellikle istatistiksel olmayan izleyicilere sunum için çekirdek yoğunluğu tahminini üssel olması gereken bir şeye uygulamam. Kuantil kuantil bir parsel kullanırdım ve dağılımın üstel olsaydı parselin düz olması gerektiğini açıklarım.
Nick Cox

6
plot(density(rexp(100), from=0))?
Stéphane Laurent

4
Bazen oldukça başarılı bir şekilde yaptığım bir şey, kütüklerden bir kde elde etmek ve sonra yoğunluk tahminini (Jacobian'ı unutmamak) dönüştürmek. Diğer bir olasılık, sınır hakkında bilgi sahibi olmak için ayarlanmış bir log-spline yoğunluk tahmini kullanmaktır.
Glen_b


1
@Glen_b tarafından stata-journal.com/sjpdf.html?articlenum=gr0003 adresinde belirtilen dönüşüm yöntemini tartıştım (bkz. S.76-78). Sıfırlar, günlük yerine log (x + 1) kullanılarak ve Jacobian'ı değiştirerek yerleştirilebilir.
Nick Cox

Yanıtlar:


21

Uzamsal istatistiklerin kenar ağırlıklandırma yaklaşımlarından ödünç alınan bir çözüm, soldaki yoğunluğu sıfıra indirgemek, ancak sıfıra en yakın olan verilere ağırlık vermektir. Amaç, her bir değer olduğunu "yayılmış" birim toplam alanının bir çekirdeğin içine merkezlenmiş olan ; Çekirdeğin negatif bölgeye döküleceği herhangi bir kısmı kaldırılır ve çekirdek birim alana yeniden normalleştirilir.xxx

Örneğin, bir Gauss çekirdeği ile yeniden normalizasyon ağırlığıKh(y,x)=exp(12((yx)/h)2)/2π

w(x)=1/0K(y,x)dy=11Φx,h(0)

burada , Normal ortalama değişkeni ve standart sapma kümülatif dağılım işlevidir . Diğer çekirdekler için karşılaştırılabilir formüller mevcuttur.x saatΦxh

Bu, yakın bant genişliklerini daraltmaya çalışmaktan daha basit - ve hesaplamada çok daha hızlıdır . Yine de, bant genişliğinin nasıl yakın olarak değiştirilmesi gerektiğini tam olarak söylemek zor . Bununla birlikte, bu yöntem aynı zamanda geçicidir : yakın hala bazı önyargılar olacak . Varsayılan yoğunluk tahmininden daha iyi çalışıyor gibi görünüyor. İşte bir largish veri setini kullanarak bir karşılaştırma:0 0000

şekil

Mavi, varsayılan yoğunluğu gösterirken, kırmızı, için kenar için ayarlanan yoğunluğu gösterir . Gerçek altta yatan dağıtım referans için noktalı bir çizgi olarak izlenir.0


R kodu

Buradaki densityişlev R, ağırlıkların toplamının birlik olmadığından şikayet edecektir, çünkü tüm gerçek sayılar üzerindeki integralin birlik olmasını ister, oysa bu yaklaşım bütünleşmeyi pozitif sayıların birliğe eşit olmasını sağlar. Bir kontrol olarak, ikinci integralin bir Riemann toplamı olarak tahmin edilir.

set.seed(17)
x <- rexp(1000)
#
# Compute a bandwidth.
#
h <- density(x, kernel="gaussian")$bw # $
#
# Compute edge weights.
#
w <- 1 / pnorm(0, mean=x, sd=h, lower.tail=FALSE)
#
# The truncated weighted density is what we want.
#
d <- density(x, bw=h, kernel="gaussian", weights=w / length(x))
d$y[d$x < 0] <- 0
#
# Check: the integral ought to be close to 1:
#
sum(d$y * diff(d$x)[1])
#
# Plot the two density estimates.
#
par(mfrow=c(1,1))
plot(d, type="n", main="Default and truncated densities", xlim=c(-1, 5))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)

21

Bir alternatif, verilerin log yoğunluğunu yaklaşık olarak belirlemek için spline kullanan yoğunluğu tahmin etmeye dayanan Kooperberg ve meslektaşlarının yaklaşımıdır. @ Whuber'un cevabındaki verileri kullanarak, yaklaşımların karşılaştırılmasını sağlayacak bir örnek göstereceğim.

set.seed(17)
x <- rexp(1000)

Bunun için kurulu logspline paketine ihtiyacınız olacak ; değilse yükleyin:

install.packages("logspline")

Paketi yükleyin ve logspline()işlevi kullanarak yoğunluğu tahmin edin :

require("logspline")
m <- logspline(x)

Aşağıda, d@ whuber'ın cevabındaki nesnenin çalışma alanında mevcut olduğunu varsayıyorum .

plot(d, type="n", main="Default, truncated, and logspline densities", 
     xlim=c(-1, 5), ylim = c(0, 1))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
plot(m, add = TRUE, col = "red", lwd = 3, xlim = c(-0.001, max(x)))
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)

Ortaya çıkan arsa kırmızı çizgi ile gösterilen logspline yoğunluğu ile aşağıda gösterilmiştir

Varsayılan, kesik ve logspline yoğunlukları

Ek olarak, yoğunluk desteği argümanlar lboundve ubound. Biz yoğunluk 0 solundaki 0 olduğunu varsayalım isteyen ve bir devamsızlık 0'dan varsa, biz kullanabilirsiniz lbound = 0çağrısında logspline()örneğin,

m2 <- logspline(x, lbound = 0)

Aşağıdaki yoğunluk tahminini mverirken (burada önceki rakam zaten meşgulken orijinal logspline ile gösterilmiş olarak gösterilmiştir ).

plot.new()
plot.window(xlim = c(-1, max(x)), ylim = c(0, 1.2))
title(main = "Logspline densities with & without a lower bound",
      ylab = "Density", xlab = "x")
plot(m,  col = "red",  xlim = c(0, max(x)), lwd = 3, add = TRUE)
plot(m2, col = "blue", xlim = c(0, max(x)), lwd = 2, add = TRUE)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
axis(1)
axis(2)
box()

Ortaya çıkan arsa aşağıda gösterilmiştir

Logspline yoğunluğu tahminlerinin, desteğe daha düşük bir sınırla ve bağlanmadan karşılaştırılması

Bu durumda, xsonuçların bilgisinden yararlanarak , 0 olma eğiliminde olmayan , ancak başka bir yere uyan standart logspline'a benzer bir yoğunluk tahminix=0x


1
+1 Bu fikri sevdim, ancak örnek veriyle (üstel bir dağıtımdan) çok iyi sonuçlanmasına şaşırdım . Bunun neden olduğuna dair bir sezginiz var mı? Bazı anlamda öyle harika yakın ancak yakın değerler "yumru" eksik I trade-off iyi doğruluk arasındaki düşük değerlere ve düşük doğruluk (ya da en çeşit orada değil merak yüzden eşdeğer olarak, gerçek verilerdeki , büyük bant genişlikleri) yüksek değerlerde. 101
whuber

@whuber İyi bir soru. Bu yaklaşıma sadece son zamanlarda kendim rastladım. Burada sorulacak iyi bir soru olduğundan şüpheleniyorum, kesilmiş ve logspline yöntemleri sadece gerçek yoğunluğun tahminleri olduğundan, farklılıklar istatistiksel olarak anlamlı mı? Yine de sıfırda neden bu kadar iyi sonuçlandığından emin değilim. Nedenini bilmeyi takdir ediyorum.
Monica’yı eski durumuna getirme - G. Simpson

@GavinSimpson, Bu güzel cevap için teşekkürler. Son arsa en son sürümüyle çoğaltabilir misiniz logspline? Benim için, sınırlanmış ve sınırlanmamış versiyonun yoğunluğu sıfıra gidiyor x = 0.
cel

4

Dağılımları gruplarla karşılaştırmak (sizin söylediklerinizden birinin amacıdır). Neden basit bir şey değil? Paralel kutu çizimleri, N büyükse iyi çalışır; paralel şerit çizimleri N küçükse işe yarar (ve her ikisi de aykırı değerleri gösterir, ki bu verilerinizde bir sorun)


1
Evet, teşekkürler, işe yarıyor. Ama ben yoğunluk grafiklerini severim. Veriler hakkında boxpot'lardan daha fazlasını gösterirler. Sanırım daha önce uygulanmış hiçbir şeyin görünmediğine şaşırdım. Belki bir gün bunlardan birini kendim uygularım. İnsanlar muhtemelen yararlı bulur.
generic_user

1
Ben de yoğunluk grafiklerini severim; ama izleyicilerinizi düşünmelisiniz.
Peter Flom - Reinstate Monica

1
Bu konuda @PeterFlom ile aynı fikirdeyim. Kitleniz istatistiksel olarak bilgili değilse, fazla karmaşıklaşmayın. Üstte kelebek çizimleri kaplamasıyla karşılaştırmalı / paralel kutu çizimleri de yapabilirsiniz. Bu şekilde, kutu arsa özeti, tüm veriler gibi görülebilir.
doug.numbers 29:13

Farklı insanların toplanmış arazileri farklı bir şekilde kavradıklarına dair öneri kesinlikle doğrudur. Bir yoğunluk grafiğinin ne olduğunu anlamaya rağmen (ve bunun bir olasılık olmadığını anlıyorum) “paralel bir kutu grafiği” nin ne olabileceğini anlamadım. Paralel bir koordinat arsa önerdi ancak bunun doğru olmadığını düşünüyorum.
DW '

2

Stéphane'ın kullanabileceği gibi yorumda bulunabilir from = 0ve ayrıca değerlerinizi yoğunluk eğrisi altında gösterebilirsiniz.rug (x)


4
Yanılıyorsam düzelt, fakat from=00'ın altındaki değerler için gösterimi bastırıyormuş gibi görünüyor; dağıtımın bir kısmının 0'ın altına düştüğü gerçeği için hesaplamayı düzeltmez.
Nick Cox

1
Bu doğru. fromKomutu kullanmak, sıfıra tam sağa sahip gibi görünen bir arsa verir. Ancak, sürekli olarak daha küçük kutulara sahip histogramlara bakarsanız, çok fazla veri en yüksek AT sıfır gösterecektir. Bu fromsadece bir grafik numarasıdır.
generic_user

@NickCox Emin değilim ama from=0hiçbir şeyi bastırdığını sanmıyorum. Sadece sıfırda "grid" başlatır.
Stéphane Laurent

Aradaki fark, tahmini yoğunluğun negatif değerler için sıfır olmadığının olup olmadığıdır, çizilmemiş olup çizilmemiştir. Araştırmacılar, tek istedikleri bir görselleştirme ise, bu konuda endişelenmemeye karar verebilirler.
Nick Cox

@NickCox Komutun density(rexp(100), from=0)grafikle ilgisi yok
Stéphane Laurent
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.