Transformação para aumentar a curtose e a distorção do RV normal

20

Estou trabalhando em um algoritmo que se baseia no fato de que as observações são normalmente distribuídas e eu gostaria de testar a robustez do algoritmo para essa suposição empiricamente.Y

Para fazer isso, eu estava procurando uma sequência de transformações que progressivamente iria perturbar a normalidade da . Por exemplo, se os são normais, eles têm assimetria e curtose , e seria bom encontrar uma sequência de transformação que aumente progressivamente as duas.T1(),...,Tn()YY=0 0=3

Minha idéia era simular alguns dados normalmente distribuídos aproximadamente e testar o algoritmo nisso. Que o algoritmo de teste em cada conjunto de dados transformado , para ver quanto a saída está mudando.YT1(Y),,Tn(y)

Note-se que não controlar a distribuição do simulado s, por isso, não pode simular-los usando uma distribuição que generaliza o normal (tal como a distribuição de erro é enviesado Generalizada).Y

Matteo Fasiolo
fonte
2
O problema com uma sequência de transformações como essa é a sua conclusão é limitada aos efeitos dessa sequência específica. Com efeito, sua sequência traçará um caminho no espaço (γ1,γ2) correspondente a uma única família de distribuições baseadas em uma (presumivelmente um parâmetro, já que você diz 'sequência') a transformação do normal. Dado que a região viável (γ1,γ2) é 2D e que, para qualquer ponto dentro dela, existe um número infinito de distribuições diferentes, olhar para uma única família traçando uma única curva seria um pouco limitante ... (ctd )
Glen_b
1
(ctd) ... especialmente se a família em particular que você gera não tende a revelar problemas que, de outra forma, seriam bastante comuns.
Glen_b -Reinstala Monica

Respostas:

22

Isso pode ser feito usando a transformação sinh-arcsinh de

Jones, MC e Pewsey A. (2009). Distribuições Sinh-arcsinh . Biometrika 96: 761-780.

A transformação é definida como

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

onde e ô R + . Quando essa transformação é aplicada ao CDF normal S ( x ; ϵ , δ ) = Φ [ H ( x ; ϵ , δ ) ] , produz uma distribuição unimodal cujos parâmetros ( ϵ , δ ) controlam a assimetria e curtose, respectivamente (Jones e Pewsey, 2009), no sentido de van Zwet (1969) . Além disso, se ϵ = 0 e δϵRδR+S(x;ϵ,δ)=Φ[H(x;ϵ,δ)](ϵ,δ)ϵ=0 0 , obtemos a distribuição normal original. Veja o seguinte código 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")

Portanto, escolhendo uma sequência apropriada de parâmetros , é possível gerar uma sequência de distribuições / transformações com diferentes níveis de assimetria e curtose e fazê-las parecer tão semelhantes ou diferentes da distribuição normal quanto desejar.(ϵn,δn)

O gráfico a seguir mostra o resultado produzido pelo código R. Para (i) e δ = 1 , e (ii) ϵ = 0 e δ = ( 0,5 , 0,75 , 1 , 1,25 , 1,5 ) .ϵ=(-2,-1,0 0,1,2)δ=1 ϵ=0 0δ=(0,5,0,75,1,1,25,1.5)

insira a descrição da imagem aqui

insira a descrição da imagem aqui

A simulação dessa distribuição é direta, pois você precisa transformar uma amostra normal usando o inverso de .()

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

fonte
2
Muito obrigado procrastinador! Era exatamente isso que eu estava procurando.
9788 Matteo Fasiolo #
2
Parece que gamlss.dist::rSHASHopode gerar essas distribuições.
Artem Klevtsov
7

Isso pode ser feito usando variáveis ​​/ distribuições aleatórias de Lambert W x F. Uma variável aleatória Lambert W x F (VR) é um X não-linearmente transformado (RV) X com distribuição F.

α=1Gaussianize()

Eles são implementados no

As transformações Lambert W x F são apresentadas em três sabores:

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

Consulte as referências sobre cauda (s) inclinada (s) e pesada (isenção de responsabilidade: eu sou o autor).

Em R, você pode simular, estimar, plotar, etc. várias distribuições Lambert W x F com o pacote 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 = ")

insira a descrição da imagem aqui

γδeuδr

Georg M. Goerg
fonte
5

Uma dessas seqüências é a exponenciação em vários graus. Por exemplo

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

Peter Flom - Restabelece Monica
fonte
0

Mesma resposta que @ user10525, mas em 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]

JPlatts
fonte