hiratake55 の作業メモ

R, Javascript, Python, Linux and Hadoop

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)) にするとさらに詳しい情報が見れる。