因子分析

C言語によるサンプルソースコード : 使用関数名:nag_mv_factor (g03cac)

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


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks