J'utilise des distributions Lambert W x F à queue lourde pour décrire et transformer des données leptokurtiques. Voir (mes) articles suivants pour plus de détails et de références:
Voici un exemple reproductible utilisant le package 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
Le qqplot de yy
est très proche de votre qqplot dans le message d'origine et les données sont en effet légèrement leptokurtic avec un kurtosis de 5. Par conséquent, vos données peuvent être bien décrites par une distribution gaussienne Lambert W avec l'entrée et un paramètre de queue de (ce qui implique que seuls les moments jusqu'à l'ordre existent).X ∼ N ( 2000 , 400 ) δ = 0,2 ≤ 5×X∼ N( 2000 , 400 )δ= 0,2≤ 5
Revenons maintenant à votre question: comment rendre à nouveau normales ces données leptokurtiques? Eh bien, nous pouvons estimer les paramètres de la distribution en utilisant MLE (ou pour les méthodes d'utilisation des moments 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.
puis utiliser la transformation inverse bijective (basée sur W_delta()
) pour retransformer les données en entrée , qui - par conception - devrait être très proche d'une normale.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
Voila!