|
[ 簡単な説明 ] 分散分析とは、データのバラツキの原因を解析する手法です。 データのバラツキが正規分布をとるという仮定のもと、バラツキの原因と推定される因子が1つの場合、2つの場合、3つの場合、...でそれぞれ分析法として1元配置、2元配置、3元配置、...という方法を使用します。 本ライブラリでは、1元配置と繰返しのない2元配置(2因子が独立している場合)を準備しています。 (ちなみに繰返しのある2元配置は、2因子相互間の相乗作用あるいは相殺作用がある場合の分析法です。) 1元配置は、バラツキの因子が1種類(例えば、作業者)の場合に適用します。計算法の詳細は省略しますが、計算結果で得た統計量 Fo が危険率に対するF分布のパーセント点 f より大きければ、因子の中に有意差があると判断されます。(例えば、品質が作業者により異なる等) 2元配置も同様に、2種類の因子(例えば、作業者と工作機械)に関して得られた統計量 Fo と危険率に対するF分布のパーセント点 f より、各因子の中に有意差があるかどうかを判定します。 |
| 関数名 | 関数の機能 | 引数説明 | 呼び出し例 |
| aov1( ) | 1元配置 |
|
int aov1(x, n, l, m, al, &sa, &se, &st, &nuamp;a, &nue, &nut, &va, &ve, &f0, &f); |
| aov2( ) | 2元配置 |
| int aov2(x, l, m, n, al, &sa, &sb, &se, &st, &nua, &nub, &nue, &nut, &va, &vb, &ve, &f0a, &f0b, &fa, &fb); |
/* vari.c */
#include <stdio.h>
#include <stdlib.h>
#include "sslib.h"
/* analysis of variance (one-way) */
int aov1(double x[], int n[], int l, int m, double al, double *sa, double *se,
double *st, int *nua, int *nue, int *nut, double *va, double *ve,
double *f0, double *f)
{
int i, j, k, t, it, in;
double xt, xi, xtb, w;
double *row;
if(l < 1 || m < 1 || al <= 0.0 || al >= 1.0) return 999;
row = (double *)malloc(m * sizeof(double));
if(row == NULL)
{
fprintf(stderr, "Error : Out of memory in aov1()\n");
return -1;
}
it = 0;
xt = 0.0;
for(i = 0; i < m; i++)
{
k = i * l;
xi = 0.0;
in = n[i];
if(in < 1 || in > l) return 999;
it += in;
for(j = 0; j < in; j++) xi += x[k + j];
row[i] = xi / in;
xt += row[i];
}
xtb = xt / m;
*se = *st = 0.0;
for(i = 0; i < m; i++)
{
k = i * l;
in = n[i];
for(j = 0; j < in; j++)
{
t = k + j;
w = x[t] - row[i];
*se += (w * w);
w = x[t] - xtb;
*st += (w * w);
}
}
*sa = *st - *se;
*nua = m - 1;
*nut = it - 1;
*nue = *nut - *nua;
*va = *sa / *nua;
*ve = *se / *nue;
*f0 = *va / *ve;
*f = pf(al, *nua, *nue);
free(row);
return 0;
}
/* analysis of variance (two-way) */
int aov2(double x[], int l, int m, int n, double al, double *sa, double *sb,
double *se, double *st, int *nua, int *nub, int *nue, int *nut, double *va,
double *vb, double *ve, double *f0a, double *f0b, double *fa, double *fb)
{
int i, j, k;
double xt, xa, xb, xtb, w;
double *xat, *xbt, *xab, *xbb;
if(l < 1 || m < 1 || n < 1 || al <= 0.0 || al >= 1.0) return 999;
xat = (double *)malloc(m * sizeof(double));
if(xat == NULL)
{
fprintf(stderr, "Error : Out of memory in aov2()\n");
return -1;
}
xbt = (double *)malloc(n * sizeof(double));
if(xbt == NULL)
{
fprintf(stderr, "Error : Out of memory in aov2()\n");
free(xat);
return -1;
}
xab = (double *)malloc(m * sizeof(double));
if(xab == NULL)
{
fprintf(stderr, "Error : Out of memory in aov2()\n");
free(xbt);
free(xat);
return -1;
}
xbb = (double *)malloc(n * sizeof(double));
if(xbb == NULL)
{
fprintf(stderr, "Error : Out of memory in aov2()\n");
free(xab);
free(xbt);
free(xat);
return -1;
}
xt = 0.0;
for(i = 0; i < m; i++)
{
k = i * l;
xa = 0.0;
for(j = 0; j < n; j++) xa += x[k + j];
xt += xa;
xat[i] = xa;
}
for(i = 0; i < n; i++)
{
xb = 0.0;
for(j = 0; j < m; j++) xb += x[i + j * l];
xbt[i] = xb;
}
for(i = 0; i < m; i++) xab[i] = xat[i] / (double)n;
for(i = 0; i < n; i++) xbb[i] = xbt[i] / (double)m;
xtb = xt / (double)m / (double)n;
*sa = 0.0;
for(i = 0; i < m; i++)
{
w = xab[i] - xtb;
*sa += (w * w);
}
*sa *= (double)n;
*sb = 0.0;
for(i = 0; i < n; i++)
{
w = xbb[i] - xtb;
*sb += (w * w);
}
*sb *= (double)m;
*st = 0.0;
for(i = 0; i < m; i++)
{
k = i * l;
for(j = 0; j < n; j++)
{
w = x[k + j] - xtb;
*st += (w * w);
}
}
*se = *st - *sa - *sb;
*nua = m - 1;
*nub = n - 1;
*nue = *nua * *nub;
*nut = *nua + *nub + *nue;
*va = *sa / *nua;
*vb = *sb / *nub;
*ve = *se / *nue;
*f0a = *va / *ve;
*f0b = *vb / *ve;
*fa = pf(al, *nua, *nue);
*fb = pf(al, *nub, *nue);
free(xbb);
free(xab);
free(xbt);
free(xat);
return 0;
} |