ページ

2016年7月9日土曜日

【R】 非線型回帰



今回は、Rで非線形回帰分析をする方法について解説する。興味深いことに、特別なライブラリをインストールすることなく、基本機能だけで実現できてしまう。



データはある都市で小学校の児童数と学級数について、学校ごとにまとめたもの。図にあるように、切片がある緩やかな曲線の上に載っているように見える。曲線なので、対数変換して直線に直してみようと思うかもしれないが、切片があるのでそれはできない。

filename <- "y1y2.csv"
school <- read.table(filename,header=T,sep=",")
sch0 <- school[school[,2]<800,2:3]

y <- sch0[,2]
x <- sch0[,1]

res <- nls(y ~ a + b * x ^ c, start=c(a=0,b=1,c=1))
summary(res)
sch1 <- cbind(sch0,predict(res))
Rソースコードは上のとおり。nlsという関数を使う。パラメータをa,b,cとして、繰り返し計算のための初期値を指定している。
Parameters:
  Estimate Std. Error t value Pr(>|t|)    
a  2.67509    0.39540   6.765 6.74e-09 ***
b  0.05378    0.01877   2.865  0.00576 ** 
c  0.90648    0.05267  17.210  < 2e-16 ***

結果をsummaryで表示させると上のようになる。t値はいずれも高く、まずまずの推定精度だと言える。予測はpredictで行う。その結果をもとデータとcbindで併せている。これをplotで表示させたものが冒頭の図となる。

非線形回帰もお手軽に計算できる時代になったなあ。