คำตอบอื่น ๆ เป็นแนวทางที่ดีทั้งหมด อย่างไรก็ตามมีตัวเลือกอื่น ๆ อีกสองสามอย่างใน R ที่ไม่ได้กล่าวถึงรวมถึงlowess
และapprox
ซึ่งอาจให้ประสิทธิภาพที่เหมาะสมกว่าหรือเร็วกว่า
ข้อดีแสดงให้เห็นได้ง่ายขึ้นด้วยชุดข้อมูลสำรอง:
sigmoid <- function(x)
{
y<-1/(1+exp(-.15*(x-100)))
return(y)
}
dat<-data.frame(x=rnorm(5000)*30+100)
dat$y<-as.numeric(as.logical(round(sigmoid(dat$x)+rnorm(5000)*.3,0)))
นี่คือข้อมูลที่ซ้อนทับกับเส้นโค้งซิกมอยด์ที่สร้างขึ้น:
ข้อมูลประเภทนี้เป็นเรื่องปกติเมื่อดูพฤติกรรมไบนารีในกลุ่มประชากร ตัวอย่างเช่นนี่อาจเป็นพล็อตว่าลูกค้าซื้อสินค้าหรือไม่ (เลขฐานสอง 1/0 บนแกน y) เทียบกับระยะเวลาที่พวกเขาใช้บนไซต์ (แกน x)
มีการใช้จุดจำนวนมากเพื่อแสดงให้เห็นถึงความแตกต่างด้านประสิทธิภาพของฟังก์ชันเหล่านี้ได้ดีขึ้น
Smooth
, spline
และsmooth.spline
ทั้งหมดพูดพล่อยๆผลิตในชุดข้อมูลเช่นนี้กับชุดของพารามิเตอร์ใด ๆ ฉันได้พยายามที่อาจจะเป็นเพราะแนวโน้มของการแมปไปยังทุกจุดซึ่งไม่ทำงานสำหรับข้อมูลที่มีเสียงดัง
loess
, lowess
และฟังก์ชั่นผลการผลิตทั้งหมดที่ใช้งานได้แม้จะเพิ่งสำหรับapprox
approx
นี่คือรหัสสำหรับแต่ละตัวที่ใช้พารามิเตอร์ที่ปรับให้เหมาะสมที่สุด:
loessFit <- loess(y~x, dat, span = 0.6)
loessFit <- data.frame(x=loessFit$x,y=loessFit$fitted)
loessFit <- loessFit[order(loessFit$x),]
approxFit <- approx(dat,n = 15)
lowessFit <-data.frame(lowess(dat,f = .6,iter=1))
และผลลัพธ์:
plot(dat,col='gray')
curve(sigmoid,0,200,add=TRUE,col='blue',)
lines(lowessFit,col='red')
lines(loessFit,col='green')
lines(approxFit,col='purple')
legend(150,.6,
legend=c("Sigmoid","Loess","Lowess",'Approx'),
lty=c(1,1),
lwd=c(2.5,2.5),col=c("blue","green","red","purple"))
อย่างที่คุณเห็นlowess
สร้างความลงตัวใกล้เคียงกับเส้นโค้งการสร้างต้นฉบับ Loess
อยู่ใกล้ แต่พบความเบี่ยงเบนแปลก ๆ ที่หางทั้งสองข้าง
แม้ว่าชุดข้อมูลของคุณจะแตกต่างกันมาก แต่ฉันพบว่าชุดข้อมูลอื่น ๆ ทำงานคล้ายกันโดยมีทั้งสองอย่างloess
และlowess
สามารถให้ผลลัพธ์ที่ดีได้ ความแตกต่างมีความสำคัญมากขึ้นเมื่อคุณดูเกณฑ์มาตรฐาน:
> microbenchmark::microbenchmark(loess(y~x, dat, span = 0.6),approx(dat,n = 20),lowess(dat,f = .6,iter=1),times=20)
Unit: milliseconds
expr min lq mean median uq max neval cld
loess(y ~ x, dat, span = 0.6) 153.034810 154.450750 156.794257 156.004357 159.23183 163.117746 20 c
approx(dat, n = 20) 1.297685 1.346773 1.689133 1.441823 1.86018 4.281735 20 a
lowess(dat, f = 0.6, iter = 1) 9.637583 10.085613 11.270911 11.350722 12.33046 12.495343 20 b
Loess
ช้ามากการ 100x approx
ตราบเท่าที่ Lowess
ให้ผลลัพธ์ที่ดีกว่าapprox
ในขณะที่ยังทำงานได้ค่อนข้างเร็ว (เร็วกว่า loess 15 เท่า)
Loess
ยังจมลงเรื่อย ๆ เมื่อจำนวนคะแนนเพิ่มขึ้นและใช้ไม่ได้ประมาณ 50,000
แก้ไข: การวิจัยเพิ่มเติมแสดงให้เห็นว่าloess
เหมาะกับชุดข้อมูลบางชุด หากคุณกำลังจัดการกับชุดข้อมูลขนาดเล็กหรือประสิทธิภาพไม่ได้รับการพิจารณาให้ลองใช้ฟังก์ชันทั้งสองและเปรียบเทียบผลลัพธ์