Во-первых, вот несколько быстрых комментариев:
- В -значение из в Kolmovorov-Смирнов-Test (KS-Test) с расчетными параметрами будет совершенно неправильно. Так что, к сожалению, вы не можете просто подобрать распределение, а затем использовать оценочные параметры в тесте Колмогорова-Смирнова для проверки вашей выборки.p
- Ваш образец никогда не будет точно следовать определенному распределению. Таким образом, даже если ваши из KS-Test будут действительными и , это будет означать, что вы не можете исключить, что ваши данные соответствуют этому конкретному распределению. Другая формулировка будет заключаться в том, что ваш образец совместим с определенным распределением. Но ответ на вопрос "Мои данные точно соответствуют распределению xy?" всегда нет.p>0.05
- Цель здесь не может состоять в том, чтобы с уверенностью определить, за каким распределением следует ваша выборка. Цель - то, что @whuber (в комментариях) называет скупыми приблизительными описаниями данных. Наличие конкретного параметрического распределения может быть полезным в качестве модели данных.
Но давайте сделаем некоторые исследования. Я буду использовать отличный fitdistrplus
пакет, который предлагает несколько хороших функций для настройки распределения. Мы будем использовать функцию, descdist
чтобы получить некоторые идеи о возможных распределениях кандидатов.
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)
Теперь давайте используем descdist
:
descdist(x, discrete = FALSE)
Куртоз и квадратная асимметрия вашего образца представлены в виде синей точки с именем «Наблюдение». Кажется, что возможные распределения включают распределение Вейбулла, Логнормального и, возможно, гамма-распределения.
Давайте подойдем к распределению Вейбулла и нормальному распределению:
fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")
Теперь осмотрите на предмет соответствия нормальному:
plot(fit.norm)
А для Вейбулла подойдет:
plot(fit.weibull)
Оба выглядят хорошо, но, судя по QQ-Plot, Weibull, возможно, выглядит немного лучше, особенно на хвостах. Соответственно, AIC соответствия Вейбулла ниже по сравнению с нормальным соответствием:
fit.weibull$aic
[1] 519.8537
fit.norm$aic
[1] 523.3079
Тестовое моделирование Колмогорова-Смирнова
Я буду использовать процедуру @ Aksakal, описанную здесь, чтобы смоделировать статистику KS под нулем.
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 моделируемой статистики KS выглядит следующим образом:
plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()
Наконец, наше значение, использующее смоделированное нулевое распределение KS-статистики: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
Это подтверждает наш графический вывод о том, что выборка совместима с распределением Вейбулла.
Как объяснено здесь , мы можем использовать начальную загрузку, чтобы добавить точечные доверительные интервалы к оцененному Weibull PDF или 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")
Автоматическая распределительная арматура с GAMLSS
gamlss
Пакет R
предлагает возможность попробовать множество различных распределений и выбрать «лучший» в соответствии с GAIC (обобщенная информация Akaike критерий). Основная функция есть fitDist
. Важной опцией в этой функции является тип проверяемых дистрибутивов. Например, setting type = "realline"
будет пробовать все реализованные распределения, определенные на всей реальной строке, тогда как type = "realsplus"
будут пытаться только распределения, определенные на реальной положительной строке. Другим важным вариантом является параметр , который является штрафом для GAIC. В приведенном ниже примере я установил параметр который означает, что «лучшее» распределение выбирается в соответствии с классическим AIC. Вы можете установить на что угодно, напримерkk=2klog(n) для 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 ***
Согласно AIC, распределение Вейбулла (точнее WEI2
, его специальная параметризация) наилучшим образом соответствует данным. Точная параметризация распределения WEI2
подробно описана в этом документе на стр. 279. Давайте проверим соответствие, посмотрев на остатки на графике червя (в основном, детализированный график QQ):
Мы ожидаем, что остатки будут близки к средней горизонтальной линии, и 95% из них будут лежать между верхней и нижней пунктирными кривыми, которые действуют как 95% точечные доверительные интервалы. В этом случае график червя выглядит хорошо для меня, указывая на то, что распределение Вейбулла адекватно подходит.