Трансформация для увеличения эксцесса и асимметрии нормального течения

20

Я работаю над алгоритмом, который основан на том факте, что наблюдения s обычно распределяются, и я хотел бы проверить надежность алгоритма в этом предположении эмпирически.Y

Чтобы сделать это, я искал последовательность преобразований , которые постепенно разрушают нормальности . Например, если нормальны, они имеют асимметрию и kurtosis , и было бы неплохо найти последовательность трансформации, которая постепенно увеличивает оба.Y Y = 0 = 3Т1(),...,ТN()YYзнак равно0знак равно3

Моя идея состояла в том, чтобы смоделировать некоторые обычно приблизительно распределенные данные и протестировать алгоритм на этом. Затем проверьте алгоритм на каждом преобразованном наборе данных , чтобы увидеть, насколько сильно меняется выходной результат.T 1 ( Y ) , , T n ( y )YТ1(Y),...,ТN(Y)

Обратите внимание, что я не контролирую распределение имитируемых s, поэтому я не могу имитировать их, используя распределение, которое обобщает нормали (такие как перекошенное обобщенное распределение ошибок).Y

Маттео Фазиоло
источник
2
Проблема с такой последовательностью преобразований заключается в том, что вы пришли к выводу, что влияние этой конкретной последовательности ограничено. Ваша последовательность в действительности отследит путь в пространстве, соответствующем одному семейству распределений на основе (предположительно однопараметрического, так как вы говорите «последовательность») преобразования нормали. Предположим, что жизнеспособная область является двухмерной и что для любой заданной точки в ней существует бесконечное число различных распределений, рассмотрение одной семьи, отслеживающее одну кривую, было бы несколько ограничивающим ... (ctd )( γ 1 , γ 2 )(γ1,γ2)(γ1,γ2)
Glen_b
1
(ctd) ... особенно если конкретная семья, которую вы создаете, не склонна раскрывать проблемы, которые в противном случае могут быть довольно распространенными.
Glen_b

Ответы:

22

Это можно сделать с помощью преобразования sinh-arcsinh из

Джонс, М. С. и Пьюси А. (2009). Синх-арчинские распределения . Биометрика 96: 761–780.

Преобразование определяется как

()ЧАС(Икс;ε,δ)знак равнозп[δзп-1(Икс)-ε],

где и . Когда это преобразование применяется к обычному CDF , оно создает унимодальное распределение, параметры которого контролируют асимметрия и эксцесс соответственно (Jones and Pewsey, 2009) в смысле van Zwet (1969) . Кроме того, если и , мы получим исходное нормальное распределение. Смотрите следующий код R δ R + S ( x ; ϵ , δ ) = Φ [ H ( x ; ϵ , δ ) ] ( ϵ , δ ) ϵ = 0 δ = 1εрδр+S(Икс;ε,δ)знак равноΦ[ЧАС(Икс;ε,δ)](ε,δ)εзнак равно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")

Поэтому, выбрав подходящую последовательность параметров , вы можете сгенерировать последовательность распределений / преобразований с различными уровнями асимметрии и эксцессов и сделать их похожими или отличными от нормального распределения, как вы хотите.(εN,δN)

Следующий график показывает результат, полученный с помощью кода R. Для (i) и , и (ii) и .δ = 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)

введите описание изображения здесь

введите описание изображения здесь

Имитация этого распределения проста, учитывая, что вам просто нужно преобразовать нормальную выборку, используя обратную .()

ЧАС-1(Икс;ε,δ)знак равнозп[δ-1(зп-1(Икс)+ε)]

источник
2
Большое спасибо Прокрастинатор! Это именно то, что я искал.
Маттео Фазиоло,
2
Кажется gamlss.dist::rSHASHoможет сгенерировать это распределение.
Артем Клевцов
7

Это можно сделать с помощью случайных величин / распределений Ламберта W x F. Случайная величина Ламберта W x F (RV) является нелинейно преобразованным (RV) X с распределением F.

αзнак равно1Gaussianize()

Они реализованы в

Преобразования Ламберта W x F бывают трех видов:

  • type = 's'γр
  • type = 'h'δ0α
  • type = 'hh'δL,δр0

См. Ссылки на перекос и тяжелый хвост (ы) (Отказ от ответственности: я автор.)

В R вы можете смоделировать, оценить, построить и т. Д. Несколько распределений Ламберта W x F с пакетом 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 = ")

введите описание изображения здесь

γδLδр

Георг М. Горг
источник
5

Одна такая последовательность - возведение в степень в различной степени. Например

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

Икс1,1,Икс1.2...Икс2

Питер Флом - Восстановить Монику
источник
0

Тот же ответ, что и у @ user10525, но в 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
источник