Hangi dağıtımın verilerime en uygun olduğunu nasıl belirleyebilirim?


133

Bir veri kümem var ve hangi dağılımın verilerime en uygun olduğunu bulmak istiyorum.

fitdistr()Fonksiyonu varsayılan dağılımı tanımlamak için gerekli parametreleri tahmin etmek için kullandım (örneğin Weibull, Cauchy, Normal). Bu parametreleri kullanarak, örnek verilerimin varsayılan dağılımımla aynı dağılımdan olup olmadığını tahmin etmek için bir Kolmogorov-Smirnov Testi yapabilirim.

Eğer p değeri> 0,05 ise, numune verilerinin aynı dağılımdan alındığını varsayabilirim. Fakat p değeri zinde olan tanrı hakkında herhangi bir bilgi sağlamaz, değil mi?

Öyleyse, örnek verilerimin p-değeri normal dağılıma ek olarak weibull dağılım için> 0,05 ise, hangi dağılımın verilerime daha iyi uyduğunu nasıl bilebilirim?

Temelde yaptığım şey bu:

> mydata
 [1] 37.50 46.79 48.30 46.04 43.40 39.25 38.49 49.51 40.38 36.98 40.00
[12] 38.49 37.74 47.92 44.53 44.91 44.91 40.00 41.51 47.92 36.98 43.40
[23] 42.26 41.89 38.87 43.02 39.25 40.38 42.64 36.98 44.15 44.91 43.40
[34] 49.81 38.87 40.00 52.45 53.13 47.92 52.45 44.91 29.54 27.13 35.60
[45] 45.34 43.37 54.15 42.77 42.88 44.26 27.14 39.31 24.80 16.62 30.30
[56] 36.39 28.60 28.53 35.84 31.10 34.55 52.65 48.81 43.42 52.49 38.00
[67] 38.65 34.54 37.70 38.11 43.05 29.95 32.48 24.63 35.33 41.34

# estimate shape and scale to perform KS-test for weibull distribution
> fitdistr(mydata, "weibull")
     shape        scale   
   6.4632971   43.2474500 
 ( 0.5800149) ( 0.8073102)

# KS-test for weibull distribution
> ks.test(mydata, "pweibull", scale=43.2474500, shape=6.4632971)

        One-sample Kolmogorov-Smirnov test

data:  mydata
D = 0.0686, p-value = 0.8669
alternative hypothesis: two-sided

# KS-test for normal distribution
> ks.test(mydata, "pnorm", mean=mean(mydata), sd=sd(mydata))

        One-sample Kolmogorov-Smirnov test

data:  mydata
D = 0.0912, p-value = 0.5522
alternative hypothesis: two-sided

P değerleri Weibull dağılımı için 0.8669, normal dağılım için 0.5522'dir. Böylece verilerimin bir Weibull ve normal bir dağılım izlediğini varsayabilirim. Ancak hangi dağıtım işlevi verilerimi daha iyi tanımlar?


Elevendollar atıfta Aşağıdaki kodu buldum, ancak sonuçları nasıl yorumlayacağımı bilmiyorum:

fits <- list(no = fitdistr(mydata, "normal"),
             we = fitdistr(mydata, "weibull"))
sapply(fits, function(i) i$loglik)
       no        we 
-259.6540 -257.9268 

5
Hangi dağıtımın verilerinize en uygun olduğunu bulmak istiyorsunuz?
Roland

6
Çünkü verilen dağılımın ardından sözde rasgele sayılar üretmek istiyorum.
tobibo

6
Veri setinde bulunan parametrelerle bir dağılımın veri kümesiyle eşleşip eşleşmediğini kontrol etmek için KS'yi kullanamazsınız. Örneğin, bu sayfadaki # 2'ye bakınız , ayrıca alternatifler (ve KS testinin yanıltıcı olabileceği diğer yollar).
tpg2114

Burada , numunelerden parametreler tahmin edildiğinde KS testinin nasıl uygulanacağı üzerine kod örnekleri ile yapılan başka bir tartışma .
Aksakal,

1
I used the fitdistr() function ..... fitdistrfonksiyon nedir? Excel'den bir şey mi? Ya da C'ye yazdığın bir şey?
kurtlar

Yanıtlar:


162

İlk olarak, işte bazı hızlı yorumlar:

  • ile Kolmovorov-Smirnov-Testi (KS-Testi)-değerleri tahmin parametreleri oldukça yanlış olacaktır. Maalesef, sadece bir dağıtıma uyamıyor ve ardından numunenizi test etmek için bir Kolmogorov-Smirnov-Test'te tahmin edilen parametreleri kullanabilirsiniz.p
  • Numuneniz tam olarak belirli bir dağılımı asla takip etmeyecektir . Senin Yani bile KS-Testinden-değerleri ve geçerli olacaktır , sadece sen anlamına geleceğini göz ardı edemeyiz veri bu özel dağılımını olduğunu belirtir. Başka bir formülasyon, numunenizin belirli bir dağılımla uyumlu olması olabilir. Ancak "Verilerim tam olarak xy dağılımını izliyor mu?" Sorusunun cevabı. her zaman hayırdır.p>0.05
  • Buradaki amaç, numunenizin hangi dağılıma uyduğunu kesin olarak belirlemek olamaz. Amaç, @whuber'ın (yorumlarda) verinin ayrık yaklaşık açıklamalarını çağırdığı şeydir . Spesifik bir parametrik dağılıma sahip olmak bir veri modeli olarak faydalı olabilir.

Ama biraz keşif yapalım. fitdistrplusDağıtım için bazı güzel fonksiyonlar sunan mükemmel paketi kullanacağım . Fonksiyonu descdist, olası aday dağılımları hakkında fikir edinmek için kullanacağız .

library(fitdistrplus)
library(logspline)

x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00,
38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40,
42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40,
49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60,
45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30,
36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00,
38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)

Şimdi kullanalım descdist:

descdist(x, discrete = FALSE)

Descdist

Numunenizin kurtosisi ve kare eğriliği, "Gözlem" adlı mavi bir nokta olarak plottet'tir. Muhtemel dağılımlar Weibull, Lognormal ve muhtemelen Gamma dağılımını içermektedir.

Bir Weibull dağılımına ve normal bir dağılıma uyalım:

fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")

Şimdi normale uygunluğu kontrol edin:

plot(fit.norm)

Normal uygun

Ve Weibull uyumu için:

plot(fit.weibull)

Weibull fit

Her ikisi de iyi görünüyor ama QQ-Plot tarafından değerlendirilen Weibull, özellikle kuyruklarda biraz daha iyi görünüyor. Buna bağlı olarak, Weibull uyumunun AIC'si normal uyum ile karşılaştırıldığında daha düşüktür:

fit.weibull$aic
[1] 519.8537

fit.norm$aic
[1] 523.3079

Kolmogorov-Smirnov test simülasyonu

@ Aksakal'ın burada açıklanan prosedürünü boştaki KS istatistiğini simüle etmek için kullanacağım.

n.sims <- 5e4

stats <- replicate(n.sims, {      
  r <- rweibull(n = length(x)
                , shape= fit.weibull$estimate["shape"]
                , scale = fit.weibull$estimate["scale"]
  )
  estfit.weibull <- fitdist(r, "weibull") # added to account for the estimated parameters
  as.numeric(ks.test(r
                     , "pweibull"
                     , shape= estfit.weibull$estimate["shape"]
                     , scale = estfit.weibull$estimate["scale"])$statistic
  )      
})

Simüle edilmiş KS-istatistiklerinin ECDF'si şöyle görünür:

plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()

Simüle edilmiş KS-istatistikleri

Son olarak, KS istatistiklerinin simüle edilmiş null dağılımını kullanarak değerimiz:p

fit <- logspline(stats)

1 - plogspline(ks.test(x
                       , "pweibull"
                       , shape= fit.weibull$estimate["shape"]
                       , scale = fit.weibull$estimate["scale"])$statistic
               , fit
)

[1] 0.4889511

Bu, numunenin bir Weibull dağılımıyla uyumlu olduğu grafiksel sonucumuzu doğruluyor.

Açıklandığı gibi burada , biz tahmin Weibull PDF veya CDF noktasal güven aralıkları eklemek için önyükleyici kullanabilirsiniz:

xs <- seq(10, 65, len=500)

true.weibull <- rweibull(1e6, shape= fit.weibull$estimate["shape"]
                         , scale = fit.weibull$estimate["scale"])

boot.pdf <- sapply(1:1000, function(i) {
  xi <- sample(x, size=length(x), replace=TRUE)
  MLE.est <- suppressWarnings(fitdist(xi, distr="weibull"))  
  dweibull(xs, shape=MLE.est$estimate["shape"],  scale = MLE.est$estimate["scale"])
}
)

boot.cdf <- sapply(1:1000, function(i) {
  xi <- sample(x, size=length(x), replace=TRUE)
  MLE.est <- suppressWarnings(fitdist(xi, distr="weibull"))  
  pweibull(xs, shape= MLE.est$estimate["shape"],  scale = MLE.est$estimate["scale"])
}
)   

#-----------------------------------------------------------------------------
# Plot PDF
#-----------------------------------------------------------------------------

par(bg="white", las=1, cex=1.2)
plot(xs, boot.pdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.pdf),
     xlab="x", ylab="Probability density")
for(i in 2:ncol(boot.pdf)) lines(xs, boot.pdf[, i], col=rgb(.6, .6, .6, .1))

# Add pointwise confidence bands

quants <- apply(boot.pdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.pdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.pdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)

CI_Density

#-----------------------------------------------------------------------------
# Plot CDF
#-----------------------------------------------------------------------------

par(bg="white", las=1, cex=1.2)
plot(xs, boot.cdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.cdf),
     xlab="x", ylab="F(x)")
for(i in 2:ncol(boot.cdf)) lines(xs, boot.cdf[, i], col=rgb(.6, .6, .6, .1))

# Add pointwise confidence bands

quants <- apply(boot.cdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.cdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.cdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)
#lines(xs, min.point, col="purple")
#lines(xs, max.point, col="purple")

CI_CDF


GAMLSS ile otomatik dağıtım bağlantısı

gamlssİçin paket Rteklifleri çok farklı dağılımlar denemek ve GAIC (genelleştirilmiş Akaike bilgi kriteri) 'e göre "en iyi" seçmek için yeteneği. Ana işlevi fitDist. Bu fonksiyondaki önemli bir seçenek denenmekte olan dağıtımların tipidir. Örneğin, ayar type = "realline"tüm gerçek satırda tanımlanan tüm uygulanan dağıtımları type = "realsplus"deneyecek, ancak yalnızca gerçek pozitif satırda tanımlanan dağıtımları deneyecek. Bir diğer önemli seçenek, GAIC için ceza olan parametresidir . Aşağıdaki örnekte, parametresini ayarlıyorum ki bu, "AIC" dağılımının klasik AIC'ye göre seçildiği anlamına gelir. Ayarlayabilirsiniz şey sen gibi, isterkk=2klog(n)BIC için .

library(gamlss)
library(gamlss.dist)
library(gamlss.add)

x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00,
       38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40,
       42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40,
       49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60,
       45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30,
       36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00,
       38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)

fit <- fitDist(x, k = 2, type = "realplus", trace = FALSE, try.gamlss = TRUE)

summary(fit)

*******************************************************************
Family:  c("WEI2", "Weibull type 2") 

Call:  gamlssML(formula = y, family = DIST[i], data = sys.parent()) 

Fitting method: "nlminb" 


Coefficient(s):
             Estimate  Std. Error  t value   Pr(>|t|)    
eta.mu    -24.3468041   2.2141197 -10.9962 < 2.22e-16 ***
eta.sigma   1.8661380   0.0892799  20.9021 < 2.22e-16 ***

AIC'e göre, Weibull dağılımı (daha özel olarak WEI2, onun özel bir parametrelemesi) verilere en iyi şekilde uyar. Dağılımın tam parametrizasyonları WEI2içinde ayrıntılandırılacaktır olan bu belgede en bir artıklara bakarak oturmasını kontrol edelim sayfa 279. üzerine solucan arsa (temelde bir de-trend QQ-plot):

WormPlot

Artıkların orta yatay çizgiye yakın olmalarını ve% 95'inin% 95'lik noktaya güven aralıkları olarak hareket eden üst ve alt noktalı eğriler arasında uzanmalarını bekliyoruz. Bu durumda, solucan komplo bana Weibull dağılımının yeterli bir uyum olduğunu belirten bana iyi görünüyor.


1
+1 Güzel analiz. Yine de bir soru. Belirli bir ana dağıtımla uyumluluk konusundaki olumlu sonuç (bu durumda Weibull), bir karışım dağılımının var olma olasılığını ekarte ediyor mu? Veya uygun bir karışım analizi yapmamız ve bu seçeneği ekarte etmek için GoF'u kontrol etmemiz gerekir.
Aleksandr Blekh

18
@AleksandrBlekh Karışımı ekarte etmek için yeterli güce sahip olmak imkansızdır: Karışım neredeyse iki eşit dağılımda olduğu zaman tespit edilemez ve bir bileşen hariç hepsi çok küçük oranlarda olduğu zaman da tespit edilemez. Tipik olarak (bir dağılım şekli önerebilecek bir teorinin yokluğunda), biri verilerin yaklaşık asimetrik tanımlarını elde etmek için parametrik dağılımlara uyar . Karışımlar bunların hiçbiri değildir: çok fazla parametre gerektirir ve amaç için çok esnektir.
whuber

4
@whuber: +1 Mükemmel açıklamanız için teşekkür ederiz !
Aleksandr Blekh,

1
@Lourenco Cullen ve Fey grafiğine baktım. Mavi nokta örneğimizi gösterir. Bu noktanın Weibull, Lognormal ve Gamma (Weibull ve Gamma arasındaki) çizgisine yakın olduğunu görüyorsunuz. Bu dağılımların her birini yerleştirdikten sonra, işlev gofstatve AIC'yi kullanarak uyum iyiliği istatistiklerini karşılaştırdım . "En iyi" dağılımı belirlemenin en iyi yolunun ne olduğu konusunda fikir birliği yoktur. Grafiksel yöntemleri ve AIC'yi severim.
COOLSerdash

1
@Lourenco Lognormal demek mi istiyorsun? Lojistik dağıtım ("+" işareti) gözlemlenen verilerden oldukça uzak. Lognormal ayrıca normalde bakacağım bir aday olabilir. Bu ders için, yazıyı kısa tutmak için göstermemeyi seçtim. Lognormal, hem Weibull hem de Normal dağılıma kıyasla daha kötü bir uyum gösterir. AIC 537.59 ve grafikler de iyi görünmüyor.
COOLSerdash

15

Grafikler, verilerinizin neye benzediği hakkında daha iyi bir fikir edinmenin en iyi yoludur. Sizin durumunuzda ampirik kümülatif dağılım fonksiyonunu (ecdf) teorik cdfs'e karşı fitdistr () 'den aldığınız parametrelerle çizmenizi tavsiye ederim.

Bunu bir kez verilerim için yaptım ve ayrıca güven aralıklarını da dahil ettim. İşte ggplot2 () kullandığım fotoğraf.

görüntü tanımını buraya girin

Siyah çizgi, deneysel birikimli dağılım işlevidir ve renkli çizgiler, Maksimum Olabilirlik yöntemini kullandığım parametreleri kullanarak farklı dağılımlardan gelen cdfs'dir. Üstel ve normal dağılımın verilere uygun olmadığı kolayca görülebilir, çünkü çizgiler ecdf'den farklı bir biçime sahiptir ve çizgiler ecdf'den oldukça uzaktır. Ne yazık ki diğer dağıtımlar da oldukça yakın. Ancak logNormal çizgisinin siyah çizgiye en yakın olduğunu söyleyebilirim. Bir mesafe ölçüsü (örneğin MSE) kullanmak kişi varsayımı doğrulayabilir.

Yalnızca iki rakip dağıtımınız varsa (örneğin, arsada en iyi görünenleri seçmek gibi), hangi dağılımların daha uygun olduğunu test etmek için bir Likencehood Ratio Oran Testi kullanabilirsiniz.


20
CrossValidated'e Hoşgeldiniz! (A) grafiği üretmek için kullandığınız kodu ve (b) bir grafiği nasıl okuyacağını içerecek şekilde düzenleyebiliyorsanız cevabınız daha yararlı olabilir.
Stephan Kolassa

2
Orada ne çiziliyor? Bu bir çeşit üstelik arsası mı?
Glen_b

1
Ancak hangi dağıtımın verilerinize en uygun olduğuna nasıl karar veriyorsunuz? Sadece grafiğe göre logNormal veya weibull'un verilerinize en uygun olup olmadığını söyleyemedim.
tobibo

4
Sözde rasgele sayılar üreteci oluşturmak istiyorsanız neden ampirik cdf'yi kullanmıyorsunuz? Gözlemlenen dağılımınızın ötesine geçen rakamlar çizmek ister misiniz?
elevendollar

6
Grafiğinizi yüz değerine getirerek , aday dağıtımlarınızın hiçbirinin verilere uygun olmadığı anlaşılıyor . Ayrıca, ecdf'iniz 0.03'ten daha az yatay bir asimptote sahip görünüyor, bu mantıklı değil, bu yüzden ilk etapta gerçekten bir ecdf olduğundan emin değilim.
Hong Ooi
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.