他の答えはすべて良いアプローチです。ただし、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
は非常に遅く、の100倍の時間がかかりapprox
ます。 かなり高速に実行しながら(レスより15倍高速)、よりもLowess
優れた結果を生成しますapprox
。
Loess
また、ポイント数が増えるとますます行き詰まり、50,000前後で使用できなくなります。
編集:追加の調査によるとloess
、特定のデータセットにより適していることが示されています。小さなデータセットを扱っている場合、またはパフォーマンスが考慮されていない場合は、両方の関数を試して結果を比較してください。