Transformacja w celu zwiększenia kurtozy i skośności normalnego rv


20

Pracuję nad algorytmem, który opiera się na fakcie, że obserwacje są normalnie rozłożone, i chciałbym empirycznie przetestować odporność algorytmu na to założenie.Y

Aby to zrobić, szukałem sekwencji przemian , które stopniowo zakłócić normalność . Na przykład, jeśli są normalne, mają skośność i kurtozę , i byłoby miło znaleźć sekwencję transformacji, która stopniowo zwiększa oba.Y Y = 0 = 3T1(),,Tn()YY=0=3

Moim pomysłem było symulowanie niektórych normalnie w przybliżeniu rozproszonych danych i przetestowanie algorytmu na tym. Następnie algorytm testowy na każdym przekształconym danych , aby zobaczyć, jak bardzo zmienia się wynik.T 1 ( Y ) , , T n ( y )YT1(Y),,Tn(y)

Zauważ, że nie kontroluję rozkładu symulowanych , więc nie mogę symulować ich przy użyciu rozkładu, który uogólnia normalne (takie jak Skośny Ogólny Rozkład Błędów).Y


2
Problem z taką sekwencją transformacji jest taki, że twój wniosek ogranicza się do efektów tej konkretnej sekwencji. Twoja sekwencja w efekcie wyśledzi ścieżkę w przestrzeni odpowiadającej jednej rodzinie rozkładów opartej na (przypuszczalnie jednoparametrowej, skoro mówimy, że „sekwencja”) transformacji normalnej. Załóżmy, że żywotnym jest 2D i że dla każdego danego punktu w nim istnieje nieskończona liczba różnych rozkładów, patrzenie na jedną rodzinę wykreślającą pojedynczą krzywą byłoby nieco ograniczające ... (ctd )( γ 1 , γ 2 )(γ1,γ2))(γ1,γ2))
Glen_b

1
(ctd) ... szczególnie, jeśli dana rodzina, którą generujesz, nie ujawnia problemów, które w innym przypadku mogłyby być dość powszechne.
Glen_b

Odpowiedzi:


22

Można tego dokonać za pomocą transformacji sinh-arcsinh z

Jones, MC i Pewsey A. (2009). Rozkłady Sinh-arcsinh . Biometrika 96: 761–780.

Transformacja jest zdefiniowana jako

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

gdzie i . Gdy transformacja ta zostanie zastosowana do normalnego CDF , powstaje rozkład jednomodalny, którego parametry kontrolują odpowiednio skośność i kurtoza (Jones i Pewsey, 2009) w sensie van Zwet (1969) . Ponadto, jeśli i , otrzymamy oryginalny rozkład normalny. Zobacz następujący kod 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")

Dlatego wybierając odpowiednią sekwencję parametrów , możesz wygenerować sekwencję rozkładów / przekształceń z różnymi poziomami skośności i kurtozy i sprawić, by wyglądały one podobnie lub inaczej niż rozkład normalny, jak chcesz.(ϵn,δn)

Poniższy wykres pokazuje wynik wygenerowany przez kod R. Dla (i) i oraz (ii) 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)

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Symulacja tego rozkładu jest prosta, biorąc pod uwagę, że wystarczy przekształcić próbkę normalną za pomocą odwrotności .()

H.-1(x;ϵ,δ)=sinh[δ-1(sinh-1(x)+ϵ)]

2
Wielkie dzięki Procrastinator! Właśnie tego szukałem.
Matteo Fasiolo

2
Wydaje się, że gamlss.dist::rSHASHomożna wygenerować te rozkłady.
Artem Klevtsov

7

Można tego dokonać za pomocą losowych zmiennych / rozkładów Lamberta W x F. Zmienna losowa Lambert W x F (RV) jest nieliniowo transformowaną (RV) X o rozkładzie F.

Dla F jest rozkładem normalnym, aα=1Gaussianize()

Są one wdrażane w

Transformacje Lambert W x F występują w 3 wariantach:

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

Zobacz referencje na temat skośnych i grubych ogonów (zrzeczenie się odpowiedzialności: jestem autorem).

W R możesz symulować, szacować, kreślić itp. Kilka rozkładów W x F Lambert za pomocą pakietu Lambert W.

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 = ")

wprowadź opis zdjęcia tutaj

γδlδr


5

Jedną z takich sekwencji jest potęgowanie do różnych stopni. Na przykład

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

Ta sama odpowiedź co @ user10525, ale w pythonie

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]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.