Trasformazione per aumentare la curtosi e l'asimmetria del camper normale


20

Sto lavorando a un algoritmo che si basa sul fatto che le osservazioni sono normalmente distribuite e vorrei testare empiricamente la solidità dell'algoritmo a questa ipotesi.Y

Per fare questo, ero alla ricerca di una sequenza di trasformazioni che avrebbe progressivamente interrompere la normalità di . Ad esempio se gli sono normali hanno asimmetria e curtosi , e sarebbe bello trovare una sequenza di trasformazione che aumenti progressivamente entrambi.Y Y = 0 = 3T1(),…,Tn()YY=0=3

La mia idea era di simulare alcuni dati approssimativamente distribuiti approssimativamente e testare l'algoritmo su quello. Quindi prova l'algoritmo su ogni set di dati trasformato , per vedere quanto sta cambiando l'output.T 1 ( Y ) , … , T n ( y )YT1(Y),...,Tn(y)

Si noti che non controllo la distribuzione degli simulati , quindi non posso simularli usando una distribuzione che generalizza il normale (come la distribuzione degli errori generalizzata obliqua).Y


2
Il problema con una sequenza di trasformazioni del genere è che la tua conclusione è limitata agli effetti di quella particolare sequenza. La tua sequenza traccia in effetti un percorso nello spazio corrispondente a una singola famiglia di distribuzioni basata su una (presumibilmente un parametro, dal momento che dici "sequenza") della normale. Supponiamo che la regione vitale ( γ 1 , γ 2 ) sia 2D e che per ogni dato punto al suo interno ci sia un numero infinito di diverse distribuzioni, osservando una singola famiglia tracciare una singola curva sarebbe alquanto limitante ... (ctd )(γ1,γ2)(γ1,γ2)
— Glen_b -Restate Monica

1
(ctd) ... specialmente se la particolare famiglia che generi non tende a rivelare problemi che potrebbero altrimenti essere abbastanza comuni.
— Glen_b

Risposte:


22

Questo può essere fatto usando la trasformazione sinh-arcsinh di

Jones, MC e Pewsey A. (2009). Distribuzioni Sinh-arcsinh . Biometrika 96: 761–780.

La trasformazione è definita come

(⋆)H(X;ε,δ)=sinh⁡[δsinh-1⁡(X)-ε],

dove e δ ∈ R + . Quando questa trasformazione viene applicata al normale CDF S ( x ; ϵ , δ ) = Φ [ H ( x ; ϵ , δ ) ] , produce una distribuzione unimodale i cui parametri ( ϵ , δ ) controllano rispettivamente l'asimmetria e la curtosi (Jones e Pewsey, 2009), nel senso di van Zwet (1969) . Inoltre, se ϵ = 0 e δε∈Rδ∈R+S(X;ε,δ)=Φ[H(X;ε,δ)](ε,δ)ε=0 , otteniamo la distribuzione normale originale. Vedi il seguente codice 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")

Pertanto, scegliendo una sequenza appropriata di parametri , è possibile generare una sequenza di distribuzioni / trasformazioni con diversi livelli di asimmetria e curtosi e farli sembrare simili o diversi rispetto alla distribuzione normale che si desidera.(εn,δn)

Il diagramma seguente mostra il risultato prodotto dal codice R. Per (i) e δ = 1 , e (ii) ϵ = 0 e δ = ( 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)

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

La simulazione di questa distribuzione è semplice dato che devi solo trasformare un campione normale usando l'inverso di .(⋆)

H-1(X;ε,δ)=sinh⁡[δ-1(sinh-1⁡(X)+ε)]

2
Grazie mille Procrastinator! Questo e 'esattamente quello che stavo cercando.
— Matteo Fasiolo,

2
Sembra in gamlss.dist::rSHASHogrado di generare queste distribuzioni.
— Artem Klevtsov,

7

Questo può essere fatto usando le variabili / distribuzioni casuali di Lambert W x F. Una variabile casuale Lambert W x F (RV) è una X non linearmente trasformata (RV) con distribuzione F.

α=1Gaussianize()

Sono implementati nel

Le trasformazioni di Lambert W x F sono disponibili in 3 gusti:

  • type = 's'γ∈R
  • type = 'h'δ≥0α
  • type = 'hh'δl,δr≥0

Vedi riferimenti su inclinato e coda pesante (Disclaimer: io sono l'autore.)

In R è possibile simulare, stimare, tracciare, ecc. Diverse distribuzioni Lambert W x F con il pacchetto LambertW .

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

inserisci qui la descrizione dell'immagine

γδlδr


5

Una di queste sequenze è l'esponenziazione a vari livelli. Per esempio

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.2…x2


0

Stessa risposta di @utente10525 ma in pitone

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]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.