Keyword: 制限つき最尤法, REML, 線形混合効果回帰
概要
本サンプルは制限つき最尤法(REML)を用いた線形混合効果回帰のフィットを行うFortranによるサンプルプログラムです。 本サンプルは以下に示されるデータについて線形混合効果回帰のフィットを行います。
※本サンプルはnAG Fortranライブラリに含まれるルーチン g02jaf() のExampleコードです。本サンプル及びルーチンの詳細情報は g02jaf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本ルーチンの詳細はg02jaf のマニュアルページを参照)| このデータをダウンロード |
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 のマニュアルページを参照)| この出力例をダウンロード |
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ライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法
| このソースコードをダウンロード |
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
