Я використовую важкі хвостові розподіли Lambert W x F для опису та трансформації лептокуртичних даних. Дивіться (мої) наступні публікації для отримання більш детальної інформації та довідок:
Ось відтворюваний приклад з використанням пакету LambertW R.
library(LambertW)
set.seed(1)
theta.tmp <- list(beta = c(2000, 400), delta = 0.2)
yy <- rLambertW(n = 100, distname = "normal",
theta = theta.tmp)
test_norm(yy)
## $seed
## [1] 267509
##
## $shapiro.wilk
##
## Shapiro-Wilk normality test
##
## data: data.test
## W = 1, p-value = 0.008
##
##
## $shapiro.francia
##
## Shapiro-Francia normality test
##
## data: data.test
## W = 1, p-value = 0.003
##
##
## $anderson.darling
##
## Anderson-Darling normality test
##
## data: data
## A = 1, p-value = 0.01
Qqplot of yy
дуже близький до вашого qqplot в початковому дописі, і дані справді трохи лептокуртичні з куртозом 5. Отже, ваші дані можуть бути добре описані розподілом Ламберта W Гаусса з входом і хвостовий параметр (що означає, що існують лише моменти до порядку ).X ∼ N ( 2000 , 400 ) δ = 0,2 ≤ 5×X∼N(2000,400)δ=0.2≤5
Тепер повернемося до вашого питання: як зробити ці лептокуртичні дані знову нормальними? Що ж, ми можемо оцінити параметри розподілу за допомогою MLE (або для методів використання моментів IGMM()
),
mod.Lh <- MLE_LambertW(yy, distname = "normal", type = "h")
summary(mod.Lh)
## Call: MLE_LambertW(y = yy, distname = "normal", type = "h")
## Estimation method: MLE
## Input distribution: normal
##
## Parameter estimates:
## Estimate Std. Error t value Pr(>|t|)
## mu 2.05e+03 4.03e+01 50.88 <2e-16 ***
## sigma 3.64e+02 4.36e+01 8.37 <2e-16 ***
## delta 1.64e-01 7.84e-02 2.09 0.037 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## --------------------------------------------------------------
##
## Given these input parameter estimates the moments of the output random variable are
## (assuming Gaussian input):
## mu_y = 2052; sigma_y = 491; skewness = 0; kurtosis = 13.
а потім скористайтеся бієктивним зворотним перетворенням (на основі W_delta()
) для зворотної трансформації даних на вхід , який - за задумом - повинен бути дуже близьким до нормального.X
# get_input() handles does the right transformations automatically based on
# estimates in mod.Lh
xx <- get_input(mod.Lh)
test_norm(xx)
## $seed
## [1] 218646
##
## $shapiro.wilk
##
## Shapiro-Wilk normality test
##
## data: data.test
## W = 1, p-value = 1
##
##
## $shapiro.francia
##
## Shapiro-Francia normality test
##
## data: data.test
## W = 1, p-value = 1
##
##
## $anderson.darling
##
## Anderson-Darling normality test
##
## data: data
## A = 0.1, p-value = 1
Вуаля!