如何将尖峰分布转换为正态分布?

机器算法验证 正态分布 数据转换 峰度 QQ图
2022-03-12 01:24:58

假设我有一个想要转换为正态的leptokurtic 变量。哪些转换可以完成这项任务?我很清楚转换数据可能并不总是可取的,但作为一种学术追求,假设我想将数据“锤击”成常态。此外,从图中可以看出,所有值都是严格正数。

我尝试了各种转换(几乎所有我以前见过的转换,包括 1XXasinh(X) 等),但它们都不是特别好。是否有众所周知的变换可以使尖峰分布更正常?

请参见下面的正态 QQ 图示例:

在此处输入图像描述

3个回答

我使用重尾 Lambert W x F 分布来描述和转换细峰数据。有关更多详细信息和参考,请参阅(我的)以下帖子:

这是一个使用LambertWR包的可重现示例。

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

的 qqplotyy非常接近您在原始帖子中的 qqplot,并且数据确实略微呈尖峰态,峰度为 5。因此,您的数据可以通过输入 $X \sim N 的 Lambert W $\times$ 高斯分布很好地描述(2000, 400)$ 和 $\delta = 0.2$ 的尾部参数(这意味着仅存在高达 $\leq 5$ 的时刻)。× Gaussian distribution with input XN(2000,400) and a tail parameter of δ=0.2 (which implies that only moments up to order 5 exist).

现在回到你的问题:如何让这个 leptokurtic 数据再次正常?好吧,我们可以使用 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$,按照设计,它应该非常接近正常值。X, which -- by design -- should be very close to a normal.

# 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

瞧!

这个答案的功劳归功于@NickCox 在原始问题的评论部分中的建议。他建议我减去数据的中位数并将转换应用于偏差。例如,$\text{sign(.)}\cdot\text{abs(.)}^{\frac 1 3}$,以 $Y-\text{median}(Y)$ 作为参数。sign(.)abs(.)13, with Ymedian(Y) as the argument.

虽然立方根变换效果不佳,但事实证明平方根和更模糊的四分之三根效果很好。

这是与原始问题中细峰变量的 QQ 图相对应的原始核密度图:

在此处输入图像描述


对偏差应用平方根变换后,QQ 图如下所示:

在此处输入图像描述

更好,但它可以更接近。


再锤一些,将四分之三根变换应用于偏差给出:

在此处输入图像描述


这个转换后的变量的最终核密度如下所示:

在此处输入图像描述

看起来离我很近。

在许多情况下,可能根本没有简单形式的单调变换会产生接近正常的结果。

例如,假设我们有一个分布,它是各种参数的对数正态分布的有限混合。对数变换会将混合的任何分量转换为正态,但转换后的数据中的正态混合会给您留下不正常的东西。

或者可能有相对不错的转换,但不是您想尝试的一种形式——如果您不知道数据的分布,您可能找不到它。例如,如果数据是伽马分布的,除非我确切地告诉您分布是什么,否则您甚至找不到确切的正态变换(当然存在)(尽管您可能会偶然发现在这个只要形状参数不太小,case 就会使其非常接近正常值)。

有无数种方法可以使数据看起来可以合理地进行转换,但在任何明显的转换列表中看起来都不是很好。

如果您可以让我们访问数据,那么我们很可能可以发现一个可行的转换 - 或者我们可以向您展示您找不到的原因。

从那里的视觉印象来看,它看起来更像是两个不同比例的法线的混合体。只有轻微的不对称迹象,你可以很容易地偶然观察到。这是一个来自具有共同平均值的两个法线混合的样本示例 - 正如您所看到的,它看起来很像您的图(但其他样本可能看起来更重或更轻 - 在这个样本大小下,顺序有很多变化均值两侧 1 sd 以外的统计数据)。

在此处输入图像描述

事实上,这是你和我的叠加:

在此处输入图像描述