การเปลี่ยนแปลงพลังงาน Yeo-Johnson ที่กล่าวถึงในที่นี้มีคุณสมบัติที่ยอดเยี่ยมที่ออกแบบมาเพื่อจัดการศูนย์และเนกาทีฟในขณะที่สร้างจุดแข็งของการแปลงพลังงาน Box Cox นี่คือสิ่งที่ฉันมักจะไปเมื่อฉันจัดการกับศูนย์หรือข้อมูลเชิงลบ
นี่คือบทสรุปของการเปลี่ยนแปลงด้วยข้อดี / ข้อเสียเพื่อแสดงให้เห็นว่าทำไม Yeo-Johnson จึงดีกว่า
เข้าสู่ระบบ
จุดเด่น: ทำงานได้ดีกับข้อมูลเชิงบวก
ข้อด้อย: ไม่จัดการกับศูนย์
> log(0)
[1] -Inf
บันทึกบวก 1
ข้อดี: การชดเชย 1 บวกเพิ่มความสามารถในการจัดการค่าศูนย์นอกเหนือจากข้อมูลในเชิงบวก
ข้อด้อย: ล้มเหลวด้วยข้อมูลเชิงลบ
> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced
รากที่สอง
ข้อดี: ใช้การแปลงพลังงานที่สามารถจัดการศูนย์และข้อมูลในเชิงบวก
ข้อด้อย: ล้มเหลวด้วยข้อมูลเชิงลบ
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
Box Cox
รหัส R:
box_cox <- function(x, lambda) {
eps <- 0.00001
if (abs(lambda) < eps)
log(x)
else
(x ^ lambda - 1) / lambda
}
ข้อดี: เปิดใช้งานการแปลงพลังงานที่ปรับขนาด
จุดด้อย: ทนทุกข์ทรมานจากปัญหาเกี่ยวกับศูนย์และเนกาทีฟ (เช่นสามารถจัดการข้อมูลในเชิงบวกเท่านั้น
> box_cox(0, lambda = 0)
[1] -Inf
> box_cox(0, lambda = -0.5)
[1] -Inf
> box_cox(-1, lambda = 0.5)
[1] NaN
ยีโอจอห์นสัน
รหัส R:
yeo_johnson <- function(x, lambda) {
eps <- .000001
not_neg <- which(x >= 0)
is_neg <- which(x < 0)
not_neg_trans <- function(x, lambda) {
if (abs(lambda) < eps) log(x + 1)
else ((x + 1) ^ lambda - 1) / lambda
}
neg_trans <- function(x, lambda) {
if (abs(lambda - 2) < eps) - log(-x + 1)
else - ((-x + 1) ^ (2 - lambda) - 1) / (2 - lambda)
}
x[not_neg] <- not_neg_trans(x[not_neg], lambda)
x[is_neg] <- neg_trans(x[is_neg], lambda)
return(x)
}
ข้อดี: สามารถจัดการข้อมูลในเชิงบวกศูนย์และลบ
จุดด้อย: ไม่มีที่ฉันสามารถคิดได้ คุณสมบัติคล้ายกับ Box-Cox มาก แต่สามารถจัดการข้อมูลที่เป็นศูนย์และลบได้
> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951