Keyword: 特異値分解, 部分最小二乗, PLS, 回帰
概要
本サンプルは特異値分解を用いた部分最小二乗(PLS)回帰の計算を行うC言語によるサンプルプログラムです。 本サンプルは以下に示されるデータについて部分最小二乗(PLS)回帰の計算を行います。
※本サンプルはnAG Cライブラリに含まれる関数 nag_pls_orth_scores_svd() のExampleコードです。本サンプル及び関数の詳細情報は nag_pls_orth_scores_svd のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_pls_orth_scores_svd のマニュアルページを参照)| このデータをダウンロード |
nag_pls_orth_scores_svd (g02lac) Example Program Data 15 15 1 Nag_PredStdScale 4 : n, mx, my, iscale, maxfac 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 : isx -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 1.9607 -1.6324 0.5746 1.9607 -1.6324 0.574 2.8369 1.4092 -3.1398 0.00 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 1.9607 -1.6324 0.5746 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 0.28 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 0.0744 -1.7333 0.0902 1.9607 -1.6324 0.5746 2.8369 1.4092 -3.1398 0.20 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 0.0744 -1.7333 0.0902 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 0.51 -2.6931 -2.5271 -1.2871 2.8369 1.4092 -3.1398 0.0744 -1.7333 0.0902 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 0.11 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 -4.7548 3.6521 0.8524 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 2.73 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 0.0744 -1.7333 0.0902 0.0744 -1.7333 0.0902 -1.2201 0.8829 2.2253 0.18 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 2.4064 1.7438 1.1057 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 1.53 -2.6931 -2.5271 -1.2871 0.0744 -1.7333 0.0902 0.0744 -1.7333 0.0902 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 -0.10 2.2261 -5.3648 0.3049 3.0777 0.3891 -0.0701 0.0744 -1.7333 0.0902 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 -0.52 -4.1921 -1.0285 -0.9801 3.0777 0.3891 -0.0701 0.0744 -1.7333 0.0902 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 0.40 -4.9217 1.2977 0.4473 3.0777 0.3891 -0.0701 0.0744 -1.7333 0.0902 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 0.30 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 2.2261 -5.3648 0.3049 2.2261 -5.3648 0.3049 2.8369 1.4092 -3.1398 -1.00 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 -4.9217 1.2977 0.4473 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 1.57 -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 -4.1921 -1.0285 -0.9801 0.0744 -1.7333 0.0902 2.8369 1.4092 -3.1398 0.59 : End of observations
- 1行目はタイトル行で読み飛ばされます。
- 2行目は観測値の数(n)、予測変数の数(mx)、応答変数の数(my)、予測変数のスケールの手法(iscale)、潜在変数の数(maxfac)を指定しています。"Nag_PredStdScale"はデータが変数の標準分散によってスケールされることを意味します。
- 3行目はどの予測変数がモデルに含まれるか(isx)を指定しています。
- 4〜33行目は予測変数の観測値(x)と応答変数の観測値(y)を指定しています。
出力結果
(本関数の詳細はnag_pls_orth_scores_svd のマニュアルページを参照)| この出力例をダウンロード |
nag_pls_orth_scores_svd (g02lac) Example Program Results
x-loadings, P
1 2 3 4
1 -0.6708 -1.0047 0.6505 0.6169
2 0.4943 0.1355 -0.9010 -0.2388
3 -0.4167 -1.9983 -0.5538 0.8474
4 0.3930 1.2441 -0.6967 -0.4336
5 0.3267 0.5838 -1.4088 -0.6323
6 0.0145 0.9607 1.6594 0.5361
7 -2.4471 0.3532 -1.1321 -1.3554
8 3.5198 0.6005 0.2191 0.0380
9 1.0973 2.0635 -0.4074 -0.3522
10 -2.4466 2.5640 -0.4806 0.3819
11 2.2732 -1.3110 -0.7686 -1.8959
12 -1.7987 2.4088 -0.9475 -0.4727
13 0.3629 0.2241 -2.6332 2.3739
14 0.3629 0.2241 -2.6332 2.3739
15 -0.3629 -0.2241 2.6332 -2.3739
x-scores, T
1 2 3 4
1 -0.1896 0.3898 -0.2502 -0.2479
2 0.0201 -0.0013 -0.1726 -0.2042
3 -0.1889 0.3141 -0.1727 -0.1350
4 0.0210 -0.0773 -0.0950 -0.0912
5 -0.0090 -0.2649 -0.4195 -0.1327
6 0.5479 0.2843 0.1914 0.2727
7 -0.0937 -0.0579 0.6799 -0.6129
8 0.2500 0.2033 -0.1046 -0.1014
9 -0.1005 -0.2992 0.2131 0.1223
10 -0.1810 -0.4427 0.0559 0.2114
11 0.0497 -0.0762 -0.1526 -0.0771
12 0.0173 -0.2517 -0.2104 0.1044
13 -0.6002 0.3596 0.1876 0.4812
14 0.3796 0.1338 0.1410 0.1999
15 0.0773 -0.2139 0.1085 0.2106
y-loadings, C
1 2 3 4
1 3.5425 1.0475 0.2548 0.1866
y-scores, U
1 2 3 4
1 -1.7670 0.1812 -0.0600 -0.0320
2 -0.6724 -0.2735 -0.0662 -0.0402
3 -0.9852 0.4097 0.0158 0.0198
4 0.2267 -0.0107 0.0180 0.0177
5 -1.3370 -0.3619 -0.0173 0.0073
6 8.9056 0.6000 0.0701 0.0422
7 -1.0634 0.0332 0.0235 -0.0151
8 4.2143 0.3184 0.0232 0.0219
9 -2.1580 -0.2652 0.0153 0.0011
10 -3.7999 -0.4520 0.0082 0.0034
11 -0.2033 -0.2446 -0.0392 -0.0214
12 -0.5942 -0.2398 0.0089 0.0165
13 -5.6764 0.5487 0.0375 0.0185
14 4.3707 -0.1161 -0.0639 -0.0535
15 0.5395 -0.1274 0.0261 0.0139
Explained Variance
Model effects Dependent variable(s)
16.902124 89.638060
29.674338 97.476270
44.332404 97.939839
56.172041 98.188474
- 2〜19行目にx ローディング(負荷量)が出力されています。
- 20〜37行目にx スコアが出力されています。
- 38〜41行目に y ローディング(負荷量)が出力されています。
- 42〜59行目にが yスコアが出力されています。
- 61〜66行目に説明分散(因子寄与)のモデル効果と従属変数について出力されています。予測変数の累積寄与率と応答変数の累積寄与率がそれぞれ出力されています。
ソースコード
(本関数の詳細はnag_pls_orth_scores_svd のマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
| このソースコードをダウンロード |
/* nag_pls_orth_scores_svd (g02lac) Example Program.
*
* CLL6I261D/CLL6I261DL Version.
*
* Copyright 2017 Numerical Algorithms Group.
*
* Mark 26.1, 2017.
*/
/* Pre-processor includes */
#include <stdio.h>
#include <math.h>
#include <nag.h>
#include <nag_stdlib.h>
#include <nagg02.h>
#include <nagx04.h>
int main(void)
{
/*Integer scalar and array declarations */
Integer exit_status = 0;
Integer i, ip, j, maxfac, mx, my, n;
Integer pdc, pdp, pdt, pdu, pdw, pdx, pdxres, pdy, pdycv, pdyres;
Integer *isx = 0;
/*Double scalar and array declarations */
double *c = 0, *p = 0, *t = 0, *u = 0, *w = 0, *x = 0, *xbar = 0;
double *xcv = 0, *xres = 0, *xstd = 0, *y = 0, *ybar = 0;
double *ycv = 0, *yres = 0, *ystd = 0;
/*Character scalar and array declarations */
char sscale[40];
/*nAG Types */
Nag_OrderType order;
Nag_ScalePredictor scale;
NagError fail;
INIT_FAIL(fail);
printf("nag_pls_orth_scores_svd (g02lac) Example Program Results\n");
/* Skip header in data file. */
scanf("%*[^\n] ");
/* Read data values. */
scanf("%ld%ld%ld%39s %ld%*[^\n] ",
&n, &mx, &my, sscale, &maxfac);
scale = (Nag_ScalePredictor) nag_enum_name_to_value(sscale);
if (!(isx = nAG_ALLOC(mx, Integer)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
for (j = 0; j < mx; j++)
scanf("%ld ", &isx[j]);
scanf("%*[^\n] ");
ip = 0;
for (j = 0; j < mx; j++) {
if (isx[j] == 1)
ip = ip + 1;
}
#ifdef nAG_COLUMN_MAJOR
pdc = my;
pdp = ip;
pdt = n;
pdu = n;
pdw = ip;
pdx = n;
#define X(I, J) x[(J-1)*pdx + I-1]
pdxres = n;
pdy = n;
#define Y(I, J) y[(J-1)*pdy + I-1]
pdycv = maxfac;
#define YCV(I, J) ycv[(J-1)*pdycv + I-1]
pdyres = n;
order = Nag_ColMajor;
#else
pdc = maxfac;
pdp = maxfac;
pdt = maxfac;
pdu = maxfac;
pdw = maxfac;
pdx = mx;
#define X(I, J) x[(I-1)*pdx + J-1]
pdxres = ip;
pdy = my;
#define Y(I, J) y[(I-1)*pdy + J-1]
pdycv = my;
#define YCV(I, J) ycv[(I-1)*pdycv + J-1]
pdyres = my;
order = Nag_RowMajor;
#endif
/* Assign parameter values to corresponding variables */
if (!(c = nAG_ALLOC(pdc * (order == Nag_RowMajor ? my : maxfac), double)) ||
!(p = nAG_ALLOC(pdp * (order == Nag_RowMajor ? ip : maxfac), double)) ||
!(t = nAG_ALLOC(pdt * (order == Nag_RowMajor ? n : maxfac), double)) ||
!(u = nAG_ALLOC(pdu * (order == Nag_RowMajor ? n : maxfac), double)) ||
!(w = nAG_ALLOC(pdw * (order == Nag_RowMajor ? ip : maxfac), double)) ||
!(x = nAG_ALLOC(pdx * (order == Nag_RowMajor ? n : mx), double)) ||
!(xbar = nAG_ALLOC(ip, double)) ||
!(xcv = nAG_ALLOC(maxfac, double)) ||
!(xres = nAG_ALLOC(pdxres * (order == Nag_RowMajor ? n : ip), double))
|| !(xstd = nAG_ALLOC(ip, double))
|| !(y = nAG_ALLOC(pdy * (order == Nag_RowMajor ? n : my), double))
|| !(ybar = nAG_ALLOC(my, double))
|| !(ycv =
nAG_ALLOC(pdycv * (order == Nag_RowMajor ? maxfac : my), double))
|| !(yres =
nAG_ALLOC(pdyres * (order == Nag_RowMajor ? n : my), double))
|| !(ystd = nAG_ALLOC(my, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Read data values. */
for (i = 1; i <= n; i++) {
for (j = 1; j <= mx; j++)
scanf("%lf ", &X(i, j));
for (j = 1; j <= my; j++)
scanf("%lf ", &Y(i, j));
}
scanf("%*[^\n] ");
/* Fit a PLS model. */
/*
* nag_pls_orth_scores_svd (g02lac)
* Partial least squares
*/
nag_pls_orth_scores_svd(order, n, mx, x, pdx, isx, ip, my, y, pdy, xbar,
ybar, scale, xstd, ystd, maxfac, xres, pdxres,
yres, pdyres, w, pdw, p, pdp, t, pdt, c, pdc, u,
pdu, xcv, ycv, pdycv, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_pls_orth_scores_svd (g02lac).\n%s\n",
fail.message);
exit_status = 1;
goto END;
}
/*
* nag_gen_real_mat_print (x04cac)
* Print real general matrix (easy-to-use)
*/
fflush(stdout);
nag_gen_real_mat_print(order, Nag_GeneralMatrix, Nag_NonUnitDiag, ip,
maxfac, p, pdp, "x-loadings, P", 0, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_gen_real_mat_print (x04cac).\n%s\n", fail.message);
exit_status = 1;
goto END;
}
/*
* nag_gen_real_mat_print (x04cac)
* Print real general matrix (easy-to-use)
*/
fflush(stdout);
nag_gen_real_mat_print(order, Nag_GeneralMatrix, Nag_NonUnitDiag, n,
maxfac, t, pdt, "x-scores, T", 0, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_gen_real_mat_print (x04cac).\n%s\n", fail.message);
exit_status = 1;
goto END;
}
/*
* nag_gen_real_mat_print (x04cac)
* Print real general matrix (easy-to-use)
*/
fflush(stdout);
nag_gen_real_mat_print(order, Nag_GeneralMatrix, Nag_NonUnitDiag, my,
maxfac, c, pdc, "y-loadings, C", 0, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_gen_real_mat_print (x04cac).\n%s\n", fail.message);
exit_status = 1;
goto END;
}
/*
* nag_gen_real_mat_print (x04cac)
* Print real general matrix (easy-to-use)
*/
fflush(stdout);
nag_gen_real_mat_print(order, Nag_GeneralMatrix, Nag_NonUnitDiag, n,
maxfac, u, pdu, "y-scores, U", 0, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_gen_real_mat_print (x04cac).\n%s\n", fail.message);
exit_status = 1;
goto END;
}
printf("\n");
printf("%s\n", "Explained Variance");
printf("%12s%24s\n", "Model effects", "Dependent variable(s)");
for (i = 1; i <= maxfac; i++) {
printf("%12.6f", xcv[i - 1]);
for (j = 1; j <= my; j++)
printf("%12.6f%s", YCV(i, j), j % 10 ? " " : "\n");
printf("\n");
}
END:
nAG_FREE(c);
nAG_FREE(p);
nAG_FREE(t);
nAG_FREE(u);
nAG_FREE(w);
nAG_FREE(x);
nAG_FREE(xbar);
nAG_FREE(xcv);
nAG_FREE(xres);
nAG_FREE(xstd);
nAG_FREE(y);
nAG_FREE(ybar);
nAG_FREE(ycv);
nAG_FREE(yres);
nAG_FREE(ystd);
nAG_FREE(isx);
return exit_status;
}
