Keyword: 制限つき最尤法, REML, 線形混合効果回帰
概要
本サンプルは制限つき最尤法(REML)を用いた線形混合効果回帰のフィットを行うC言語によるサンプルプログラムです。 本サンプルは以下に示されるデータについて線形混合効果回帰のフィットを行います。
※本サンプルはnAG Cライブラリに含まれる関数 nag_reml_mixed_regsn() のExampleコードです。本サンプル及び関数の詳細情報は nag_reml_mixed_regsn のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_reml_mixed_regsn のマニュアルページを参照)| このデータをダウンロード |
nag_reml_mixed_regsn (g02jac) 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)、データ行列のカラム数(ncol)、固定として処理される独立変数の数(nfv)、ランダムとして処理される独立変数の数(nrv)、分散成分の数(nvpr)を指定しています。
- 3行目は各変数のレベル数(levels)を指定しています。
- 4行目は従属変数をもつデータ行列DATのカラム(yvid)、固定独立変数をもつDATのカラム(fvid)、ランダム独立変数をもつDATのカラム(rvid)、subject(個体)変数をもつDATのカラム(svid)、case weightをもつDATのカラム(cwid)、固定切片が含まれるかを示すフラグ(fint)、ランダム切片が含まれるかどうかを示すフラグ(rint)を指定しています。
- 5行目はランダム変数の分散を示すフラグ(vpr)を指定しています。
- 6〜29行目はデータ行列(dat)を指定しています。
- 30行目はガンマの初期値(gamma)を指定しています
- 31行目は反復の最大値(maxit)を指定しています。ゼロより小さい場合は100が使用されます。
出力結果
(本関数の詳細はnag_reml_mixed_regsn のマニュアルページを参照)| この出力例をダウンロード |
nag_reml_mixed_regsn (g02jac) 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〜28行目にランダム効果が出力されています。
- 13行目にsubject変数のレベル1のランダム切片と標準誤差が出力されています。
- 14〜16行目にランダム独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
- 17行目にsubject変数のレベル2のランダム切片と標準誤差が出力されています。
- 18〜20行目にランダム独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
- 21行目にsubject変数のレベル3のランダム切片と標準誤差が出力されています。
- 22〜24行目にランダム独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
- 25行目にsubject変数のレベル4のランダム切片と標準誤差が出力されています。
- 26〜28行目にランダム独立変数のレベルごとにパラメータ推定と標準偏差が出力されています。
- 30〜32行目に分散成分が出力されています。
- 33行目にシグマの2乗が出力されています。
- 35行目に対数尤度(log-likelihood)が出力されています。
- 37行目に自由度が出力されています。
ソースコード
(本関数の詳細はnag_reml_mixed_regsn のマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
| このソースコードをダウンロード |
/* nag_reml_mixed_regsn (g02jac) Example Program.
*
* CLL6I261D/CLL6I261DL Version.
*
* Copyright 2017 Numerical Algorithms Group.
*
* Mark 26.1, 2017.
*/
#include <stdio.h>
#include <nag.h>
#include <nag_stdlib.h>
#include <nagg02.h>
int main(void)
{
/* Scalars */
double like, tol;
Integer cwid, df, exit_status, fint, i, j, k, l, lb, maxit, n, ncol, nff;
Integer nfv, nrf, nrv, nvpr, tddat, rint, svid, warnp, yvid, fnlevel;
Integer rnlevel, lgamma, fl;
/* Nag types */
NagError fail;
/* Arrays */
double *b = 0, *dat = 0, *gamma = 0, *se = 0;
Integer *fvid = 0, *levels = 0, *rvid = 0, *vpr = 0;
#define DAT(I, J) dat[(I-1)*tddat + J - 1]
exit_status = 0;
INIT_FAIL(fail);
printf("nag_reml_mixed_regsn (g02jac) Example Program Results\n\n");
/* Skip heading in data file */
scanf("%*[^\n] ");
/* Read in the problem size information */
scanf("%ld%ld%ld%ld%ld"
"%*[^\n] ", &n, &ncol, &nfv, &nrv, &nvpr);
/* Check problem size */
if (n < 0 || ncol < 0 || nfv < 0 || nrv < 0 || nvpr < 0) {
printf("Invalid problem size, at least one of n, ncol, nfv, "
"nrv or nvpr is < 0\n");
exit_status = 1;
goto END;
}
/* Allocate memory first lot of memory */
if (!(levels = nAG_ALLOC(ncol, Integer)) ||
!(fvid = nAG_ALLOC(nfv, Integer)) ||
!(rvid = nAG_ALLOC(nrv, Integer)) || !(vpr = nAG_ALLOC(nrv, Integer)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Read in number of levels for each variable */
for (i = 1; i <= ncol; ++i) {
scanf("%ld", &levels[i - 1]);
}
scanf("%*[^\n] ");
/* Read in model information */
scanf("%ld", &yvid);
for (i = 1; i <= nfv; ++i) {
scanf("%ld", &fvid[i - 1]);
}
for (i = 1; i <= nrv; i++) {
scanf("%ld", &rvid[i - 1]);
}
scanf("%ld%ld%ld%ld%*[^\n] ", &svid,
&cwid, &fint, &rint);
scanf("%*[^\n] ");
/* Read in the variance component flag */
for (i = 1; i <= nrv; ++i) {
scanf("%ld", &vpr[i - 1]);
}
scanf("%*[^\n] ");
/* If no subject specified, then ignore rint */
if (svid == 0) {
rint = 0;
}
/* Count the number of levels in the fixed parameters */
for (i = 1, fnlevel = 0; i <= nfv; ++i) {
fl = levels[fvid[i - 1] - 1] - 1;
fnlevel += (fl < 1) ? 1 : fl;
}
if (fint == 1) {
fnlevel++;
}
/* Count the number of levels in the random parameters */
for (i = 1, rnlevel = 0; i <= nrv; ++i) {
rnlevel += levels[rvid[i - 1] - 1];
}
if (rint) {
rnlevel++;
}
/* Calculate the sizes of the output arrays */
if (rint == 1) {
lgamma = nvpr + 2;
}
else {
lgamma = nvpr + 1;
}
if (svid) {
lb = fnlevel + levels[svid - 1] * rnlevel;
}
else {
lb = fnlevel + rnlevel;
}
tddat = ncol;
/* Allocate remaining memory */
if (!(dat = nAG_ALLOC(n * ncol, double)) ||
!(gamma = nAG_ALLOC(lgamma, double)) ||
!(b = nAG_ALLOC(lb, double)) || !(se = nAG_ALLOC(lb, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Read in the Data matrix */
for (i = 1; i <= n; ++i) {
for (j = 1; j <= ncol; ++j) {
scanf("%lf", &DAT(i, j));
}
}
/* Read in the initial values for GAMMA */
for (i = 1; i < lgamma; ++i) {
scanf("%lf", &gamma[i - 1]);
}
/* Read in the maximum number of iterations */
scanf("%ld%*[^\n] ", &maxit);
/* Run the analysis */
tol = 0.;
warnp = 0;
/* nag_reml_mixed_regsn (g02jac).
* Linear mixed effects regression using Restricted Maximum
* Likelihood (REML)
*/
nag_reml_mixed_regsn(n, ncol, dat, tddat, levels, yvid, cwid, nfv, fvid,
fint, nrv, rvid, nvpr, vpr, rint, svid, gamma, &nff,
&nrf, &df, &like, lb, b, se, maxit, tol, &warnp,
&fail);
/* Report the results */
if (fail.code == NE_NOERROR) {
/* Output results */
if (warnp != 0) {
printf("Warning: At least one variance component was ");
printf("estimated to be negative and then reset to zero");
printf("\n");
}
printf("Fixed effects (Estimate and Standard Deviation)\n\n");
k = 1;
if (fint == 1) {
printf("Intercept %10.4f%10.4f\n", b[k - 1], se[k - 1]);
++k;
}
for (i = 1; i <= nfv; ++i) {
for (j = 1; j <= levels[fvid[i - 1] - 1]; ++j) {
if (levels[fvid[i - 1] - 1] != 1 && j == 1)
continue;
printf("Variable%4ld Level%4ld%10.4f%10.4f\n",
i, j, b[k - 1], se[k - 1]);
++k;
}
}
printf("\n");
printf("Random Effects (Estimate and Standard Deviation)\n");
if (svid == 0) {
for (i = 1; i <= nrv; ++i) {
for (j = 1; j <= levels[rvid[i - 1] - 1]; ++j) {
printf("%s%4ld%s%4ld%10.4f%10.4f\n",
"Variable", i, " Level", j, b[k - 1], se[k - 1]);
++k;
}
}
}
else {
for (l = 1; l <= levels[svid - 1]; ++l) {
if (rint == 1) {
printf("%s%4ld%s%10.4f%10.4f\n",
"Intercept for Subject Level", l, " ",
b[k - 1], se[k - 1]);
++k;
}
for (i = 1; i <= nrv; ++i) {
for (j = 1; j <= levels[rvid[i - 1] - 1]; ++j) {
printf("%s%4ld%s%4ld%s%4ld"
"%10.4f%10.4f\n", "Subject Level", l,
" Variable", i, " Level", j, b[k - 1], se[k - 1]);
++k;
}
}
}
}
printf("\n");
printf("%s\n", " Variance Components");
for (i = 1; i <= nvpr + rint; ++i) {
printf("%4ld%10.4f\n", i, gamma[i - 1]);
}
printf("%s%10.4f\n\n", "SIGMA^2 = ", gamma[nvpr + rint]);
printf("%s%10.4f\n\n", "-2LOG LIKE = ", like);
printf("%s%ld\n", "DF = ", df);
}
else {
printf("Routine nag_reml_mixed_regsn (g02jac) failed, with error "
"message:\n%s\n", fail.message);
}
END:
nAG_FREE(b);
nAG_FREE(dat);
nAG_FREE(gamma);
nAG_FREE(se);
nAG_FREE(fvid);
nAG_FREE(levels);
nAG_FREE(rvid);
nAG_FREE(vpr);
return exit_status;
}
