Đầu tiên, đây là một số nhận xét nhanh:
- Giá trị của Kolmovorov-Smirnov-Test (KS-Test) với các tham số ước tính sẽ khá sai. Thật không may, bạn không thể vừa một bản phân phối và sau đó sử dụng các tham số ước tính trong Kolmogorov-Smirnov-Test để kiểm tra mẫu của bạn.p
- Mẫu của bạn sẽ không bao giờ theo một phân phối cụ thể chính xác. Vì vậy, ngay cả khi giá trị của bạn từ Kiểm tra KS sẽ hợp lệ và , điều đó chỉ có nghĩa là bạn không thể loại trừ rằng dữ liệu của bạn tuân theo phân phối cụ thể này. Một công thức khác là mẫu của bạn tương thích với một phân phối nhất định. Nhưng câu trả lời cho câu hỏi "Dữ liệu của tôi có tuân theo phân phối xy chính xác không?" luôn luôn là khôngp>0.05
- Mục tiêu ở đây không thể là xác định chắc chắn phân phối mẫu của bạn theo sau. Mục tiêu là cái mà @whuber (trong các bình luận) gọi là mô tả gần đúng về dữ liệu. Có một phân phối tham số cụ thể có thể hữu ích như một mô hình của dữ liệu.
Nhưng hãy làm một số khám phá. Tôi sẽ sử dụng fitdistrplus
gói tuyệt vời cung cấp một số chức năng tốt để phù hợp với phân phối. Chúng tôi sẽ sử dụng chức năng descdist
để đạt được một số ý tưởng về phân phối ứng viên có thể.
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)
Bây giờ cho phép sử dụng descdist
:
descdist(x, discrete = FALSE)
Độ lệch và độ lệch bình phương của mẫu của bạn là plottet như một điểm màu xanh có tên là "Quan sát". Có vẻ như các bản phân phối có thể bao gồm phân phối Weibull, Logn normal và có thể là phân phối Gamma.
Hãy phù hợp với phân phối Weibull và phân phối bình thường:
fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")
Bây giờ kiểm tra sự phù hợp cho bình thường:
plot(fit.norm)
Và cho phù hợp với Weibull:
plot(fit.weibull)
Cả hai đều có vẻ tốt nhưng được đánh giá bởi QQ-Plot, Weibull có thể trông tốt hơn một chút, đặc biệt là ở phần đuôi. Tương ứng, AIC của phù hợp Weibull thấp hơn so với phù hợp thông thường:
fit.weibull$aic
[1] 519.8537
fit.norm$aic
[1] 523.3079
Mô phỏng thử nghiệm Kolmogorov-Smirnov
Tôi sẽ sử dụng quy trình của @ Aksakal được giải thích ở đây để mô phỏng thống kê của KS theo null.
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 của thống kê KS mô phỏng trông như sau:
plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()
Cuối cùng, giá trị của chúng tôi bằng cách sử dụng phân phối null mô phỏng của thống kê KS là: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
Điều này xác nhận kết luận đồ họa của chúng tôi rằng mẫu tương thích với phân phối Weibull.
Như đã giải thích ở đây , chúng ta có thể sử dụng bootstrapping để thêm các khoảng tin cậy theo chiều cho vào Weibull PDF hoặc CDF ước tính:
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")
Phân phối tự động phù hợp với GAMLSS
Các gamlss
gói cho R
Mời khả năng thử nhiều bản phân phối khác nhau và chọn "tốt nhất" theo GAIC (tiêu chuẩn thông tin Akaike tổng quát). Chức năng chính là fitDist
. Một tùy chọn quan trọng trong chức năng này là loại phân phối được thử. Ví dụ: cài đặt type = "realline"
sẽ thử tất cả các phân phối đã triển khai được xác định trên toàn bộ dòng thực trong khi type = "realsplus"
sẽ chỉ thử các phân phối được xác định trên dòng thực dương. Một tùy chọn quan trọng khác là tham số , đó là hình phạt cho GAIC. Trong ví dụ dưới đây, tôi đặt tham số có nghĩa là phân phối "tốt nhất" được chọn theo AIC cổ điển. Bạn có thể đặt thành bất cứ thứ gì bạn thích, chẳng hạn nhưkk=2klog(n) cho BIC.
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 ***
Theo AIC, phân phối Weibull (cụ thể hơn WEI2
là một tham số đặc biệt của nó) phù hợp nhất với dữ liệu. Thông số chính xác của phân phối WEI2
được ghi lại trong tài liệu này ở trang 279. Chúng ta hãy kiểm tra sự phù hợp bằng cách xem xét các phần dư trong một lô giun (về cơ bản là một âm mưu QQ bị loại bỏ):
Chúng tôi hy vọng phần dư sẽ nằm gần đường ngang giữa và 95% trong số chúng nằm giữa các đường cong chấm trên và dưới, đóng vai trò là khoảng tin cậy theo chiều ngang 95%. Trong trường hợp này, âm mưu sâu có vẻ tốt đối với tôi chỉ ra rằng phân phối Weibull là phù hợp.