ฉันจะประมาณความหนาแน่นของพารามิเตอร์ที่ไม่ได้ศูนย์ใน R ได้อย่างไร?


10

ฉันมีชุดข้อมูลที่มีศูนย์จำนวนมากที่มีลักษณะดังนี้:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)

ฉันต้องการวาดเส้นสำหรับความหนาแน่นของมัน แต่density()ฟังก์ชั่นใช้หน้าต่างย้ายที่คำนวณค่าลบของ x

lines(density(x), col = 'grey')

มีdensity(... from, to)ข้อโต้แย้ง แต่สิ่งเหล่านี้ดูเหมือนจะตัดทอนการคำนวณเท่านั้นไม่เปลี่ยนหน้าต่างเพื่อให้ความหนาแน่นที่ 0 สอดคล้องกับข้อมูลที่สามารถเห็นได้โดยพล็อตต่อไปนี้:

lines(density(x, from = 0), col = 'black')

(หากการแก้ไขมีการเปลี่ยนแปลงฉันคาดว่าเส้นสีดำจะมีความหนาแน่นสูงกว่าที่ 0 กว่าเส้นสีเทา)

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

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

คำตอบ:


14

ความหนาแน่นไม่มีที่สิ้นสุดที่ศูนย์เพราะมันมีเข็มที่ไม่ต่อเนื่อง คุณจำเป็นต้องประเมินค่าสไปค์โดยใช้สัดส่วนของศูนย์แล้วประเมินส่วนที่เป็นบวกของความหนาแน่นสมมติว่ามันเป็นไปอย่างราบรื่น KDE จะทำให้เกิดปัญหาทางด้านซ้ายมือเพราะจะทำให้น้ำหนักบางอย่างเกี่ยวกับค่าลบ วิธีการหนึ่งที่มีประโยชน์คือเปลี่ยนเป็นบันทึกประเมินความหนาแน่นโดยใช้ KDE แล้วแปลงกลับ ดูไม้กายสิทธิ์ Marron & Ruppert (JASA 1991)สำหรับการอ้างอิง

ฟังก์ชั่น R ต่อไปนี้จะทำการแปลงความหนาแน่น:

logdensity <- function (x, bw = "SJ") 
{
    y <- log(x)
    g <- density(y, bw = bw, n = 1001)
    xgrid <- exp(g$x)
    g$y <- c(0, g$y/xgrid)
    g$x <- c(0, xgrid)
    return(g)
}

จากนั้นต่อไปนี้จะให้พล็อตที่คุณต้องการ:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)
fit <- logdensity(x[x>0]) # Only take density of positive part
lines(fit$x,fit$y*mean(x>0),col="red") # Scale density by proportion positive
abline(v=0,col="blue") # Add spike at zero.

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


ขอขอบคุณสำหรับคำตอบของคุณ แต่ฉันสับสน - คุณพูดว่า 'ประเมินค่าขัดขวางโดยใช้สัดส่วนของศูนย์' แต่เขียนมันโดยไม่มีขอบเขต เหล็กแหลมมีความสูงไม่ต่อเนื่องหรือไม่ จำกัด ถ้าแยกเป็นหรือไม่? P(X=0)
Abe

นี่คือส่วนผสมของการกระจายแบบไม่ต่อเนื่องและการกระจายอย่างต่อเนื่อง เมื่อพล็อตเป็นความหนาแน่นเข็มจะไม่มีที่สิ้นสุด (จริงๆแล้วเป็นฟังก์ชัน Dirac delta) บางครั้งผู้คนพล็อตส่วนที่ไม่ต่อเนื่องกันเป็นฟังก์ชันมวลความน่าจะเป็น (ดังนั้นสไปค์มีความสูง ) และส่วนต่อเนื่องเป็นฟังก์ชันความหนาแน่น นั่นอาจทำให้มองเห็นได้ดีขึ้น แต่มันเกี่ยวข้องกับสเกลสองแบบที่แตกต่างกัน P(X=0)
Rob Hyndman

สิ่งนี้กำลังมีประโยชน์ fyi: ปรากฏว่าแม้ว่า bw = "SJ" ส่งผลต่อความหนาแน่นในพื้นที่ที่ไม่ได้เปลี่ยนรูปแบบ แต่ความหนาแน่นของการบันทึกจะเหมือนกันโดยใช้ "SJ" และค่าเริ่มต้น "nrd0" ... ฉันกำลังจะอ่านข้อมูลอ้างอิง SJ: "Sheather and โจนส์ (1991) วิธีการเลือกแบนด์วิดท์บนข้อมูลที่เชื่อถือได้สำหรับการประมาณความหนาแน่นของเคอร์เนล " jstor.org/stable/2345597
Abe

4

ฉันเห็นด้วยกับ Rob Hyndman ว่าคุณต้องจัดการกับศูนย์แยกกัน มีวิธีการไม่กี่วิธีในการจัดการกับการประมาณความหนาแน่นของเคอร์เนลของตัวแปรด้วยการสนับสนุนที่มีขอบเขตรวมถึง 'การสะท้อน', 'rernormalisation' และ 'การรวมเชิงเส้น' เหล่านี้ไม่ปรากฏว่ามีการดำเนินการใน R densityฟังก์ชั่น แต่มีอยู่ในเบนน์ Jann ของkdensแพคเกจสำหรับ Stata


1

ตัวเลือกอื่นเมื่อคุณมีข้อมูลที่มีขอบเขตล่างแบบลอจิคัล (เช่น 0 แต่อาจเป็นค่าอื่น ๆ ) ที่คุณรู้ว่าข้อมูลจะไม่ลงไปด้านล่างและการประมาณความหนาแน่นเคอร์เนลปกติจะวางค่าด้านล่างที่ถูกผูกไว้ หรือทั้งสองอย่าง) คือการใช้การประมาณค่าสายบันทึก แพ็คเกจ logspline สำหรับ R ใช้สิ่งเหล่านี้และฟังก์ชันมีอาร์กิวเมนต์สำหรับระบุขอบเขตดังนั้นการประมาณจะไปที่ขอบเขต แต่ไม่เกินและยังคงขยายเป็น 1

นอกจากนี้ยังมีวิธีการ ( oldlogsplineฟังก์ชั่น) ที่จะคำนึงถึงการตรวจสอบช่วงเวลาของบัญชีดังนั้นหาก 0 นั้นไม่ถูกต้อง 0 แต่จะถูกปัดเศษเพื่อให้คุณรู้ว่าพวกเขาเป็นตัวแทนค่าระหว่าง 0 และจำนวนอื่น ๆ (เช่นขีด จำกัด การตรวจจับ) สามารถให้ข้อมูลนั้นกับฟังก์ชั่นกระชับ

ถ้า 0 พิเศษคือ 0 ของจริง (ไม่กลม) การประมาณค่าสไปค์หรือมวลพอยต์เป็นวิธีที่ดีกว่า แต่สามารถรวมกับการประมาณค่าแบบล็อกไลน์ได้


0

คุณอาจลองลดแบนด์วิดท์ (ใช้เส้นสีน้ำเงินadjust=0.5) ป้อนคำอธิบายรูปภาพที่นี่

แต่ KDE อาจไม่ใช่วิธีที่ดีที่สุดในการจัดการกับข้อมูลดังกล่าว


มีวิธีอื่นอีกไหมที่คุณอยากจะแนะนำ?
Abe

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