İ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. fitdistrplus
Dağı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)
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)
Ve Weibull uyumu için:
plot(fit.weibull)
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()
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)
#-----------------------------------------------------------------------------
# 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")
GAMLSS ile otomatik dağıtım bağlantısı
gamlss
İçin paket R
teklifleri ç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ı WEI2
iç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):
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.