转化以增加正常rv的峰度和偏度


20

我正在研究一种算法,该算法依赖于观测值 s呈正态分布这一事实,并且我想凭经验测试该假设对算法的鲁棒性。Y

为此,我正在寻找一系列转换,这些转换将逐渐破坏的正态性。例如,如果正常,则其偏度T1(),,Tn()YY=0且峰度=3,并且找到一个逐渐增加两者的转换序列会很好。

我的想法是模拟一些近似正态分布的数据Y并在其上测试算法。在每个变换后的数据集T1(Y),,Tn(y),使用测试算法,以查看输出变化了多少。

请注意,我不控制模拟Y的分布,因此无法使用对法线进行一般化的分布(例如“偏斜广义误差分布”)对它们进行模拟。


2
这样的转换序列的问题是您的结论仅限于该特定序列的影响。在效果跟踪您的序列将出一个路径(γ1,γ2)与基于掀起了分布的一个家庭空间(假定一个参数,既然你说“序”)正常的改造。给该可行的(γ1,γ2)区域是2D和,对于其中的任何给定的点有不同的分布的无限数量,看着一个家庭描绘出一条曲线将被一定程度限制...(CTD )
Glen_b-恢复莫妮卡

1
(ctd)...尤其是如果您所生的特定家庭不倾向于揭示原本可能相当普遍的问题。
Glen_b-恢复莫妮卡2015年

Answers:


22

这可以通过使用sinh-arcsinh转换来完成

Jones,MC和Pewsey A.(2009年)。Sinh-arcsinh分布Biometrika 96:761–780。

转换定义为

()H(x;ϵ,δ)=sinh[δsinh1(x)ϵ],

其中δ ∈ [R +。当将此变换应用于正态CDF S x ; ϵ δ = Φ [ H x ; ϵ δ ]时,它会产生一个单峰分布,其参数ϵ δ 分别控制偏度和峰度(Jones和Pewsey,2009年),从van Zwet(1969)的意义上讲。另外,如果ϵ = 0δϵRδR+S(x;ϵ,δ)=Φ[H(x;ϵ,δ)](ϵ,δ)ϵ=0,我们得到原始正态分布。请参见以下R代码。δ=1

fs = function(x,epsilon,delta) dnorm(sinh(delta*asinh(x)-epsilon))*delta*cosh(delta*asinh(x)-epsilon)/sqrt(1+x^2)

vec = seq(-15,15,0.001)

plot(vec,fs(vec,0,1),type="l")
points(vec,fs(vec,1,1),type="l",col="red")
points(vec,fs(vec,2,1),type="l",col="blue")
points(vec,fs(vec,-1,1),type="l",col="red")
points(vec,fs(vec,-2,1),type="l",col="blue")

vec = seq(-5,5,0.001)

plot(vec,fs(vec,0,0.5),type="l",ylim=c(0,1))
points(vec,fs(vec,0,0.75),type="l",col="red")
points(vec,fs(vec,0,1),type="l",col="blue")
points(vec,fs(vec,0,1.25),type="l",col="red")
points(vec,fs(vec,0,1.5),type="l",col="blue")

因此,通过选择的参数的适当顺序,可以产生不同程度的偏度和峰度分布/转换序列,使他们看起来相似或不同的正态分布,只要你想。(ϵn,δn)

ϵ=(2,1,0,1,2)δ=1 ϵ=0δ=(0.5,0.75,1,1.25,1.5)

在此处输入图片说明

在此处输入图片说明

()

H1(x;ϵ,δ)=sinh[δ1(sinh1(x)+ϵ)]

2
非常感谢拖延者!这正是我想要的。
Matteo Fasiolo 2012年

2
似乎gamlss.dist::rSHASHo可以生成此分布。
Artem Klevtsov

7

这可以使用Lambert W x F随机变量/分布来完成。Lambert W x F随机变量(RV)是具有分布F的非线性变换(RV)X。

α=1Gaussianize()

它们在

Lambert W x F转换有3种口味:

  • type = 's'γR
  • type = 'h'δ0α
  • type = 'hh'δl,δr0

请参阅有关偏斜重尾的参考(免责声明:我是作者。)

在R中,您可以使用LambertW软件包模拟,估计,绘制等Lambert W x F分布。

library(LambertW)
library(RColorBrewer)
# several heavy-tail parameters
delta.v <- seq(0, 2, length = 11)
x.grid <- seq(-5, 5, length = 100)
col.v <- colorRampPalette(c("black", "orange"))(length(delta.v))

plot(x.grid, dnorm(x.grid), lwd = 2, type = "l", col = col.v[1],
     ylab = "")
for (ii in seq_along(delta.v)) {
  lines(x.grid, dLambertW(x.grid, "normal", 
                          theta = list(delta = delta.v[ii], beta = c(0, 1))),
        col = col.v[ii])
}
legend("topleft", paste(delta.v), col = col.v, lty = 1,
       title = "delta = ")

在此处输入图片说明

γδlδr


5

这样的序列之一是不同程度的求幂。例如

library(moments)
x <- rnorm(1000) #Normal data
x2 <- 2^x #One transformation
x3 <- 2^{x^2} #A stronger transformation
test <- cbind(x, x2, x3) 
apply(test, 2, skewness) #Skewness for the three distributions
apply(test, 2, kurtosis) #Kurtosis for the three distributions

x1.1,x1.2x2


0

与@ user10525相同的答案,但是在python中

import numpy as np
from scipy.stats import norm
def sinh_archsinh_transformation(x,epsilon,delta):
    return norm.pdf(np.sinh(delta*np.arcsinh(x)-epsilon))*delta*np.cosh(delta*np.arcsinh(x)-epsilon)/np.sqrt(1+np.power(x,2))


vec = np.arange(start=-15,stop=15+0.001,step=0.001)

import matplotlib.pyplot as plt
plt.plot(vec,sinh_archsinh_transformation(vec,0,1))
plt.plot(vec,sinh_archsinh_transformation(vec,1,1),color='red')
plt.plot(vec,sinh_archsinh_transformation(vec,2,1),color='blue')
plt.plot(vec,sinh_archsinh_transformation(vec,-1,1),color='red')
plt.plot(vec,sinh_archsinh_transformation(vec,-2,1),color='blue')

[1]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.