回帰ライブラリ



[ 簡単な説明 ]

回帰とは、収集されたデータから2変数間の関係を導出することです。
ここでは、相関係数を求めるルーチンと1次の回帰方程式を求めるルーチンを準備しました。

回帰方程式は最小2乗法で求めていますが、「補間」ライブラリの最小2乗近似法と異なるのは、信頼区間を同時に計算する点です。

関数名 関数の機能 機能説明 呼び出し例
corr( ) 相関係数 x[ ]、 y[ ] の共分散、相関係数を求める。
xbar、 ybar は平均値。
corr(x, y, n, xbar, ybar, &uxy, &r0);
sreg( ) 単回帰分析 x[ ]、 y[ ]の定数項 a、 回帰係数 b、
回帰誤差 dxy、 分散 va、 vb
a と b の信頼限界 al、au、bl、buを求める。
sx は x[ ]の偏差平方和、g は信頼係数。
sreg(x, y, n, sx, g, &a, &b, &dyx,
&va, &vb, &al, &au, &bl, &bu);

プログラム・ソース("corr.c")           top (トップに戻る)
/*		corr.c				*/
#include <stdio.h>
#include "sslib.h"

/* correlation coefficient (相関係数) */

int corr(double x[], double y[], int n, double xbar, double ybar,
	double *uxy, double *r0)
{
	int i;
	double w1, w2, w3, wx, wy;

	if(n < 2)	return 999;
	w1 = w2 = w3 = 0.0;
	n -= 1;
	for(i = 0; i <= n; i++)
	{
		wx = x[i] - xbar;
		wy = y[i] - ybar;
		w1 += (wx * wy);
		w2 += (wx * wx);
		w3 += (wy * wy);
	}
	*uxy = w1 / n;
	*r0 = w1 / sqrt(w2 * w3);
	return 0;
}

/* simple regression (単回帰分析) */

int sreg(double x[], double y[], int n, double sx, double g,
	double *a, double *b, double *dyx, double *va, double *vb, double *al,
	double *au, double *bl, double *bu)
{
	int nu, i;
	double c[2];
	double fn, fnu, qt, syx, xx, wx, yc, dy, t;
	double wa, wb, wdyx, wva, wvb, wat, wbt;

	if(n < 3 || g <= 0.0 || g >= 1.0)	return 999;
	nu = n - 2;
	fn = n;
	fnu = nu;
	qt = 1.0 - g;
	syx = xx = 0.0;

	lstsq(x, y, n, 1, c);

	wa = c[0];
	wb = c[1];
	for(i = 0; i < n; i++)
	{
		wx = x[i];
		yc = wa + wb * wx;
		dy = y[i] - yc;
		syx += (dy * dy);
		xx += (wx * wx);
	}
	wdyx = syx / fnu;
	wva = xx * wdyx / (fn * sx);
	wvb = wdyx / sx;

	t = pt(qt, nu);

	wat = t * sqrt(wva);
	wbt = t * sqrt(wvb);
	*al = wa - wat;
	*au = wa + wat;
	*bl = wb - wbt;
	*bu = wb + wbt;
	*a = wa;
	*b = wb;
	*dyx = wdyx;
	*va = wva;
	*vb = wvb;
	return 0;
}