วิธีแปลงค่าลบเป็นลอการิทึม


12

ฉันต้องการทราบวิธีแปลงค่าลบให้Log()เป็นเพราะฉันมีข้อมูลแบบเฮเทอโรเซด ฉันอ่านว่ามันใช้งานได้กับสูตรLog(x+1)แต่มันใช้ไม่ได้กับฐานข้อมูลของฉันและฉันได้รับ NaNs อย่างต่อเนื่อง เช่นฉันได้รับข้อความเตือนนี้ (ฉันไม่ได้ใส่ฐานข้อมูลที่สมบูรณ์เพราะฉันคิดว่าหนึ่งในค่าลบของฉันก็เพียงพอที่จะแสดงตัวอย่าง):

> log(-1.27+1)
[1] NaN
Warning message:
In log(-1.27 + 1) : NaNs produced
> 

ขอบคุณล่วงหน้า

UPDATE:

นี่คือฮิสโตแกรมของข้อมูลของฉัน ฉันทำงานกับอนุกรมเวลาของการตรวจวัดสารเคมีในยุค palaeontological เช่นความแตกต่างระหว่างตัวแปรอย่าง Ca และ Zn นั้นใหญ่เกินไปจากนั้นฉันต้องการมาตรฐานข้อมูลบางประเภทนั่นคือเหตุผลที่ฉันกำลังทดสอบlog()ฟังก์ชั่น ป้อนคำอธิบายรูปภาพที่นี่

นี่คือข้อมูลดิบของฉัน


2
ลอการิทึมถูกกำหนดไว้สำหรับตัวเลขบวกเท่านั้นและโดยปกติจะใช้เป็นการแปลงเชิงสถิติในข้อมูลเชิงบวกเพื่อที่ตัวแบบจะรักษาความเป็นบวกนี้ไว้ การlog(x+1)เปลี่ยนแปลงจะถูกกำหนดไว้สำหรับx > -1เท่านั้นเนื่องจากx + 1จะเป็นค่าบวก เป็นการดีที่จะทราบเหตุผลของคุณที่ต้องการบันทึกการแปลงข้อมูลของคุณ
Matthew Drury

3
บอกเราเพิ่มเติมเกี่ยวกับข้อมูลรวมถึงช่วงค่าเฉลี่ยความถี่ของค่าลบศูนย์และค่าบวก อาจเป็นไปได้ว่าโมเดลเชิงเส้นทั่วไปที่มีลิงค์เชื่อมโยงนั้นเหมาะสมที่สุดสำหรับข้อมูลตราบใดที่มีเหตุผลที่จะคิดว่าการตอบสนองเฉลี่ยนั้นเป็นค่าบวก อาจเป็นได้ว่าคุณไม่ควรเปลี่ยนใจเลย
นิคค็อกซ์

6
ขอบคุณสำหรับการเพิ่มรายละเอียด สำหรับข้อมูลดังกล่าว0 มีความหมาย (ความเท่าเทียมกัน!) ที่ควรได้รับการเคารพ, เก็บรักษาไว้แน่นอน ด้วยเหตุผลนั้นและอื่น ๆ ฉันจะใช้รูทคิวบ์ ในทางปฏิบัติคุณจะต้องมีการเปลี่ยนแปลงsign(x) * (abs(x))^(1/3)รายละเอียดขึ้นอยู่กับไวยากรณ์ของซอฟต์แวร์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูทคิวบ์ดูตัวอย่างเช่นstata-journal.com/sjpdf.html?articlenum=st0223 (ดู esp. pp.152-3) เราใช้รูทคิวบ์เพื่อช่วยให้มองเห็นตัวแปรการตอบสนองที่สามารถเป็นบวกและลบในธรรมชาติ .com / nature / journal / v500 / n7464 / full / …
Nick Cox

8
ทำไมคุณไม่เปลี่ยนตัวแปรดั้งเดิมแทนที่จะเป็นความแตกต่าง?
whuber

4
คุณแก้ปัญหาทางคณิตศาสตร์ @ ข้อเสนอแนะของ whuber หรือรูทคิวบ์จะยังคงฉันคิดว่าจะง่ายต่อการทำงานโดยเฉพาะอย่างยิ่งถ้าค่าคงที่เป็นเชิงประจักษ์ล้วนหรือแตกต่างกันระหว่างตัวแปร กฎที่ดีสำหรับการเลือกการแปลงคือการใช้การแปลงที่จะทำงานกับข้อมูลที่คล้ายกันที่คุณสามารถจินตนาการได้ ดังนั้น "ผลงาน" สำหรับแต่จะล้มเหลวถ้าชุดต่อไปของคุณถูกล้อมรอบด้วย ..x > - 4 - 5log(x+4)x>45
นิคค็อกซ์

คำตอบ:


14

เนื่องจากลอการิทึมถูกกำหนดไว้สำหรับตัวเลขบวกเท่านั้นคุณจึงไม่สามารถใช้ลอการิทึมของค่าลบ อย่างไรก็ตามหากคุณต้องการได้รับการกระจายที่ดีขึ้นสำหรับข้อมูลของคุณคุณสามารถใช้การแปลงต่อไปนี้

สมมติว่าคุณมีข้อมูลเชิงลบที่เบ้:

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

จากนั้นคุณสามารถใช้การแปลงแรกเพื่อทำให้ข้อมูลอยู่ใน :(1,1)

z <- (x - min(x)) / (max(x) - min(x)) * 2 - 1
z <- z[-min(z)]
z <- z[-max(z)]
min(z); max(z)

และในที่สุดก็ใช้ค่าไฮเพอร์โบลิกแทนเจนต์ผกผัน:

t <- atanh(z)
plot(density(t))

ตอนนี้ข้อมูลของคุณดูเหมือนกระจายโดยทั่วไปประมาณ นี่เรียกอีกอย่างว่าการแปลงฟิชเชอร์


9
คุณแก้ปัญหาทางคณิตศาสตร์ได้ทันที แต่ฉันไม่คิดว่าผู้บริโภคที่น่าจะเป็นผลลัพธ์ทางสถิติจะคิดว่าเป็นเรื่องง่าย มาตราส่วนการตอบสนองและในการสร้างแบบจำลองคุณจะต้องคิดว่าโครงสร้างข้อผิดพลาดเหมาะสมหรือไม่ atanh[(xmin(x))/(max(x)min(x))]
นิคค็อกซ์

2
@NickCox คุณพูดถูก บางทีถ้า OP เพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับปัญหาของเขาเราสามารถหาทางเลือกอื่น!
stochazesthai

อาร์กิวเมนต์ภายในในความคิดเห็นแรกของฉันไม่ใช่สิ่งที่ถูกแปลง แต่วิญญาณของความคิดเห็นของฉันคือฉันคิดว่าไม่ได้รับผลกระทบ
นิคค็อกซ์

เรียน @stochazesthai ขอขอบคุณสำหรับคำอธิบายโดยละเอียด แต่ฉันไม่สามารถใช้รหัสของคุณกับข้อมูลของฉันได้ ฉันอัปเดตคำถามของฉันด้วยลิงก์ของข้อมูลดิบของฉันในตอนท้าย
ดาร์วินพีซี

คำสั่งz <- z[-max(z)]และz <- z[-min(z)]ย่อzลงอย่างไม่เหมาะสมเป็นค่าเดียว นอกจากนี้ยังมีฟังก์ชั่นทั่วไปatanh(((x - min(x)) / (max(x) - min(x))))ผลิตสำหรับต่ำสุดและสูงสุดค่าของInf x
Max Ghenis

-1

ในการแปลงให้เป็นมาตราส่วนการบันทึกก่อนอื่นให้ค้นหาบันทึกของจำนวนบวกจากนั้นคูณด้วยเครื่องหมายของมันรหัสต่อไปนี้ควรทำเช่นนั้น

transform_to_log_scale <- function(x){
    if(x==0){
        y <- 1
    } else {
        y <- (sign(x)) * (log(abs(x)))
    }
        y 
    }

จากตัวอย่างข้างต้นเราสามารถวางแผนการแจกแจงแบบเบ้ต่อไปนี้

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

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

หลังจากใช้ฟังก์ชั่นการแปลงดังนี้เราจะได้รับการแจกแจงที่ดู 'ปกติ' มากขึ้น

plot(density(sapply(x,FUN=transform_logs_scale)))

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


3
(1) ภาษาการเขียนโปรแกรมส่วนใหญ่ ( Rรวมอยู่) ใช้ฟังก์ชั่นsignum (ซึ่งส่งกลับ -1 สำหรับจำนวนลบ, 1 สำหรับตัวเลขบวกและ 0 สำหรับศูนย์) การใช้มันจะยิ่งแสดงออกและเร็วขึ้น (2) ข้อเสนอของคุณแย่สำหรับการวิเคราะห์ข้อมูลเช่นที่แสดงเพราะมันมีความไม่ต่อเนื่องที่ศูนย์!
whuber

ขอบคุณสำหรับ signum ฉันไม่รู้เกี่ยวกับมันสงสัยว่ามันถูกนำไปใช้อย่างไร
yosemite_k

3
มีหลายวิธี ในสถาปัตยกรรมตัวประมวลผลจำนวนมากมีการตั้งค่าบิตการลงชื่อหลังจากการดำเนินการหลายอย่างดังนั้นจึงสามารถใช้งานได้ ในการแทนค่าทศนิยมที่มีความแม่นยำสองเท่าของ IEEE สามารถหาสัญญาณได้โดยการตรวจสอบบิตเดียว (บวกกับการทดสอบแบบเร็วอื่นสำหรับศูนย์จริง) ในสถาปัตยกรรมแบบท่อที่มีการแยกย่อยการคาดการณ์ ฯลฯ มักจะมีประสิทธิภาพมากกว่าที่จะไม่แยกสาขาหากเป็นไปได้ซึ่งเป็นเหตุผลว่าทำไมการใช้signumเวอร์ชั่นในตัวอาจทำให้ได้ผลการคำนวณที่สำคัญ อนึ่งการตั้งค่าy <- 1เมื่อดูไม่มีเหตุผล - มันอาจทำให้การวิเคราะห์ทางสถิติผิดพลาดได้ x=0
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.