/* 消費関数の決定 所得と消費に関する1次回帰と決定係数 Keynes型の消費関数 Y=a+bX, Y:消費支出, X: 実収入 */ #include/*a,bを計算する関数を宣言する, flag=0 for a, flag=1 for b */ float fkeisu(float x[], float y[], int n, int flag); /*決定係数Rを計算する関数を宣言する*/ float fkettei (float x[], float y[], float a, float b, int n); main() { float x[11]={405,424,444,452,460,481,495,521,548,563,570}; /*x=実収入*/ float y[11]={272,282,289,293,295,307,316,331,345,352,355}; /*y=消費支出*/ float a,b,rr; /*y=a+bx, rr=R: 決定係数*/ float x1,y1,bai; int j,k,n=11; /*n=11はデータの数*/ a=fkeisu(x,y,n,0); /*係数a を計算する関数を呼ぶ*/ b=fkeisu(x,y,n,1); /*係数b を計算する関数を呼ぶ*/ rr=fkettei(x,y,a,b,n); /* 決定係数Rを計算する関数を呼ぶ*/ printf("a=%6.4f b=%6.4f R=%6.4f\n",a,b,rr); /*表示*/ getchar(); /*一次停止*/ /*散布図*/ printf("---------------散布図------------------- \n"); bai=0.5; /*bai: 倍率変数*/ for(k=0;k =\sum xi/N, <y>=\sum Yi/N, Sxy=\sum (xi-<x>)(yi-<y>), Sxx=\sum (xi-<x>)**2, b=Sxy/Sxx; a=<y>-b<x> */ float fkeisu(float x[],float y[],int n,int flag) { float sx=0, sy=0, sxx=0, sxy=0; /*初期設定*/ float avy, avx, a,b; int k; for(k=0;k<n;k++){ sx=sx+x[k]; /*データの和を求める*/ sy=sy+y[k]; /*データの和を求める*/ } avx=sx/n; /*平均を求める*/ avy=sy/n; /*平均を求める*/ for(k=0;k<n;k++){ sxy=sxy+(x[k]-avx)*(y[k]-avy); /*偏差の自乗の和を求める*/ sxx=sxx+(x[k]-avx)*(x[k]-avx); /*偏差の自乗の和を求める*/ } b=sxy/sxx; a=avy-b*avx; /*a,bを求める*/ if(flag==0){ /*flagに応じてa又はbを返す*/ return a; } if(flag==1){ return b; } } /*Coefficient of Determination R; 決定係数の計算 <y>=\sum Y_i/N, Syy=\sum (yi-<y>)**2, R=rr=1-\sum (yi-(a+bxi))**2/(Syy)) */ float fkettei(float x[], float y[], float a, float b, int n) { float sy=0,syy=0,syx=0; /*初期設定*/ float avy,rr; int k; for (k=0;k<n;k++) { sy=sy+y[k]; /*データの和を求める*/ } avy=sy/n; for(k=0;k<n;k++) { syx=syx+(y[k]-(a+b*x[k]))*(y[k]-(a+b*x[k])); /*偏差の自乗の和*/ syy=syy+(y[k]-avy)*(y[k]-avy); } rr=1-syx/syy; return rr; }
[出力結果]
a=60.4448 b=0.5169 R=0.9964 ---------------散布図------------------- x=405, y=272 * x=424, y=282 * x=444, y=289 * x=452, y=293 * x=460, y=295 * x=481, y=307 * x=495, y=316 * x=521, y=331 * x=548, y=345 * x=563, y=352 * x=570, y=355 * ---------------一次回帰------------------- x=405,y=270 + x=425,y=280 + x=445,y=290 + x=465,y=301 + x=485,y=311 + x=505,y=321 + x=525,y=332 + x=545,y=342 + x=565,y=352 +
Back to C Language