p=2(説明変数が2つ)の場合の重回帰式を計算するプログラム

このページでは「p=2(説明変数が2つ)の場合の重回帰式を計算するプログラム」を紹介しています。

重回帰式(p=2)について

p=2(説明変数が2つ)の場合の重回帰式は以下の式で表現されます。

p=2(説明変数が2つ)の場合の重回帰式

コード

p=2(説明変数が2つ)の場合の重回帰式を計算するプログラムのコードです。言語はJavaを使用しています。 統計の知識に関しては、『多変量解析法入門 (ライブラリ新数学大系) 』(永田靖)の第5章 重回帰分析を参考にしています。

計算クラス(Calculator.java)

計算を行うクラスです。

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

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

	/**
	 * 説明変数が2つの場合の切片を計算する
	 * @param itemXi 項目リスト(Xi)
	 * @param itemYi 項目リスト(Yi)
	 * @return 結果
	 */
	public Double sectionForExpVar2(
			final List<Double> itemsXi1, final List<Double> itemsXi2, final List<Double> itemsYi) {
		Double x1bar = average(itemsXi1);
		Double x2bar = average(itemsXi2);
		Double ybar = average(itemsYi);
		List<Double> batas = partialRegressionCoefficientsForExpVar2(itemsXi1, itemsXi2, itemsYi);
		return ybar - (batas.get(0) * x1bar) - (batas.get(1) * x2bar);
	}

	/**
	 * 説明変数が2つの場合の偏回帰係数を計算する
	 * @param itemsXi1 項目リスト(Xi1)
	 * @param itemsXi2 項目リスト(Xi2)
	 * @param itemsYi 項目リスト(Yi)
	 * @return 結果
	 */
	public List<Double> partialRegressionCoefficientsForExpVar2(
			final List<Double> itemsXi1, final List<Double> itemsXi2, final List<Double> itemsYi) {
		Double s11 = sumOfSquares(itemsXi1);
		Double s22 = sumOfSquares(itemsXi2);
		Double s1y = deviationSumOfProduct(itemsXi1, itemsYi);
		Double s2y = deviationSumOfProduct(itemsXi2, itemsYi);
		Double s12 = deviationSumOfProduct(itemsXi1, itemsXi2);
		Double bata1 = (1 / ((s11*s22) - (s12*s12))) * ((s22*s1y) - (s12*s2y));
		Double bata2 = (1 / ((s11*s22) - (s12*s12))) * ((-1*s12*s1y) + (s11*s2y));
		List<Double> result = new ArrayList<>();
		result.add(bata1);
		result.add(bata2);
		return result;
	}

	/**
	 * 偏差積和を計算する
	 * @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[] xi1 = {
		51, 38, 57, 51, 53, 77, 63, 69, 72, 73};

	private static double[] xi2 = {
		16, 4, 16, 11, 4, 22, 5, 5, 2, 1};

	private static double[] yi = {
		3.0, 3.2, 3.3, 3.9, 4.4, 4.5, 4.5, 5.4, 5.4, 6.0};

	public static void main(String[] args) {
		List<Double> itemsXi1 = prepareTestData(xi1);
		List<Double> itemsXi2 = prepareTestData(xi2);
		List<Double> itemsYi = prepareTestData(yi);
		Calculator calc = new Calculator();
		Double beta0 = calc.sectionForExpVar2(itemsXi1, itemsXi2, itemsYi);
		List<Double> batas = calc.partialRegressionCoefficientsForExpVar2(itemsXi1, itemsXi2, itemsYi);
		Double beta1 = batas.get(0);
		Double beta2 = batas.get(1);
		System.out.println("切片(β0)\t\t:" + beta0);
		System.out.println("偏回帰係数(β1)\t:" + beta1);
		System.out.println("偏回帰係数(β2)\t:" + beta2);
		String mark1 = " + ";
		String mark2 = " + ";

		if (beta1 < 0) {
			mark1 = " ";
		}
		if (beta2 < 0) {
			mark2 = " ";
		}
		System.out.println("重回帰式(p=2)\t\t:y = " + beta0 + mark1 + beta1 + "x1" + mark2 + beta2 + "x2");
	}

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

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

実行結果

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

切片(β0)		:1.020129547203318
偏回帰係数(β1)	:0.06680476622865743
偏回帰係数(β2)	:-0.0808299334202589
重回帰式(p=2)		:y = 1.020129547203318 + 0.06680476622865743x1 -0.0808299334202589x2

戻る

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