方差分析是数理统计中分析试验数据的一种常用方法.其目的是从试验数据中分析出各种因素的影响及其相互间的交互影响,用以确定各种因素作用的大小,通过数量的形式来分析导致试验结果不同的两种原因:观测条件与随机因素,确定出在试验中有无由观测条件引起的系统性因素在起作用。
双无关变量方差分析
下面三段代码分别对应单变量方差分析、双无关变量方差分析和双相关变量方差分析的算法。由于只是出于嫌弃概率统计的作业太麻烦了,懒得算了而写,健壮性以及代码可读性均不强。并且不排除有错。望指教~O(∩_∩)O~
单变量方差分析:
输入:
第一行:n,m。 表示一共有n个测试数据,并且有m个测试状态。
第二行,m个数,表示m种状态每种有多少组。
接下来n个数,分别是对状态1~状态m的所有测试结果。
输出:
中间变量及最终计算的fa。具体结论需要再去查f分布表。
#include<stdio.h>
#include<math.h>
int main ()
{
while(1)
{
int N,m;
int n[100];
scanf("%d%d",&N,&m);
for (int i = 0 ;i<m;i++)
scanf("%d",&n[i]);
double x[100][100];
for (int i = 0; i<m;i++)
for (int j = 0;j<n[i];j++)
scanf("%lf",&x[i][j]);
double T[100]={0};
for (int i = 0;i<m;i++)
for (int j = 0;j<n[i];j++)
T[i]+=x[i][j];
for (int i = 0;i<m;i++)
printf("%lf ",T[i]);
printf("\n");
double CT=0;
for (int i = 0; i<m;i++)
CT+=T[i];
CT=((CT*CT)/(double)N);
double st =-CT;
for (int i = 0;i<m;i++)
for (int j = 0;j<n[i];j++)
st+=x[i][j]*x[i][j];
double sa =-CT;
for (int i = 0;i<m;i++)
sa+=T[i]*T[i]/n[i];
double se=st-sa;
double fa=(sa/(m-1))/(se/(N-m));
printf("CT = %lf\n",CT);
printf("st = %lf\n",st);
printf("sa = %lf\n",sa);
printf("se = %lf\n",se);
printf("fa = %lf\n",fa);
}
return 0;
}
双无关变量方差分析
输入:
第一行:n,m。 表示两个变量分别有m、n个状态,每种组合状态只有一组测试量。
第二行:两个浮点数,与结论无关。一般可以输入“0 1”.
接下来m*n个浮点数,表示每个组合状态的测试量。
输出:
中间变量及最终计算的fa,fb。具体结论需要再去查f分布表。
#include<stdio.h>
#include<math.h>
int main ()
{
while(1)
{
int m,n;
double x[100][100]={0};
scanf("%d%d",&m,&n);
double t1,t2;
scanf("%lf%lf",&t1,&t2);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
scanf("%lf",&x[i][j]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
x[i][j]=(x[i][j]-t1)/t2;
printf("\n");
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
printf("%lf ",x[i][j]);
printf("\n");
}
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
x[i][0]+=x[i][j];
for (int j=1;j<=n;j++)
for (int i=1;i<=m;i++)
x[0][j]+=x[i][j];
for (int j=1;j<=n;j++)
x[0][0]+=x[0][j];
printf("\n");
printf("Ti¡¤:\n");
for (int i=1;i<=m;i++)
printf("%lf ",x[i][0]);
printf("\n");
printf("T¡¤j:\n");
for (int j=1;j<=n;j++)
printf("%lf ",x[0][j]);
printf("\n");
printf("T¡¤¡¤: %lf\n",x[0][0]);
double SA=0,SB=0,ST=0,Se=0;
for (int i=1;i<=m;i++)
SA+=x[i][0]*x[i][0];
SA = SA/double(n)-x[0][0]*x[0][0]/double(m*n);
for (int j=1;j<=n;j++)
SB+=x[0][j]*x[0][j];
SB = SB/double(m)-x[0][0]*x[0][0]/double(m*n);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
ST+=x[i][j]*x[i][j];
ST-=x[0][0]*x[0][0]/double(m*n);
Se=ST-SA-SB;
printf("SA: %lf\n",SA);
printf("SB: %lf\n",SB);
printf("ST: %lf\n",ST);
printf("Se: %lf\n",Se);
double FA,FB;
FA=SA*(n-1)/Se;
FB=SB*(m-1)/Se;
printf("FA: %lf\n",FA);
printf("FB: %lf\n",FB);
}
return 0;
}
双有关变量方差分析
输入:
第一行:n,m,r。 表示两个变量分别有m、n个状态,每种组合状态有r组测试量。
第二行:两个浮点数,与结论无关。一般可以输入“0 1”.
接下来m*n*r个浮点数,表示每个组合状态的r组测试量。
输出:
中间变量及最终计算的fa,fb,fab。具体结论需要再去查f分布表。
#include<stdio.h>
#include<math.h>
int main ()
{
while(1)
{
int m,n,r;
double x[100][100][10]={0};
scanf("%d%d%d",&m,&n,&r);
double t1,t2;
scanf("%lf%lf",&t1,&t2);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=r;k++)
scanf("%lf",&x[i][j][k]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=r;k++)
x[i][j][k]=(x[i][j][k]-t1)/t2;
printf("\n");
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
{
for (int k=1;k<=r;k++)
printf("%lf ",x[i][j][k]);
printf(" ");
}
printf("\n");
}
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
{
for (int k=1;k<=r;k++)
x[i][j][0]+=x[i][j][k];
x[i][j][0]/=double(r);
}
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
x[i][0][0]+=x[i][j][0];
x[i][0][0]/=double(n);
}
for (int j=1;j<=n;j++)
{
for (int i=1;i<=m;i++)
x[0][j][0]+=x[i][j][0];
x[0][j][0]/=double(m);
}
for (int j=1;j<=n;j++)
x[0][0][0]+=x[0][j][0];
x[0][0][0]/=double(n);
printf("\n");
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
printf("%lf ",x[i][j][0]);
printf("\n");
}
double SA=0,SB=0,ST=0,Se=0,SAB=0;
for (int i=1;i<=m;i++)
SA+=n*r*(x[i][0][0]-x[0][0][0])*(x[i][0][0]-x[0][0][0]);
for (int j=1;j<=n;j++)
SB+=m*r*(x[0][j][0]-x[0][0][0])*(x[0][j][0]-x[0][0][0]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
SAB+=r*(x[i][j][0]-x[i][0][0]-x[0][j][0]+x[0][0][0])*(x[i][j][0]-x[i][0][0]-x[0][j][0]+x[0][0][0]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=r;k++)
ST+=(x[i][j][k]-x[0][0][0])*(x[i][j][k]-x[0][0][0]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=r;k++)
Se+=(x[i][j][k]-x[i][j][0])*(x[i][j][k]-x[i][j][0]);
printf("SA : %lf\n",SA);
printf("SB : %lf\n",SB);
printf("SAB: %lf\n",SAB);
printf("ST : %lf\n",ST);
printf("Se : %lf\n",Se);
double FA,FB,FAB;
FA=SA*m*n*(r-1)/Se/(n-1);
FB=SB*m*n*(r-1)/Se/(m-1);
FAB=SAB*m*n*(r-1)/Se/(m-1)/(n-1);
printf("FA : %lf\n",FA);
printf("FB : %lf\n",FB);
printf("FAB: %lf\n",FAB);
}
return 0;
}