R'deki bir histograma yoğunluk eğrisi uydurma


91

R'de bir eğriyi histograma uyan bir fonksiyon var mı?

Aşağıdaki histograma sahip olduğunuzu varsayalım

hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))

Normal görünüyor ama çarpık. Bu histogramın çevresini sarmak için eğri olan normal bir eğri sığdırmak istiyorum.

Bu soru oldukça basit, ancak internette R'nin cevabını bulamıyorum.


Gauss dağılımı N (m, s) verilerinize uyacak şekilde m ve s bulmak ister misiniz?
SteinNorheim

Bunun ne anlama geldiğinden emin değilim ...> _>
user5243421

10
@mathee: Sanırım m = ortalama ve s = standart sapma demek. Gauss dağılımı, normal dağılımın başka bir adıdır.
Peter Mortensen

Yanıtlar:


154

Sorunuzu doğru anladıysam, muhtemelen histogramla birlikte bir yoğunluk tahmini istersiniz:

X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE)            # prob=TRUE for probabilities not counts
lines(density(X))             # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted")   # add another "smoother" density

Uzun bir süre sonra düzenleyin:

İşte biraz daha şık bir versiyon:

X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE, col="grey")# prob=TRUE for probabilities not counts
lines(density(X), col="blue", lwd=2) # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted", col="darkgreen", lwd=2) 

ürettiği grafikle birlikte:

görüntü açıklamasını buraya girin


3
+1 - bunu tam tersi şekilde de yapabilir misiniz, yani yoğunluk grafiğini histograma uyacak şekilde ayarlayarak?
vonjd

2
lines(density(X,na.rm= TRUE)Vektör NA değerleri içerebileceği için ek parametre verilmesini öneririm .
Anirudh

30

Ggplot2 ile böyle bir şey çok kolay

library(ggplot2)
dataset <- data.frame(X = c(rep(65, times=5), rep(25, times=5), 
                            rep(35, times=10), rep(45, times=4)))
ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..)) + 
  geom_density()

veya Dirk'in çözümünün sonucunu taklit etmek için

ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..), binwidth = 5) + 
  geom_density()

28

İşte bunu yapmamın yolu:

foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)

Bunu ggplot2 paketi ile yapmak bonus egzersizdir ...


Bununla birlikte, çarpık bir şey istiyorsanız, yukarıdaki yoğunluk örneğini yapabilir, verilerinizi dönüştürebilir (örn. Foo.log & lt; - log (foo) ve yukarıdakini deneyebilirsiniz) veya gibi çarpık bir dağılımı yerleştirmeyi deneyebilirsiniz. gama veya lognormal (lognormal, günlüğü alıp normal, btw'ye uydurmaya eşdeğerdir).
John Johnson

2
Ancak bu yine de önce dağıtımınızın parametrelerini tahmin etmeyi gerektirir.
Dirk Eddelbuettel

Bu, teorik istatistiklere daha fazla girerken, R'yi tartışmaktan biraz uzaklaşıyor, ancak Gama için şu bağlantıyı deneyebilirsiniz: en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation Lognormal için, sadece günlüğü alın (varsayım tüm veriler pozitiftir) ve günlük olarak dönüştürülmüş verilerle çalışır. Meraklı biri için, bir istatistik ders kitabıyla çalışmanız gerektiğini düşünüyorum.
John Johnson

3
Hem orijinal posterin hem de diğer tüm yanıtların parametrik olmayan tahminler kullanmaktan oldukça memnun olduğunu - eski usul bir histogram veya biraz daha modern veri odaklı yoğun tahmin gibi - yanlış anladığınızı düşünüyorum. Bir dağılımdan şüphelenmek için iyi bir nedeniniz varsa, parametrik tahminler harikadır. Ama burada durum böyle değildi.
Dirk Eddelbuettel

11

Dirk , yoğunluk fonksiyonunun histogram üzerinde nasıl çizileceğini açıkladı. Ancak bazen, daha güçlü bir çarpık normal dağılım varsayımıyla gitmek ve yoğunluk yerine bunu grafiğe dönüştürmek isteyebilirsiniz. Dağıtımın parametrelerini tahmin edebilir ve sn paketini kullanarak grafiğini çizebilirsiniz :

> sn.mle(y=c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
$call
sn.mle(y = c(rep(65, times = 5), rep(25, times = 5), rep(35, 
    times = 10), rep(45, times = 4)))

$cp
    mean     s.d. skewness 
41.46228 12.47892  0.99527 

Eğik normal dağıtılmış veri grafiği

Bu, muhtemelen daha çarpık normal olan verilerde daha iyi çalışır:

Başka bir çarpık normal arsa


3

Aynı sorunu yaşadım ama Dirk'in çözümü işe yaramadı. Bu uyarı mesajını her seferinde alıyordum

"prob" is not a graphical parameter

Okudum ?histve buldumfreq: a logical vector set TRUE by default.

benim için çalışan kod

hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)
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.