C++でVIF統計量を計算する

C++でVIF統計量を計算する

前回のVIF統計量|βshort Labで計算方法を書きました。

多重共線性とVIF統計量で説明変数間での相関を調べる – 日経BigDataのサンプルデータvif.csvを計算するプログラムです。

 

プログラムの

char *fname = "vif.csv";

は、vif.csvのディレクトリを指定してください。

プログラム

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<fstream>
#include<stdlib.h>

#pragma warning(disable : 4996);

using namespace std;

void vif(double x[3][1000]) {
	double mean1 = 0;
	double mean[3] = {};
	double xx = 0, yy = 0, xy = 0, cc = 0;
	//平均を求める
	for (int i = 0; i < 3; i++) {
		for (int l = 0; l < 1000; l++) {
			mean1 += x[i][l];
		}
		mean[i] = mean1 / 1000;
		mean1 = 0;
	}

	for (int i = 0; i<2; i++) {
		for (int k = i + 1; k < 3; k++) {
			for (int l = 0; l < 1000; l++) {
				//分散
				xx += pow(x[i][l] - mean[i], 2);
				//分散
				yy += pow(x[k][l] - mean[k], 2);
				//共分散
				xy += (x[i][l] - mean[i]) * (x[k][l] - mean[k]);
			}
			//標準偏差
			xx = sqrt(xx);
			yy = sqrt(yy);
			cc = pow(xy / (xx*yy), 2);

			//VIF統計量
			printf("%f\n", 1 / (1 - cc));

			xx = 0, yy = 0, xy = 0;

		}
	}
}

void main(void) {
	FILE *fp;
	char *fname = "vif.csv";
	int ret;
	int i = 0;
	char buf[3][10];
	double data[3][1000] = {};

	fp = fopen(fname, "r");
	if (fp == NULL) {
		printf("%sファイルが開けません\n", fname);
		exit(EXIT_FAILURE);
	}

	fscanf(fp, "%s,%s,%s", buf[0], buf[1], buf[2]);

	while ((ret = fscanf(fp, "%lf,%lf,%lf", &data[0][i], &data[1][i], &data[2][i])) != EOF) {
		//printf("%lf %lf %lf\n", data[i][0], data[i][1], data[i][2]);
		i++;
	}
	vif(data);
	printf("\n");
	fclose(fp);

	system("pause");
}