制限つき最尤法(REML)を用いた線形混合効果回帰

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

ホーム > 製品 > nAG数値計算ライブラリ > nAG Fortranライブラリ > サンプルソースコード集 > 制限つき最尤法(REML)を用いた線形混合効果回帰

Keyword: 制限つき最尤法, REML, 線形混合効果回帰

概要

本サンプルは制限つき最尤法(REML)を用いた線形混合効果回帰のフィットを行うFortranによるサンプルプログラムです。 本サンプルは以下に示されるデータについて線形混合効果回帰のフィットを行います。

線形混合効果回帰のデータ 

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

入力データ

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

このデータをダウンロード
G02JAF Example Program Data
24 5 3 1 1
1 4 3 2 3
1 3 4 5 3 2 0 1 1
1
56 1 1 1 1
50 1 2 1 1
39 1 3 1 1
30 2 1 1 1
36 2 2 1 1
33 2 3 1 1
32 3 1 1 1
31 3 2 1 1
15 3 3 1 1
30 4 1 1 1
35 4 2 1 1
17 4 3 1 1
41 1 1 2 1
36 1 2 2 2
35 1 3 2 3
25 2 1 2 1
28 2 2 2 2
30 2 3 2 3
24 3 1 2 1
27 3 2 2 2
19 3 3 2 3
25 4 1 2 1
30 4 2 2 2
18 4 3 2 3
1.0 1.0
-1

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目は観測値の数(n=24)、データ行列のカラム数(ncol=5)、固定として処理される独立変数の数(nfv=3)、ランダムとして処理される独立変数の数(nrv=1)、分散成分の数(nvpr=1)を指定しています。
  • 3行目は各変数のレベル数(levels)を指定しています。
  • 4行目は従属変数をもつデータ行列DATのカラム(yvid=1)、固定独立変数をもつDATのカラム(fvid=3,4,5)、ランダム独立変数をもつDATのカラム(rvid=3)、subject(個体)変数をもつDATのカラム(svid=2)、case weightをもつDATのカラム(cwid=0:無し)、固定切片が含まれるかどうか(fint=1:含まれる)、ランダム切片が含まれるかどうか(rint=1:含まれる)を指定しています。
  • 5行目はランダム変数の分散を示すフラグ(vpr)を指定しています。
  • 6~29行目はデータ行列(dat)を指定しています。
  • 30行目はガンマの初期値(gamma)を指定しています
  • 31行目は反復の最大値(maxit)を指定しています。ゼロより小さい場合は100が使用されます。

出力結果

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

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

 Fixed effects (Estimate and Standard Deviation)

 Intercept                37.0000    4.6674
 Variable   1 Level   2    1.0000    3.5173
 Variable   1 Level   3  -11.0000    3.5173
 Variable   2 Level   2   -8.2500    2.1635
 Variable   3 Level   2    0.5000    3.0596
 Variable   3 Level   3    7.7500    3.0596

 Random Effects (Estimate and Standard Deviation)

 Intercept for Subject Level   1            10.7631    4.4865
 Subject Level   1 Variable   1 Level   1    3.7276    3.0331
 Subject Level   1 Variable   1 Level   2   -1.4476    3.0331
 Subject Level   1 Variable   1 Level   3    0.3733    3.0331
 Intercept for Subject Level   2            -0.5269    4.4865
 Subject Level   2 Variable   1 Level   1   -3.7171    3.0331
 Subject Level   2 Variable   1 Level   2   -1.2253    3.0331
 Subject Level   2 Variable   1 Level   3    4.8125    3.0331
 Intercept for Subject Level   3            -5.6450    4.4865
 Subject Level   3 Variable   1 Level   1    0.5903    3.0331
 Subject Level   3 Variable   1 Level   2    0.3987    3.0331
 Subject Level   3 Variable   1 Level   3   -2.3806    3.0331
 Intercept for Subject Level   4            -4.5912    4.4865
 Subject Level   4 Variable   1 Level   1   -0.6009    3.0331
 Subject Level   4 Variable   1 Level   2    2.2742    3.0331
 Subject Level   4 Variable   1 Level   3   -2.8052    3.0331

  Variance Components
    1   62.3958
    2   15.3819

 SIGMA^2     =     9.3611
 -2LOG LIKE  =   119.7618
 DF          =               16

  • 3~10行目に固定効果が出力されています。
  • 5行目に固定切片と標準誤差が出力されています。
  • 6~10行目に固定独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
  • 12~29行目にランダム効果が出力されています。
  • 14行目にsubject変数のレベル1のランダム切片と標準誤差が出力されています。
  • 15~17行目にランダム独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
  • 18行目にsubject変数のレベル2のランダム切片と標準誤差が出力されています。
  • 19~21行目にランダム独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
  • 22行目にsubject変数のレベル3のランダム切片と標準誤差が出力されています。
  • 23~25行目にランダム独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
  • 26行目にsubject変数のレベル4のランダム切片と標準誤差が出力されています。
  • 27~29行目にランダム独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
  • 31~33行目に分散成分が出力されています。
  • 35行目にシグマの2乗が出力されています。
  • 36行目に対数尤度(log-likelihood)が出力されています。
  • 37行目に自由度が出力されています。

ソースコード

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

※本サンプルソースコードは科学技術・統計計算ライブラリである「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
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

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

!      G02JAF Example Program Text

!      Mark 23 Release. nAG Copyright 2011.

!      .. Use Statements ..
       USE nag_library, ONLY : g02jaf, nag_wp
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       INTEGER, PARAMETER              :: nin = 5, nout = 6
!      .. Local Scalars ..
       REAL (KIND=nag_wp)              :: reml, tol
       INTEGER                         :: cwid, df, fint, i, ifail, j, k, l,   &
                                          lb, lddat, maxit, n, ncol, nff, nfv, &
                                          nrf, nrv, nvpr, rint, svid, warn, yvid
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE :: b(:), dat(:,:), gamma(:), se(:)
       INTEGER, ALLOCATABLE            :: fvid(:), levels(:), rvid(:), vpr(:)
!      .. Intrinsic Functions ..
       INTRINSIC                          max
!      .. Executable Statements ..
       WRITE (nout,*) 'G02JAF Example Program Results'
       WRITE (nout,*)

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

!      Read in the problem size
       READ (nin,*) n, ncol, nfv, nrv, nvpr

       ALLOCATE (levels(ncol),fvid(nfv),rvid(nrv))

!      Read in number of levels for each variable
       READ (nin,*) levels(1:ncol)

!      Read in model information
       READ (nin,*) yvid, fvid(1:nfv), rvid(1:nrv), svid, cwid, fint, rint

!      If no subject specified, then ignore RINT
       IF (svid==0) THEN
          rint = 0
       END IF

!      Calculate LB
       lb = rint
       DO i = 1, nrv
          lb = lb + levels(rvid(i))
       END DO
       IF (svid/=0) THEN
          lb = lb*levels(svid)
       END IF
       lb = lb + fint
       DO i = 1, nfv
          lb = lb + max(levels(fvid(i))-1,1)
       END DO

       lddat = n
       ALLOCATE (vpr(nrv),dat(lddat,ncol),gamma(nvpr+2),b(lb),se(lb))

!      Read in the variance component flag
       READ (nin,*) vpr(1:nrv)

!      Read in the Data matrix
       READ (nin,*) (dat(i,1:ncol),i=1,n)

!      Read in the initial values for GAMMA
       READ (nin,*) gamma(1:(nvpr+rint))

!      Read in the maximum number of iterations
       READ (nin,*) maxit

!      Use default value for tolerance
       tol = 0.0E0_nag_wp

!      Fit the linear mixed effects regresion model
       ifail = 0
       CALL g02jaf(n,ncol,lddat,dat,levels,yvid,cwid,nfv,fvid,fint,nrv,rvid, &
          nvpr,vpr,rint,svid,gamma,nff,nrf,df,reml,lb,b,se,maxit,tol,warn, &
          ifail)

!      Display results
       IF (warn/=0) THEN
          WRITE (nout,*) 'Warning: At least one variance component was ', &
             'estimated to be negative and then reset to zero'
          WRITE (nout,*)
       END IF
       WRITE (nout,*) 'Fixed effects (Estimate and Standard Deviation)'
       WRITE (nout,*)
       k = 1
       IF (fint==1) THEN
          WRITE (nout,99999) 'Intercept             ', b(k), se(k)
          k = k + 1
       END IF
       DO i = 1, nfv
          DO j = 1, levels(fvid(i))
             IF (levels(fvid(i))==1 .OR. j/=1) THEN
                WRITE (nout,99995) 'Variable', i, ' Level', j, b(k), se(k)
                k = k + 1
             END IF
          END DO
       END DO

       WRITE (nout,*)
       WRITE (nout,*) 'Random Effects (Estimate and Standard', ' Deviation)'
       WRITE (nout,*)
       IF (svid==0) THEN
          DO i = 1, nrv
             DO j = 1, levels(rvid(i))
                WRITE (nout,99995) 'Variable', i, ' Level', j, b(k), se(k)
                k = k + 1
             END DO
          END DO
       ELSE
          DO l = 1, levels(svid)
             IF (rint==1) THEN
                WRITE (nout,99998) 'Intercept for Subject Level', l, &
                   '         ', b(k), se(k)
                k = k + 1
             END IF
             DO i = 1, nrv
                DO j = 1, levels(rvid(i))
                   WRITE (nout,99997) 'Subject Level', l, ' Variable', i, &
                      ' Level', j, b(k), se(k)
                   k = k + 1
                END DO
             END DO
          END DO
       END IF

       WRITE (nout,*)
       WRITE (nout,*) ' Variance Components'
       WRITE (nout,99996) (i,gamma(i),i=1,nvpr+rint)

       WRITE (nout,*)
       WRITE (nout,99994) 'SIGMA^2     = ', gamma(nvpr+rint+1)
       WRITE (nout,99994) '-2LOG LIKE  = ', reml
       WRITE (nout,99993) 'DF          = ', df

99999  FORMAT (1X,A,2F10.4)
99998  FORMAT (1X,A,I4,A,2F10.4)
99997  FORMAT (1X,3(A,I4),2F10.4)
99996  FORMAT (1X,I4,F10.4)
99995  FORMAT (1X,2(A,I4),2F10.4)
99994  FORMAT (1X,A,F10.4)
99993  FORMAT (1X,A,I16)
    END PROGRAM g02jafe


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