Pertama, berikut adalah beberapa komentar cepat:
- hal
- Sampel Anda tidak akan pernah mengikuti distribusi tertentu dengan tepat. Jadi, bahkan jika nilai- Anda dari Uji KS akan valid dan , itu hanya berarti bahwa Anda tidak dapat mengesampingkan bahwa data Anda mengikuti distribusi spesifik ini. Formulasi lain adalah bahwa sampel Anda kompatibel dengan distribusi tertentu. Tetapi jawaban untuk pertanyaan "Apakah data saya mengikuti distribusi dengan tepat?" selalu tidak.hal> 0,05
- Tujuannya di sini tidak dapat menentukan dengan pasti distribusi apa yang diikuti sampel Anda. Tujuannya adalah apa yang @whuber (dalam komentar) sebut sebagai uraian perkiraan data yang keliru . Memiliki distribusi parametrik spesifik dapat berguna sebagai model data.
Tapi mari kita lakukan eksplorasi. Saya akan menggunakan fitdistrplus
paket luar biasa yang menawarkan beberapa fungsi yang bagus untuk pemasangan distribusi. Kami akan menggunakan fungsi ini descdist
untuk mendapatkan beberapa ide tentang kemungkinan distribusi kandidat.
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)
Sekarang mari kita gunakan descdist
:
descdist(x, discrete = FALSE)
Kurtosis dan skewness kuadrat dari sampel Anda adalah plot sebagai titik biru bernama "Observasi". Tampaknya kemungkinan distribusi termasuk Weibull, Lognormal, dan mungkin distribusi Gamma.
Mari kita paskan distribusi Weibull dan distribusi normal:
fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")
Sekarang periksa fit untuk yang normal:
plot(fit.norm)
Dan untuk Weibull:
plot(fit.weibull)
Keduanya terlihat bagus tetapi dinilai oleh QQ-Plot, Weibull mungkin terlihat sedikit lebih baik, terutama di bagian ekor. Sejalan dengan itu, AIC dari Weibull fit lebih rendah dibandingkan dengan normal:
fit.weibull$aic
[1] 519.8537
fit.norm$aic
[1] 523.3079
Simulasi tes Kolmogorov-Smirnov
Saya akan menggunakan prosedur @ Aksakal yang dijelaskan di sini untuk mensimulasikan statistik KS di bawah nol.
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
)
})
ECDF dari statistik-KS yang disimulasikan terlihat seperti berikut:
plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()
hal
fit <- logspline(stats)
1 - plogspline(ks.test(x
, "pweibull"
, shape= fit.weibull$estimate["shape"]
, scale = fit.weibull$estimate["scale"])$statistic
, fit
)
[1] 0.4889511
Ini mengkonfirmasi kesimpulan grafis kami bahwa sampel tersebut kompatibel dengan distribusi Weibull.
Seperti yang dijelaskan di sini , kita dapat menggunakan bootstrap untuk menambahkan interval kepercayaan pointwise ke perkiraan Weibull PDF atau CDF:
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")
Distribusi otomatis cocok dengan GAMLSS
gamlss
R
fitDist
type = "realline"
type = "realsplus"
kk = 2kcatatan( n )
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 ***
Menurut AIC, distribusi Weibull (lebih khusus WEI2
, parametriisasi khusus dari itu) paling cocok dengan data. Parameterisasi distribusi yang tepat WEI2
ditentukan dalam dokumen ini di halaman 279. Mari kita periksa kecocokan dengan melihat residu dalam plot cacing (pada dasarnya plot QQ yang tidak tren):
Kami perkirakan residunya mendekati garis horizontal tengah dan 95% di antaranya terletak di antara kurva putus-putus atas dan bawah, yang bertindak sebagai interval kepercayaan 95% searah. Dalam hal ini, plot worm terlihat bagus untuk saya yang menunjukkan bahwa distribusi Weibull cukup memadai.