R で最小二乗法の計算をしてみる
近似直線といえば最小二乗法なので、崎間先輩のとこのコードを参考に最小二乗法をサクッと実装してみた。
#最小二乗法を出力する関数 lsm<-function(x,y){ n<-length(x) sum_xy<-sum(x*y) sum_x<-sum(x) sum_x2<-sum(x^2) sum_y<-sum(y) a<-(n*sum_xy-sum_x*sum_y)/(n*sum_x2-(sum_x^2)) b<-(sum_x2*sum_y-sum_xy*sum_x)/(n*sum_x2-(sum_x^2)) return(c(a,b)) } #つかいかた x<-c(0.0,1.0,2.1,2.8,4.2,4.9) y<-c(0.0,0.8,1.9,3.2,4.1,4.8) #仮のデータセット (out<-lsm(x,y)) #傾きと切片 plot(x,y,xlim=c(0,5),ylim=c(0,5)) #データセットをプロット lines(0:5,out[1]*(0:5)+out[2],col="blue",lwd=2) #近似曲線を引く #↓結果 [1] 1.00517241 -0.04626437
R のビルドイン関数 lm
作り終わってから気づいたけど、これでもできる。
Intercept が y 切片、x が傾きを表している。
>lm(y~x) Call: lm(formula = y ~ x) Coefficients: (Intercept) x -0.04626 1.00517
ちなみに、summary(lm(y~x)) にするとさらに詳しい情報が見れる。