【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)
めちゃくちゃ精度よい!
ただ、理論については一切触れられていないので、ここでも割愛。別の本で勉強しないといけない。