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"); }