[ 簡単な説明 ] 回帰とは、収集されたデータから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 */ #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; } |