回帰直線を推定するプログラム

このページでは「回帰直線を推定するプログラム」を紹介しています。

回帰直線について

回帰直線は以下の式で表現されます。

回帰直線推定式

コード

回帰直線を推定するプログラムのコードです。言語はJavaを使用しています。 統計の知識に関しては、『多変量解析法入門 (ライブラリ新数学大系) 』(永田靖)の第4章 単回帰分析を参考にしています。

計算クラス(Calculator.java)

計算を行うクラスです。

import java.util.ArrayList;
import java.util.List;

/**
 * 計算クラス
 */
public class Calculator {

	/**
	 * 切片を計算する
	 * @param itemXi 項目リスト(Xi)
	 * @param itemYi 項目リスト(Yi)
	 * @return 結果
	 */
	public Double section(final List<Double> itemsXi, final List<Double> itemsYi) {
		Double xbar = average(itemsXi);
		Double ybar = average(itemsYi);
		Double bata1 = regressionCoefficient(itemsXi, itemsYi);
		return ybar - (bata1 * xbar);
	}

	/**
	 * 回帰係数を計算する
	 * @param itemXi 項目リスト(Xi)
	 * @param itemYi 項目リスト(Yi)
	 * @return 結果
	 */
	public Double regressionCoefficient(final List<Double> itemsXi, final List<Double> itemsYi) {
		Double sxy = deviationSumOfProduct(itemsXi, itemsYi);
		Double sxx = sumOfSquares(itemsXi);
		return sxy / sxx;
	}

	/**
	 * 偏差積和を計算する
	 * @param itemXi 項目リスト(Xi)
	 * @param itemYi 項目リスト(Yi)
	 * @return 結果
	 */
	public Double deviationSumOfProduct(final List<Double> itemsXi, final List<Double> itemsYi) {
		List<Double> itemsXiYi = new ArrayList<>();
		int n = itemsXi.size();

		for (int i = 0; i < n; i++) {
			itemsXiYi.add(itemsXi.get(i) * itemsYi.get(i));
		}
		Double xiyiSum = sum(itemsXiYi);
		Double xiSum = sum(itemsXi);
		Double yiSum = sum(itemsYi);
		return xiyiSum - ((xiSum * yiSum) / n);
	}

	/**
	 * 平方和を計算する
	 * @param items 項目リスト
	 * @return 結果
	 */
	public Double sumOfSquares(final List<Double> items) {
		Double xbar = average(items);
		List<Double> squares = new ArrayList<>();

		for (Double item : items) {
			Double sqare = (item - xbar) * (item - xbar);
			squares.add(sqare);
		}
		return sum(squares);
	}

	/**
	 * 平均値を計算する
	 * @param items 項目リスト
	 * @return 結果
	 */
	public Double average(final List<Double> items) {
		return sum(items) / items.size();
	}

	/**
	 * 総和を計算する
	 * @param items 項目リスト
	 * @return 結果
	 */
	public Double sum(final List<Double> items) {
		Double result = 0.0;

		for (Double item : items) {
			result += item;
		}
		return result;
	}
}

動作確認用クラス

動作確認用のクラスです。

import java.util.ArrayList;
import java.util.List;

/**
 * サンプルのテスト用クラス
 */
public class SampleTest {

	private static double[] xi = {
		4.5, 4.2, 4.0, 4.2, 4.3, 3.7, 3.9, 3.7, 3.6, 4.8,
		4.7, 3.8, 4.0, 3.7, 4.0, 4.4, 3.8, 4.1, 5.0, 3.4};

	private static double[] yi = {
		14.2, 15.2, 16.9, 15.5, 15.7, 18.0, 17.1, 17.5, 18.1, 13.6,
		13.8, 17.0, 16.9, 18.2, 16.3, 14.7, 17.4, 15.4, 12.9, 18.7};

	public static void main(String[] args) {
		List<Double> itemsXi = prepareTestData(xi);
		List<Double> itemsYi = prepareTestData(yi);
		Calculator calc = new Calculator();
		Double beta0 = calc.section(itemsXi, itemsYi);
		Double bata1 = calc.regressionCoefficient(itemsXi, itemsYi);
		System.out.println("回帰係数の推定(β1)\t:" + bata1);
		System.out.println("切片の推定(β0)\t:" + beta0);
		String mark = " + ";

		if (bata1 < 0) {
			mark = " ";
		}
		System.out.println("回帰直線の推定(μ)\t:μ = " + beta0 + mark + bata1 + "x");
	}

	private static List<Double> prepareTestData(double[] sample) {
		List<Double> items = new ArrayList<>();

		for (double data : sample) {
			items.add((double) data);
		}
		return items;
	}
}

実行結果

実行すると以下のように表示されます。

回帰係数の推定(β1)	:-3.906050029086572
切片の推定(β0)	:32.13074461896407
回帰直線の推定(μ)	:μ = 32.13074461896407 -3.906050029086572x

戻る

Copyright (C) 2016 計算プログラムのコード. All Rights Reserved. Loarding…