Transformation zur Erhöhung der Kurtosis und der Schräglage von normalem Wohnmobil


20

Ich arbeite an einem Algorithmus, der auf der Tatsache beruht, dass Beobachtungen s normal verteilt sind, und ich möchte die Robustheit des Algorithmus anhand dieser Annahme empirisch testen.Y

Dazu suchte ich nach einer Folge von Transformationen , die die Normalität von Y zunehmend stören würden . Zum Beispiel , wenn die Y s normal sind sie Schiefe = 0 und Kurtosis = 3 , und es wäre schön, eine Folge der Transformation zu finden , dass progressiv sowohl zu erhöhen.T1(),,Tn()YY.=0=3

Meine Idee war, einige normalverteilte Daten zu simulieren und den Algorithmus darauf zu testen. Als Testalgorithmus für jeden transformierten Datensatz T 1 ( Y ) , , T n ( y )Y.T1(Y.),,Tn(y) , um zu sehen, wie stark sich die Ausgabe ändert.

Beachten Sie, dass ich die Verteilung der simulierten nicht steuere und sie daher nicht mit einer Verteilung simulieren kann, die die Normalverteilung verallgemeinert (wie z. B. die schief verallgemeinerte Fehlerverteilung).Y.


2
Das Problem mit einer Sequenz von Transformationen wie dieser ist Ihre Schlussfolgerung, beschränkt sich auf die Auswirkungen dieser bestimmten Sequenz. Ihre Sequenz wird praktisch einen Pfad im -Raum aufspüren, der einer einzelnen Verteilungsfamilie entspricht, die auf einer (vermutlich ein Parameter, da Sie "Sequenz" sagen) -Transformation der Normalen basiert. Geben Sie an, dass die lebensfähige Region ( γ 1 , γ 2 ) 2D ist und dass es für einen bestimmten Punkt in ihr unendlich viele verschiedene Verteilungen gibt. Die Betrachtung einer einzelnen Familie, die eine einzelne Kurve nachzeichnet, wäre etwas einschränkend ... (ctd.) )(γ1,γ2)(γ1,γ2)
Glen_b

1
(ctd) ... besonders wenn die bestimmte Familie, die Sie erzeugen, nicht dazu neigt, Probleme aufzudecken, die sonst ziemlich häufig sein könnten.
Glen_b

Antworten:


22

Dies kann mit der Sinh-Arcsinh-Transformation von erfolgen

Jones, MC und Pewsey A. (2009). Sinh-Arcsinh-Verteilungen . Biometrika 96: 761 & ndash; 780.

Die Transformation ist definiert als

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

wo und δ R + . Wenn diese Transformation auf die normale CDF S ( x ; ϵ , δ ) = Φ [ H ( x ; ϵ , δ ) ] angewendet wird , erzeugt sie eine unimodale Verteilung, deren Parameter ( ϵ , δ ) die Schiefe bzw. Kurtosis steuern (Jones) und Pewsey, 2009) im Sinne von van Zwet (1969) . Außerdem, wenn ϵ = 0 und δϵRδR+S(x;ϵ,δ)=Φ[H(x;ϵ,δ)](ϵ,δ)ϵ=0 erhalten wir die ursprüngliche Normalverteilung. Siehe folgenden R-Code.δ=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")

Daher durch Auswahl einer geeigneten Folge von Parametern (ϵn,δn) eine Folge von Verteilungen / Transformationen mit unterschiedlichem Grad an Schiefe und Kurtosis erzeugen und diese so ähnlich oder unterschiedlich wie gewünscht zur Normalverteilung machen.

Das folgende Diagramm zeigt das vom R-Code erzeugte Ergebnis. Für (i) und δ = 1 und (ii) ϵ = 0 und δ = ( 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)

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Die Simulation dieser Verteilung ist unkompliziert, da Sie nur ein normales Sample mit der Umkehrung von transformieren müssen .()

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

2
Vielen Dank, Procrastinator! Genau das habe ich gesucht.
Matteo Fasiolo

2
Scheint gamlss.dist::rSHASHo, diese Verteilungen erzeugen zu können.
Artem Klevtsov

7

Dies kann mit Lambert W x F Zufallsvariablen / -verteilungen erfolgen. Eine Lambert-WxF-Zufallsvariable (RV) ist ein nichtlinear transformiertes (RV) X mit der Verteilung F.

Für F ist die Normalverteilung und α=1reduzieren sie sich auf Tukeys h-Verteilung. Die nette Eigenschaft von Lambert W x F-Verteilungen ist, dass Sie auch wieder von nicht normal zu normal zurückkehren können; Sie können also Parameter und Gaussianize()Ihre Daten schätzen .

Sie sind in der implementiert

Lambert W x F Transformationen gibt es in 3 Geschmacksrichtungen:

  • skewed ( type = 's') mit dem Parameter skewnessγR
  • heavy-tailed ( type = 'h') mit tail parameterδ0 (und optional α)
  • schief und stark geschwanzt ( type = 'hh') mit linkem / rechtem Schwanzparameter δl,δr0

Siehe Referenzen auf schiefen und schweren Schwanz (e) (Disclaimer:. Ich bin der Autor)

In R können Sie mit dem LambertW- Paket mehrere Lambert W x F-Verteilungen simulieren, schätzen, zeichnen usw.

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

Bildbeschreibung hier eingeben

Ähnliches gilt für eine Sequenz von γSchiefe hinzufügen. Und wenn Sie Skewness und Heavy-Tails hinzufügen möchten, generieren Sie eine Sequenz vonδl und δr.


5

Eine solche Sequenz ist die Exponentiation in verschiedenen Graden. Z.B

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

Du könntest benutzen x1.1,x1.2x2 Zwischenstufen der Transformation zu bekommen.


0

Gleiche Antwort wie @ user10525, jedoch in 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]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.