다른 대답은 모두 좋은 접근 방식입니다. 그러나, 몇 가지 다른 포함, 언급되지 않은 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)))
다음은 그것을 생성 한 시그 모이 드 곡선으로 겹쳐진 데이터입니다.

이러한 종류의 데이터는 모집단 간의 이진 행동을 볼 때 일반적입니다. 예를 들어, 고객이 구매했는지 여부 (y 축의 이진 1/0)와 사이트에서 보낸 시간 (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매우 느리며 approx. 여전히 상당히 빠르게 (황토보다 15 배 빠름) 실행하면서 Lowess보다 나은 결과를 생성합니다 approx.
Loess 또한 포인트 수가 증가함에 따라 점점 줄어들어 약 50,000 점에서 사용할 수 없게됩니다.
편집 : 추가 연구에 따르면 loess특정 데이터 세트에 더 적합합니다. 작은 데이터 세트를 다루거나 성능이 고려되지 않는 경우 두 기능을 모두 시도하고 결과를 비교하십시오.