अन्य उत्तर सभी अच्छे दृष्टिकोण हैं। हालांकि, आर में कुछ अन्य विकल्प हैं , जिनका उल्लेख नहीं किया गया है, जिनमें शामिल हैं 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)))
यहाँ सिग्मॉइड वक्र के साथ डेटा ओवरलेड है जो इसे उत्पन्न करता है:
आबादी के बीच द्विआधारी व्यवहार को देखते हुए इस तरह का डेटा आम है। उदाहरण के लिए, यह ग्राहक द्वारा साइट पर खर्च किए गए समय (x- अक्ष) की राशि के अनुसार कुछ खरीदा (या एक द्विआधारी y- अक्ष पर 1) हो सकता है।
इन कार्यों के प्रदर्शन अंतर को बेहतर ढंग से प्रदर्शित करने के लिए बड़ी संख्या में बिंदुओं का उपयोग किया जाता है।
Smooth
, spline
औरsmooth.spline
सभी इस तरह के मापदंडों के किसी भी सेट के साथ एक डेटासेट पर gibberish का उत्पादन करते हैं, शायद मैंने हर बिंदु पर मैप करने की उनकी प्रवृत्ति के कारण, जो शोर डेटा के लिए काम नहीं करता है।
हालांकि 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
, जबकि अभी भी काफी तेजी से चल रहा है (15x तेजी से कम)।
Loess
50,000 की संख्या के आसपास अनुपयोगी होने के कारण अंकों की संख्या बढ़ने के साथ-साथ तेजी भी बढ़ती जा रही है।
EDIT: अतिरिक्त शोध से पता चलता है कि loess
कुछ डेटासेट के लिए बेहतर फिट बैठता है। यदि आप एक छोटे डेटासेट के साथ काम कर रहे हैं या प्रदर्शन एक विचार नहीं है, तो दोनों कार्यों का प्रयास करें और परिणामों की तुलना करें।