回帰直線の傾きを求めるExcelのSLOPE関数をJavaで作成してみる。
public class Main {
public static void main(String[] args) throws Exception {
// y値のみで、かつ、int型
int y[] = new int[]{70,80,30,40,50,20};
slope(y);
// x,y値で、かつ、float型
float[][] xy = { {2.5F,10.3F}
, {3.0F,24.3F}
, {3.2F,30.5F}
, {5.0F,42.5F}
, {6.1F,53.4F}
, {8.9F,48.8F}
};
slope(xy);
}
// 回帰直線の傾きを算出(int型 y値のみ渡す)
static float slope(int val[]) {
float[][] f = new float[val.length][2];
int i = 0;
for(int v : val) {
f[i][0] = (float)i;
f[i][1] = (float)v;
i++;
}
return slope(f);
}
// 回帰直線の傾きを算出(float型 x, y値を渡す)
static float slope(float[][] val) {
float sumX = 0;
float sumY = 0;
float sumXX = 0;
float sumXY = 0;
float n = val.length;
for(int i = 0; i < val.length; i++){
float x = (float)val[i][0];
float y = (float)val[i][1];
sumX += x;
sumY += y;
sumXX += x*x;
sumXY += x*y;
}
System.out.println("a : " + (float) (n*sumXY-sumX*sumY) / (float) (n*sumXX-sumX*sumX));
System.out.println("b : " + (float) (sumXX*sumY - sumXY*sumX) / (float) (n*sumXX - sumX*sumX));
return (float) (n*sumXY-sumX*sumY) / (float) (n*sumXX-sumX*sumX);
}
}