정상 rv의 첨도 및 왜도를 증가시키는 변형


20

나는 관측 값 가 정규 분포 되어 있다는 사실에 의존하는 알고리즘을 연구하고 있으며 경험적 으로이 가정에 대한 알고리즘의 견고성을 테스트하고 싶습니다.Y

이를 위해 의 정규성을 점진적으로 중단시키는 일련의 변환 을 . 예를 들어, 가 정상 왜도 이고 첨도 이므로 점진적으로 증가하는 변형 순서를 찾는 것이 좋습니다.Y Y = 0 = 3T1(),,Tn()YY=0=3

내 생각은 일반적으로 대략적으로 분포 된 데이터 를 시뮬레이션 하고 그 알고리즘을 테스트하는 것이 었습니다 . 변환 된 각 데이터 세트 에 대한 테스트 알고리즘보다 출력이 얼마나 많이 변경되는지 확인하십시오.T 1 ( Y ) , ... , T , N ( Y )YT1(Y),,Tn(y)

시뮬레이션 된 의 분포를 제어하지 않으므로 법선을 일반화하는 분포 (예 : 기울어 진 일반 오차 분포)를 사용하여 시뮬레이트 할 수 없습니다.Y


2
이와 같은 변환 순서의 문제점은 결론이 특정 순서의 영향으로 제한된다는 것입니다. 시퀀스는 사실상 공간에서 법선의 (시퀀스라고 말하기 때문에 아마도 하나의 매개 변수) 변환을 기반으로 단일 분포 군에 해당 하는 경로를 추적합니다 . 실행 가능한 영역이 2D이고 그 안에 주어진 점에 대해 무한한 수의 다른 분포가 있으며 단일 곡선을 추적하는 단일 가족을 보는 것이 다소 제한적입니다 ... (ctd )( γ 1 , γ 2 )(γ1,γ2)(γ1,γ2)
Glen_b-복지국 모니카

1
(ctd) ... 특히 생성 한 특정 가족이 그렇지 않은 경우 일반적으로 발생할 수있는 문제를 드러내지 않는 경우.
Glen_b-복지 주 모니카

답변:


22

이것은 sinh-arcsinh 변환을 사용하여 수행 할 수 있습니다.

Jones, MC 및 Pewsey A. (2009). Sinh-arcsinh 분포 . Biometrika 96 : 761–780.

변환은 다음과 같이 정의됩니다

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

여기서 및 입니다. 이 변환이 일반 CDF 되면 모수 제어를 갖는 단봉 분포를 생성합니다. van Zwet (1969) 의 의미에서 각각 왜도 및 첨도 (Jones and Pewsey, 2009 ) . 또한 및 이면 원래 정규 분포를 얻습니다. 다음 R 코드를 참조하십시오. δ R + S ( X , ε , δ ) = Φ [ H ( X , ε , δ ) ] ( ε , δ ) ε = 0 δ = 1ϵRδR+S(x;ϵ,δ)=Φ[H(x;ϵ,δ)](ϵ,δ)ϵ=0δ=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)

다음 그림은 R 코드로 생성 된 결과를 보여줍니다. 옵션 (I) 및 , 및 (ⅱ) 및 .δ = 1 ϵ = 0 δ = ( 0.5 , 0.75 , 1 , 1.25 , 1.5 )ϵ=(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

2
보이는데 gamlss.dist::rSHASHo,이 분포를 생성 할 수있다.
Artem Klevtsov

7

이는 Lambert W x F 랜덤 변수 / 분포를 사용하여 수행 할 수 있습니다. Lambert W x F 랜덤 변수 (RV)는 분포가 F 인 비선형 변환 (RV) X입니다.

F가 정규 분포이고 인 경우 Tukey의 h 분포로 줄어 듭니다. Lambert W x F 분포의 장점은 비정규에서 법선으로 다시 돌아갈 수 있다는 것입니다. 즉, 매개 변수와 데이터를 추정 할 수 있습니다 .α=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γδ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와 같은 답변이지만 파이썬에서는

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]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.