Normal rv'nin basıklık ve çarpıklığını arttıracak dönüşüm


20

gözlemlerinin normal olarak dağıtıldığı gerçeğine dayanan bir algoritma üzerinde çalışıyorum ve algoritmanın bu varsayımın sağlamlığını ampirik olarak test etmek istiyorum.Y

Bunu yapmak için , normalliğini aşamalı olarak bozacak bir dizi dönüşüm . Örneğin s normal sahip oldukları çarpıklık ve basıklık , ve progresif olarak artırmaya dönüşümün bir dizi bulmaya iyi olurdu.Y Y = 0 = 3T1(),,Tn()YY=0=3

Benim fikrim, normal olarak yaklaşık olarak dağıtılmış bazı verilerini simüle etmek ve bu algoritmayı test etmekti . ne kadar değiştiğini görmek için dönüştürülen her veri kümesi üzerinde test algoritması .T 1 ( Y ) , , T n ( y )YT1(Y),,Tn(y)

Simüle edilmiş dağılımını kontrol etmediğime dikkat edin , bu yüzden Normal'i genelleştiren bir dağıtım (Eğri Genelleştirilmiş Hata Dağılımı gibi) kullanarak simüle edemiyorum.Y


2
Bunun gibi bir dönüşüm dizisiyle ilgili sorun, sonucunuz bu belirli dizinin etkileriyle sınırlıdır. Sıralamanız aslında alanındaki ('sıra' dediğinizden beri muhtemelen tek parametreli) dağılımına dayanan tek bir dağıtım ailesine karşılık gelen bir yolu . Canlı ver bölge 2D ve içindeki herhangi bir nokta tek bir eğri dışarı izleme tek bir aile bakarak farklı dağılımlar sonsuz sayıda vardır için biraz kısıtlayıcı olacağını ... (CTD )( γ 1 , γ 2 )(γ1,γ2)(γ1,γ2)
Glen_b

1
(ctd) ... özellikle oluşturduğunuz belirli aile, aksi takdirde oldukça yaygın olabilecek sorunları ortaya çıkarma eğiliminde değilse.
Glen_b-Monica

Yanıtlar:


22

Bu, sinh-arcsinh dönüşümü kullanılarak yapılabilir.

Jones, MC ve Pewsey A. (2009). Sinh-arcsinh dağılımları . Biometrika 96: 761-780.

Dönüşüm şu şekilde tanımlanır:

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

burada ve δ R + . Bu dönüşüm normal CDF S ( x ; ϵ , δ ) = Φ [ H ( x ; ϵ , δ ) ] ' a uygulandığında, parametreleri ( ϵ , δ ) çarpıklığı ve basıklığı kontrol eden tek modlu bir dağılım üretir (Jones ve Pewsey, 2009), van Zwet (1969) anlamında . Ayrıca, ϵ = 0 ve δ iseϵRδR+S(x;ϵ,δ)=Φ[H(x;ϵ,δ)](ϵ,δ)ϵ=0 , orijinal normal dağılımı elde ederiz. Aşağıdaki R koduna bakın.δ=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")

Bu nedenle, uygun bir parametre dizisi seçerek , farklı çarpıklık ve basıklık seviyelerine sahip bir dağılımlar / dönüşümler dizisi oluşturabilir ve bunları istediğiniz gibi normal dağılıma benzer veya farklı görünmesini sağlayabilirsiniz.(ϵn,δn)

Aşağıdaki grafik, R kodu tarafından üretilen sonucu göstermektedir. İçin : (i) ve δ = 1 , ve (ii) ε = 0 ve δ = ( 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)

resim açıklamasını buraya girin

resim açıklamasını buraya girin

in tersini kullanarak normal bir örneği dönüştürmeniz gerektiğinden, bu dağılımın simülasyonu kolaydır .()

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

2
Çok teşekkürler Erteleyici! Tam da aradığım şey buydu.
Matteo Fasiolo

2
Görünüşe göre gamlss.dist::rSHASHobu dağılımları üretebilir.
Artem Klevtsov

7

Bu Lambert W x F rasgele değişkenleri / dağılımları kullanılarak yapılabilir. Lambert W x F rasgele değişkeni (RV), F dağılımı ile doğrusal olarak dönüştürülmemiş (RV) X'tir.

α=1Gaussianize()

Onlar uygulanır

Lambert W x F dönüşümleri 3 çeşittir:

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

Bkz. Eğri ve ağır kuyruk (lar) için referanslar (Feragatname: Ben yazarım.)

R'de LambertW paketi ile birkaç Lambert W x F dağılımını simüle edebilir, tahmin edebilir, çizebilir , vb .

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

resim açıklamasını buraya girin

γδlδr


5

Böyle bir sekans çeşitli derecelerde üs almadır. Örneğin

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

@ User10525 ile aynı cevap ama python'da

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]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.