方差分析

        方差分析是数理统计中分析试验数据的一种常用方法.其目的是从试验数据中分析出各种因素的影响及其相互间的交互影响,用以确定各种因素作用的大小,通过数量的形式来分析导致试验结果不同的两种原因:观测条件与随机因素,确定出在试验中有无由观测条件引起的系统性因素在起作用。

        下面三段代码分别对应单变量方差分析、双无关变量方差分析和双相关变量方差分析的算法。由于只是出于嫌弃概率统计的作业太麻烦了,懒得算了而写,健壮性以及代码可读性均不强。并且不排除有错。望指教~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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值