อีกทางเลือกหนึ่งคือวิธีการของ Kooperberg และเพื่อนร่วมงานโดยใช้การประเมินความหนาแน่นโดยใช้เส้นโค้งเพื่อประมาณความหนาแน่นของบันทึกข้อมูล ฉันจะแสดงตัวอย่างโดยใช้ข้อมูลจากคำตอบของ @ whuber ซึ่งจะช่วยให้การเปรียบเทียบของวิธีการ
set.seed(17)
x <- rexp(1000)
คุณจะต้องlogsplineแพคเกจติดตั้งสำหรับการนี้ ติดตั้งหากไม่ได้:
install.packages("logspline")
โหลดแพ็คเกจและประเมินความหนาแน่นโดยใช้logspline()
ฟังก์ชั่น:
require("logspline")
m <- logspline(x)
ในต่อไปนี้ฉันคิดว่าวัตถุd
จากคำตอบของ @ whuber มีอยู่ในพื้นที่ทำงาน
plot(d, type="n", main="Default, truncated, and logspline densities",
xlim=c(-1, 5), ylim = c(0, 1))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
plot(m, add = TRUE, col = "red", lwd = 3, xlim = c(-0.001, max(x)))
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
พล็อตที่ได้จะแสดงด้านล่างพร้อมกับความหนาแน่นของสายการบินที่แสดงโดยเส้นสีแดง
นอกจากนี้การสนับสนุนสำหรับความหนาแน่นสามารถระบุได้ผ่านการขัดแย้งและlbound
ubound
หากเราต้องการสมมติว่าความหนาแน่นเป็น 0 ทางซ้ายของ 0 และมีความไม่ต่อเนื่องที่ 0 เราสามารถใช้lbound = 0
ในการเรียกไปlogspline()
เช่น
m2 <- logspline(x, lbound = 0)
ให้การประมาณค่าความหนาแน่นต่อไปนี้ (แสดงไว้ที่นี่พร้อมกับสายบันทึกดั้งเดิมm
พอดีเนื่องจากตัวเลขก่อนหน้านี้ไม่ว่าง)
plot.new()
plot.window(xlim = c(-1, max(x)), ylim = c(0, 1.2))
title(main = "Logspline densities with & without a lower bound",
ylab = "Density", xlab = "x")
plot(m, col = "red", xlim = c(0, max(x)), lwd = 3, add = TRUE)
plot(m2, col = "blue", xlim = c(0, max(x)), lwd = 2, add = TRUE)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
axis(1)
axis(2)
box()
พล็อตที่เกิดจะแสดงด้านล่าง
x
x=0x