Keyword: 因子分析, 多変量解析
概要
本サンプルは因子分析を行うC言語によるサンプルプログラムです。 本サンプルは以下に示される相関行列について因子分析を行います。
※本サンプルはnAG Cライブラリに含まれる関数 nag_mv_factor() のExampleコードです。本サンプル及び関数の詳細情報は nag_mv_factor のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_mv_factor のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12
このデータをダウンロード |
nag_mv_factor (g03cac) Example Program Data Nag_MatCorr_Covar Nag_FALSE 211 9 9 3 1.000 0.523 0.395 0.471 0.346 0.426 0.576 0.434 0.639 0.523 1.000 0.479 0.506 0.418 0.462 0.547 0.283 0.645 0.395 0.479 1.000 0.355 0.270 0.254 0.452 0.219 0.504 0.471 0.506 0.355 1.000 0.691 0.791 0.443 0.285 0.505 0.346 0.418 0.270 0.691 1.000 0.679 0.383 0.149 0.409 0.426 0.462 0.254 0.791 0.679 1.000 0.372 0.314 0.472 0.576 0.547 0.452 0.443 0.383 0.372 1.000 0.385 0.680 0.434 0.283 0.219 0.285 0.149 0.314 0.385 1.000 0.470 0.639 0.645 0.504 0.505 0.409 0.472 0.680 0.470 1.000 1 1 1 1 1 1 1 1 1
- 1行目はタイトル行で読み飛ばされます。
- 2行目には因子分析が実行される行列の種類を示すパラメータ(matrix)、重みづけをするかどうかを示すパラメータ(weight)、相関行列/分散共分散行列の計算に使用される観測値の数(n)、相関/分散共分散行列の変数の数(m)、因子分析の変数の数(nvar)、因子数(nfac)を指定しています。
この場合、"Nag_MatCorr_Covar"は相関行列/分散共分散行列に対して因子分析が実行されることを意味しています。"Nag_FALSE"は重みづけがされないことを意味しています。 - 3~11行目に相関行列のデータ(x)を指定しています。
- 12行目に変数が因子分析に含まれるかどうかを示すフラグ(isx)を指定しています。
出力結果
(本関数の詳細はnag_mv_factor のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
この出力例をダウンロード |
nag_mv_factor (g03cac) Example Program Results Parameters to e04lbc -------------------- Number of variables........... 9 optim_tol............... 1.00e-02 linesearch_tol.......... 9.00e-01 step_max................ 2.70e+01 max_iter................ 500 print_level......... Nag_Soln_Iter machine precision....... 1.11e-16 deriv_check............. Nag_FALSE outfile................. stdout Memory allocation: state................... User hesl.................... User hesd................... User Iterations performed = 0, function evaluations = 1 Criterion = 8.635756e-02 Variable Standardized Communalities 1 0.5755 2 0.5863 3 0.4344 4 0.7496 5 0.6203 6 0.7329 7 0.6061 8 0.4053 9 0.7104 Iterations performed = 1, function evaluations = 3 Criterion = 3.603203e-02 Variable Standardized Communalities 1 0.5517 2 0.5800 3 0.3936 4 0.7926 5 0.6140 6 0.8254 7 0.6052 8 0.5076 9 0.7569 Iterations performed = 2, function evaluations = 4 Criterion = 3.502097e-02 Variable Standardized Communalities 1 0.5496 2 0.5731 3 0.3838 4 0.7875 5 0.6200 6 0.8238 7 0.6006 8 0.5349 9 0.7697 Iterations performed = 3, function evaluations = 5 Criterion = 3.501729e-02 Variable Standardized Communalities 1 0.5495 2 0.5729 3 0.3835 4 0.7877 5 0.6195 6 0.8231 7 0.6005 8 0.5384 9 0.7691 Eigenvalues 1.5968e+01 4.3577e+00 1.8474e+00 1.1560e+00 1.1190e+00 1.0271e+00 9.2574e-01 8.9508e-01 8.7710e-01 Test Statistic = 7.149 df = 12.000 Significance level = 0.848 Residuals 0.000 -0.013 0.022 0.011 -0.005 0.023 -0.010 -0.019 -0.016 0.003 -0.005 0.011 -0.012 -0.001 -0.001 0.015 -0.022 -0.011 0.002 0.029 -0.012 -0.001 -0.011 0.013 0.005 -0.006 -0.001 0.003 -0.006 0.010 -0.005 -0.011 0.002 0.007 0.003 -0.001 Loadings, Communalities and PSI 0.664 -0.321 0.074 0.550 0.450 0.689 -0.247 -0.193 0.573 0.427 0.493 -0.302 -0.222 0.383 0.617 0.837 0.292 -0.035 0.788 0.212 0.705 0.315 -0.153 0.619 0.381 0.819 0.377 0.105 0.823 0.177 0.661 -0.396 -0.078 0.600 0.400 0.458 -0.296 0.491 0.538 0.462 0.766 -0.427 -0.012 0.769 0.231
- 7行目に変数の数が出力されています。
- 9~13行目にはオプションパラメータの値が出力されています。
optim_tol 解を必要とする x の精度。 linesearch_tol 線形最小化の精度。 step_max 解と開始点の間のユークリッド距離の推定値。 max_iter 最大反復数。 print_level 結果出力のレベル。"Nag_Soln_Iter"は最終解と各反復の結果を出力することを意味します。 machine precision マシンの精度。 deriv_check 開始点 x で導関数のチェックがされるかどうかを示しています。"Nag_FALSE"はチェックがされないことを意味します。 outfile 結果が出力されるファイル名。"stdout"は標準出力を意味します。 - 15~17行目にはオプションパラメータstate、hesl、hesd がユーザによってメモリの割り当てがされていることを表しています。
- 19~20行目には実行された反復数、関数評価、基準値が出力されています。
- 22~32行目には変数と標準化された共通性が出力されています。
- 34~47行目には1回目の反復後の計算結果が出力されています。
- 49~62行目には2回目の反復後の計算結果が出力されています。
- 64~77行目には3回目の反復後の計算結果が出力されています。
- 79~82行目には固有値が出力されています。
- 84行目には検定統計量が出力されています。
- 85行目には自由度が出力されています。
- 86行目には有意度が出力されています。
- 88~97行目には残差が出力されています。
- 99~109行目には各因子の負荷量、共通性とΨの推定値が出力されています。
ソースコード
(本関数の詳細はnag_mv_factor のマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
このソースコードをダウンロード |
/* nag_mv_factor (g03cac) Example Program. * * CLL6I261D/CLL6I261DL Version. * * Copyright 2017 Numerical Algorithms Group. * * Mark 26.1, 2017. * */ #include <nag.h> #include <stdio.h> #include <string.h> #include <nag_stdlib.h> #include <nage04.h> #include <nagg03.h> #define FL(I, J) fl[(I) *tdfl + J] #define X(I, J) x[(I) *tdx + J] int main(void) { Integer exit_status = 0, i, *isx = 0, j, l, m, n, nfac, nvar, tdfl, tdx; double *com = 0, *e = 0, eps, *fl = 0, *psi = 0, *res = 0, *stat = 0; double *wt = 0, *wtptr = 0, *x = 0; char nag_enum_arg[40]; Nag_Boolean weight; Nag_E04_Opt options; Nag_FacMat matrix; NagError fail; INIT_FAIL(fail); printf("nag_mv_factor (g03cac) Example Program Results\n\n"); /* Skip headings in data file */ scanf("%*[^\n]"); scanf("%39s", nag_enum_arg); /* nag_enum_name_to_value (x04nac). * Converts nAG enum member name to value */ matrix = (Nag_FacMat) nag_enum_name_to_value(nag_enum_arg); scanf("%39s", nag_enum_arg); weight = (Nag_Boolean) nag_enum_name_to_value(nag_enum_arg); scanf("%ld", &n); scanf("%ld", &m); scanf("%ld", &nvar); scanf("%ld", &nfac); if (nvar >= 2 && m >= nvar && n > nvar) { if (!(com = nAG_ALLOC(nvar, double)) || !(e = nAG_ALLOC(nvar, double)) || !(fl = nAG_ALLOC(nvar * nfac, double)) || !(psi = nAG_ALLOC(nvar, double)) || !(res = nAG_ALLOC(nvar * (nvar - 1) / 2, double)) || !(stat = nAG_ALLOC(4, double)) || !(wt = nAG_ALLOC(n, double)) || !(x = nAG_ALLOC((matrix == Nag_MatCorr_Covar ? m : n) * m, double)) || !(isx = nAG_ALLOC(m, Integer))) { printf("Allocation failure\n"); exit_status = -1; goto END; } tdfl = nfac; tdx = m; } else { printf("Invalid nvar or m or n.\n"); exit_status = 1; return exit_status; } if (matrix == Nag_MatCorr_Covar) { for (i = 0; i < m; ++i) { for (j = 0; j < m; ++j) scanf("%lf", &X(i, j)); } } else { if (weight) { for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) scanf("%lf", &X(i, j)); scanf("%lf", &wt[i]); } wtptr = wt; } else { for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) scanf("%lf", &X(i, j)); } } } for (j = 0; j < m; ++j) scanf("%ld", &isx[j]); /* nag_opt_init (e04xxc). * Initialization function for option setting */ nag_opt_init(&options); options.max_iter = 500; options.optim_tol = 1e-2; eps = 1e-5; /* nag_mv_factor (g03cac). * Maximum likelihood estimates of parameters */ fflush(stdout); nag_mv_factor(matrix, n, m, x, tdx, nvar, isx, nfac, wtptr, e, stat, com, psi, res, fl, tdfl, &options, eps, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_mv_factor (g03cac).\n%s\n", fail.message); exit_status = 1; goto END; } printf("\nEigenvalues\n\n"); for (j = 0; j < nvar; ++j) { printf(" %13.4e%s", e[j], (j + 1) % 5 == 0 ? "\n" : ""); } printf("\n\n%s%6.3f\n", " Test Statistic = ", stat[1]); printf("%s%6.3f\n", " df = ", stat[2]); printf("%s%6.3f\n\n", "Significance level = ", stat[3]); printf("Residuals\n\n"); l = 1; for (i = 1; i <= nvar - 1; ++i) { for (j = l; j <= l + i - 1; ++j) printf(" %8.3f", res[j - 1]); printf("\n"); l += i; } printf("\nLoadings, Communalities and PSI\n\n"); for (i = 0; i < nvar; ++i) { for (j = 0; j < nfac; ++j) printf(" %8.3f", FL(i, j)); printf("%8.3f%8.3f\n", com[i], psi[i]); } END: nAG_FREE(com); nAG_FREE(e); nAG_FREE(fl); nAG_FREE(psi); nAG_FREE(res); nAG_FREE(stat); nAG_FREE(wt); nAG_FREE(x); nAG_FREE(isx); return exit_status; }