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