การเปลี่ยนรูปเพื่อเพิ่มความโด่งและความเบ้ของค่าปกติ


20

ฉันกำลังทำงานกับอัลกอริทึมที่อาศัยข้อเท็จจริงที่ว่าการสังเกตของนั้นได้รับการแจกแจงตามปกติและฉันต้องการที่จะทดสอบความทนทานของอัลกอริทึมกับสมมติฐานนี้โดยประจักษ์Y

การทำเช่นนี้ผมกำลังมองหาลำดับของการเปลี่ยนแปลงที่จะมีความก้าวหน้าทำลายปกติของYตัวอย่างเช่นถ้าเป็นเรื่องปกติพวกเขาจะมีความเบ้และ kurtosisและมันจะเป็นการดีที่จะหาลำดับของการเปลี่ยนแปลงที่เพิ่มขึ้นอย่างต่อเนื่องY Y = 0 = 3T1(),,Tn()YY=0=3

ความคิดของฉันคือการจำลองข้อมูลที่กระจายโดยประมาณประมาณและทดสอบอัลกอริทึมในนั้น กว่าอัลกอริธึมการทดสอบในชุดข้อมูลที่ถูกแปลงแต่ละชุดเพื่อดูว่าเอาต์พุตมีการเปลี่ยนแปลงมากน้อยเพียงใดYT1(Y),,Tn(y)

โปรดสังเกตว่าฉันไม่ได้ควบคุมการกระจายตัวของจำลองดังนั้นฉันไม่สามารถจำลองพวกมันโดยใช้การแจกแจงที่วางตัวแบบปกติ (เช่นการกระจายข้อผิดพลาดทั่วไปแบบเบ้)Y


2
ปัญหาเกี่ยวกับลำดับการแปลงเช่นนี้คือข้อสรุปของคุณถูก จำกัด เฉพาะผลกระทบของลำดับเฉพาะนั้น ลำดับของคุณจะมีผลในการติดตามเส้นทางในพื้นที่สอดคล้องกับตระกูลเดียวของการแจกแจงโดยอิงตามการแปลง (สันนิษฐานหนึ่งพารามิเตอร์เนื่องจากคุณพูดว่าการเปลี่ยน 'ลำดับ') ของปกติ ว่าภูมิภาคที่ทำงานได้เป็นแบบ 2 มิติและสำหรับจุดใดก็ตามที่อยู่ภายในนั้นมีการแจกแจงที่แตกต่างกันไม่ จำกัด จำนวนการดูครอบครัวเดี่ยวที่ติดตามเส้นโค้งเดียวจะค่อนข้าง จำกัด ... (ctd )( γ 1 , γ 2 )(γ1,γ2)(γ1,γ2)
Glen_b

1
(ctd) ... โดยเฉพาะอย่างยิ่งหากครอบครัวที่คุณสร้างไม่ได้มีแนวโน้มที่จะเปิดเผยปัญหาที่อาจเป็นเรื่องธรรมดา
Glen_b

คำตอบ:


22

สิ่งนี้สามารถทำได้โดยใช้การแปลง sinh-arcsinh จาก

Jones, MC และ Pewsey A. (2009) กระจาย Sinh-arcsinh Biometrika 96: 761–780

การเปลี่ยนแปลงหมายถึง

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

ที่และ + เมื่อการเปลี่ยนแปลงครั้งนี้ถูกนำไปใช้ตามปกติ CDFจะผลิตการกระจายรูปแบบเดียวที่มีพารามิเตอร์การควบคุม เบ้และความโด่งตามลำดับ (โจนส์และ Pewsey 2009) ในความรู้สึกของรถตู้ Zwet (1969) นอกจากนี้หากและเราจะได้การแจกแจงปกติแบบดั้งเดิม ดูรหัส R ต่อไปนี้ δ R + S ( x ; ε , δ ) = Φ [ H ( x ; ε , δ ) ]ϵRδR+S(x;ϵ,δ)=Φ[H(x;ϵ,δ)]ε = 0 δ = 1(ϵ,δ)ϵ=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)และ(0.5,0.75,1,1.25,1.5)δ = 1 ϵ = 0ϵ=(2,1,0,1,2)δ=1 ϵ=0δ=(0.5,0.75,1,1.25,1.5)

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

การจำลองการกระจายนี้จะได้รับตรงไปตรงมาว่าคุณเพียงแค่ต้องเปลี่ยนตัวอย่างปกติใช้ผกผันของดาว)()

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

2
ขอบคุณ Procrastinator มาก ๆ ! นี่คือสิ่งที่ฉันกำลังมองหา
Matteo Fasiolo

2
ดูเหมือนว่าgamlss.dist::rSHASHoสามารถสร้างการกระจายนี้
Artem Klevtsov

7

สิ่งนี้สามารถทำได้โดยใช้ตัวแปร / การแจกแจงแบบสุ่มของ Lambert W x F ตัวแปรสุ่ม Lambert W x F (RV) เป็นแบบไม่เชิงเส้น (RV) X ที่มีการแจกแจง F

สำหรับ F คือการแจกแจงแบบปกติและพวกมันจะลดการแจกแจงแบบ Tukey ของ h คุณสมบัติที่ดีของการแจกแจง Lambert W x F คือคุณสามารถย้อนกลับจากที่ไม่ปกติเป็นปกติอีกครั้ง เช่นคุณสามารถประเมินพารามิเตอร์และข้อมูลของคุณα=1Gaussianize()

พวกเขาจะดำเนินการใน

การเปลี่ยนแปลงของ Lambert W x F มี 3 รสชาติ:

  • เบ้ ( type = 's') พร้อมพารามิเตอร์ความเบ้γR
  • heavy-tailed ( type = 'h') พร้อมพารามิเตอร์หาง (และตัวเลือก )αδ0α
  • เบ้และหนักเทลด์ ( type = 'hh') พร้อมพารามิเตอร์หางซ้าย / ขวา δl,δr0

ดูการอ้างอิงเกี่ยวกับเบ้และหางหนา (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน)

ใน R คุณสามารถจำลองประเมินวางแผนและกระจาย Lambert W x F หลาย ๆชุดด้วยแพ็คเกจLambert

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

ป้อนคำอธิบายรูปภาพที่นี่

มันทำงานคล้ายกับลำดับเพื่อเพิ่มความเบ้ และถ้าคุณต้องการที่จะเพิ่มความเบ้และหนักหางแล้วสร้างลำดับของและ\δ ลิตรδ Rγδlδr


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

คุณสามารถใช้เพื่อรับองศาการเปลี่ยนแปลงระดับกลางx1.1,x1.2x2


0

คำตอบเดียวกับ @ user10525 แต่เป็นไพ ธ อน

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]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.