主成分分析

Fortranによるサンプルソースコード : 使用ルーチン名:g03aaf

Keyword: 主成分分析, 多変量解析

概要

本サンプルは主成分分析を行うFortranによるサンプルプログラムです。 本サンプルは以下の「分析対象データ」に示される変数が3個で観察数が10のデータを分析対象とします。 このサンプルでは主成分分析を行い、固有値、寄与度、χ二乗値、自由度、有意度、主成分負荷量、主成分スコアを出力します。

主成分分析のデータ 

※本サンプルはnAG Fortranライブラリに含まれるルーチン g03aaf() のExampleコードです。本サンプル及びルーチンの詳細情報は g03aaf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本ルーチンの詳細はg03aaf のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13

このデータをダウンロード
G03AAF Example Program Data
 'V' 'E' 'U' 10 3
7.0 4.0 3.0
4.0 1.0 8.0
6.0 3.0 5.0
8.0 6.0 1.0
8.0 5.0 7.0
7.0 2.0 9.0
5.0 3.0 3.0
9.0 5.0 8.0
7.0 4.0 5.0
8.0 2.0 2.0
 1   1   1  

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目は計算の際に用いる行列の種類 (matrix='V')、計算に利用する主成分スコアのタイプ (std='E')、 重み付けをするかどうか (weight='U')、観察数 (n=10)、変数の数 (m=3) を指定しています。 
    計算の際に用いる行列の種類に "V" が指定されていますが、これは分散共分散行列を用いることを意味します。
    主成分スコアのタイプは計算で用いる主成分スコアの種類を指定しますが、ここで指定されている"E"は主成分スコアに(分散が対応する固有値と同じになるように)標準化されたものを使う事が指定されています。
    また各観察データに重みをつけることも可能ですが、ここでは"U"を指定して重みを付けない事を指定しています。
  • 3行目~12行目は観察データ(x)を指定しています。各行はそれぞれの観察値であり、3つ(2行目で示される変数の数)の値を持っています。
  • 13行目は計算で使う変数がどれであるか(isx)を指定しています。ここで 1 は計算で使う事を示しています。(0は計算で当該変数を使わないことを示します。ここで与える数字は変数の数分(ここでは3)なければなりません。 今回のデータはすべての変数を計算で使うので3つの 1 が与えられています。

出力結果

(本ルーチンの詳細はg03aaf のマニュアルページを参照)
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

この出力例をダウンロード
 G03AAF Example Program Results

 Eigenvalues  Percentage  Cumulative     Chisq      DF     Sig
               variation   variation

      8.2739      0.6515      0.6515    8.6127     5.0  0.1255
      3.6761      0.2895      0.9410    4.1183     2.0  0.1276
      0.7499      0.0590      1.0000    0.0000     0.0  0.0000

 Principal component loadings
          1       2       3
 1  -0.1376  0.6990 -0.7017
 2  -0.2505  0.6609  0.7075
 3   0.9583  0.2731  0.0842

 Principal component scores
              1          2          3
  1     -2.1514    -0.1731     0.1068
  2      3.8042    -2.8875     0.5104
  3      0.1532    -0.9869     0.2694
  4     -4.7065     1.3015     0.6517
  5      1.2938     2.2791     0.4492
  6      4.0993     0.1436    -0.8031
  7     -1.6258    -2.2321     0.8028
  8      2.1145     3.2512    -0.1684
  9     -0.2348     0.3730     0.2751
 10     -2.7464    -1.0689    -2.0940

  • 1行目はタイトルです
  • 3行目~8行目には各主成分の固有値 (Eigenvalues)、寄与度 (Percentage variation)、累積寄与度 (Cumulative variation)、χ二乗値 (Chisq)、自由度 (DF)、有意度 (Sig) がそれぞれ出力されます。6行目から8行目の各行は上から順番に第一主成分、第二主成分、第三主成分の各値を示しています。
  • 11行目から14行目に主成分負荷量を示しています。
  • 17行目から27行目は主成分スコアが出力されています。 行方向は観察データ、列方向は主成分をそれぞれ表しています。

ソースコード

(本ルーチンの詳細はg03aaf のマニュアルページを参照)

※本サンプルソースコードは科学技術・統計計算ライブラリである「nAG Fortranライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法

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

このソースコードをダウンロード
    PROGRAM g03aafe

!      G03AAF Example Program Text

!      Mark 23 Release. nAG Copyright 2011.

!      .. Use Statements ..
       USE nag_library, ONLY : g03aaf, nag_wp, x04caf
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       INTEGER, PARAMETER              :: nin = 5, nout = 6
!      .. Local Scalars ..
       INTEGER                         :: i, ifail, lde, ldp, ldv, ldx, lwt,   &
                                          m, n, nvar
       CHARACTER (1)                   :: matrix, std, weight
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE :: e(:,:), p(:,:), s(:), v(:,:), wk(:), &
                                          wt(:), x(:,:)
       INTEGER, ALLOCATABLE            :: isx(:)
!      .. Intrinsic Functions ..
       INTRINSIC                          count
!      .. Executable Statements ..
       WRITE (nout,*) 'G03AAF Example Program Results'
       WRITE (nout,*)

!      Skip heading in data file
       READ (nin,*)

!      Read in the problem size
       READ (nin,*) matrix, std, weight, n, m

       IF (weight=='W' .OR. weight=='w') THEN
          lwt = n
       ELSE
          lwt = 0
       END IF
       ldx = n
       ALLOCATE (x(ldx,m),wt(lwt),isx(m),s(m))

!      Read in data
       IF (lwt>0) THEN
          READ (nin,*) (x(i,1:m),wt(i),i=1,n)
       ELSE
          READ (nin,*) (x(i,1:m),i=1,n)
       END IF

!      Read in variable inclusion flags
       READ (nin,*) isx(1:m)

!      Read in standardizations
       IF (matrix=='S' .OR. matrix=='s') THEN
          READ (nin,*) s(1:m)
       END IF

!      Calculate NVAR
       nvar = count(isx(1:m)==1)

       lde = nvar
       ldp = nvar
       ldv = n
       ALLOCATE (e(lde,6),p(ldp,nvar),v(ldv,nvar),wk(1))

!      Perform PCA
       ifail = 0
       CALL g03aaf(matrix,std,weight,n,m,x,ldx,isx,s,wt,nvar,e,lde,p,ldp,v, &
          ldv,wk,ifail)

!      Display results
       WRITE (nout,*) &
          'Eigenvalues  Percentage  Cumulative     Chisq      DF     Sig'
       WRITE (nout,*) '              variation   variation'
       WRITE (nout,*)
       WRITE (nout,99999) (e(i,1:6),i=1,nvar)
       WRITE (nout,*)
       FLUSH (nout)
       ifail = 0
       CALL x04caf('General',' ',nvar,nvar,p,ldp, &
          'Principal component loadings',ifail)
       WRITE (nout,*)
       FLUSH (nout)
       ifail = 0
       CALL x04caf('General',' ',n,nvar,v,ldv,'Principal component scores', &
          ifail)

99999  FORMAT (1X,F11.4,2F12.4,F10.4,F8.1,F8.4)
    END PROGRAM g03aafe

リファレンス

サンプル入力データは Cooley W C and Lohnes P R (1971) Multivariate Data Analysis Wiley よりのデータです。


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