【Rによるデータサイエンス】非線形回帰分析 〜 平滑化回帰

■平滑化回帰
人口データを作成する。

> x1<-seq(-10,10,0.1)
> y1=50*sin(x1)+x1^2+10*rnorm(length(x1),0,1)
> plot(x1,y1)

データy1を目的変数、x1を説明変数とした非線形回帰モデルを考える。

多項式回帰モデル
多項式回帰モデルで近似できないかを考える。
2次多項式、5次多項式、8次多項式モデルを考えてみる。
線形回帰分析を行うには関数lmを使用する。poly(x1,2)はx1の2乗を表す。
線形回帰分析による予想値は、モデル当てはめ値を取り出す fitted()を使用する。

> lmp2<-fitted(lm(y1~poly(x1,2)))
> lines(x1,lmp2,lty=4,col=4,lwd=2)
> lmp5<-fitted(lm(y1~poly(x1,5)))
> lines(x1,lmp5,lty=2,col=2,lwd=2)
> lmp8<-fitted(lm(y1~poly(x1,8)))
> lines(x1,lmp8,lty=2,col=6,lwd=2)
> legend(locator(1),c("poly(x1,2)","poly(x1,5)","poly(x1,8)"),col=c(4,2,1),lty=c(4,2,1),lwd=2)
> 

見ただけで、多項式回帰モデルは精度が悪いことが分かる。
なお、lines関数の引数の意味は次のとおりである。

lty:線の種類を指定 (lty=1:直線、lty=2:点線、lty=3:一点鎖線、...)
col:色を指定(col=2 または color="red":赤、col=3:緑、col=4:青、...)
lwd:線の太さを指定

じゃあ、どうしようか。困った。
このように複雑に変化するデータの回帰に、平滑化回帰を使用してみる。

◎平滑化回帰

par(mfrow=c(2,2),oma=c(2,2,2,2),mar=c(2,2,2,2))
plot(x1,y1,main="smooth.spline")
lines(smooth.spline(x1,y1),col=2,lwd=2)
plot(x1,y1,main="ksmooth")
lines(ksmooth(x1,y1),col=4,lwd=2)
plot(x1,y1,main="supsmu")
lines(supsmu(x1,y1),col=3,lwd=2)
plot(x1,y1,main="lowess")
lines(lowess(x1,y1,f=0.1),col=5,lwd=2)

めちゃくちゃ精度よい!
ただ、理論については一切触れられていないので、ここでも割愛。別の本で勉強しないといけない。