Keyword: 特異値分解, 部分最小二乗, PLS, 回帰
概要
本サンプルは特異値分解を用いた部分最小二乗(PLS)回帰の計算を行うC#によるサンプルプログラムです。 本サンプルは以下に示されるデータについて部分最小二乗(PLS)回帰の計算を行います。
※本サンプルはnAG Library for .NETに含まれる関数 g02la() のExampleコードです。本サンプル及び関数の詳細情報は g02la のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はg02la のマニュアルページを参照)| このデータをダウンロード |
g02la Example Program Data 15 15 1 1 4 : N, MX, MY, SCALE, MAXFAC -2.6931 -2.5271 -1.2871 3.0777 0.3891 -0.0701 1.9607 -1.6324 0.5746 1.9607 -1.6324 0.5740 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 : ISX
- 1行目はタイトル行で読み飛ばされます。
- 2行目の1番目のパラメータ(n)は観測値の数を指定しています。2番目のパラメータ(mx)は予測変数の数を指定しています。3番目のパラメータ(my)は応答変数の数を指定しています。4番目のパラメータ(iscale)は予測変数のスケールの手法を指定しています。"1"はデータが変数の標準分散によってスケールされることを意味します。5番目のパラメータ(maxfac)は潜在変数の数を指定しています。
- 3〜47行目は予測変数の観測値(x)と応答変数の観測値(y)を指定しています。
- 48行目はどの予測変数がモデルに含まれるかを示すパラメータ(isx)を指定しています。
出力結果
(本関数の詳細はg02la のマニュアルページを参照)| この出力例をダウンロード |
g02la 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〜18行目にx ローディング(負荷量)が出力されています。
- 19〜35行目にx スコアが出力されています。
- 36〜38行目に y ローディング(負荷量)が出力されています。
- 39〜55行目にが yスコアが出力されています。
- 57〜62行目に説明分散(因子寄与)のモデル効果と従属変数について出力されています。予測変数の累積寄与率と応答変数の累積寄与率がそれぞれ出力されています。
ソースコード
(本関数の詳細はg02la のマニュアルページを参照)
※本サンプルソースコードは .NET環境用の科学技術・統計計算ライブラリである「nAG Library for .NET」の関数を呼び出します。
サンプルのコンパイル及び実行方法
| このソースコードをダウンロード |
// g02la Example Program Text
// C# version, nAG Copyright 2008
using System;
using NagLibrary;
using System.IO;
namespace NagDotNetExamples
{
public class G02LAE
{
static bool defaultdata = true;
static string datafile = "";
static void Main(String[] args)
{
if (args.Length == 1)
{
defaultdata = false;
datafile = args[0];
}
StartExample();
}
public static void StartExample()
{
try
{
DataReader sr = null;
if (defaultdata)
{
sr = new DataReader("exampledata/g02lae.d");
}
else
{
sr = new DataReader(datafile);
}
int i, ip, iscale, j, maxfac, mx, my, n; int ifail;
Console.WriteLine("g02la Example Program Results");
// Skip header in data file.
sr.Reset();
// Read data values.
sr.Reset();
n = int.Parse(sr.Next());
mx = int.Parse(sr.Next());
my = int.Parse(sr.Next());
iscale = int.Parse(sr.Next());
maxfac = int.Parse(sr.Next());
double[,] x = new double[n, mx];
double[,] y = new double[n, my];
int[] isx = new int[mx];
// Check array limits
if (n <= 1 || mx <1 || my < 1)
{
Console.Write(" ** Problem size is too small.");
goto L80;
}
// Read data values.
for (i = 1; i <= n; i++)
{
sr.Reset();
for (j = 1; j <= mx; j++)
{
x[i - 1, j - 1] = double.Parse(sr.Next());
}
for (j = 1; j <= my; j++)
{
y[i - 1, j - 1] = double.Parse(sr.Next());
}
}
sr.Reset();
for (j = 1; j <= mx; j++)
{
isx[j - 1] = int.Parse(sr.Next());
}
ip = 0;
for (j = 1; j <= mx; j++)
{
if (isx[j - 1] == 1)
{
ip = ip + 1;
}
}
double[,] c = new double[my, maxfac];
double[,] p = new double[ip, maxfac];
double[,] t = new double[n, maxfac];
double[,] u = new double[n, maxfac];
double[,] w = new double[ip, maxfac];
double[] xbar = new double[ip];
double[] xcv = new double[maxfac];
double[,] xres = new double[n, ip];
double[] xstd = new double[ip];
double[] ybar = new double[my];
double[,] ycv = new double[maxfac, maxfac];
double[,] yres = new double[n, my];
double[] ystd = new double[my];
// Fit a pls model.
G02.g02la(n, mx, x, isx, ip, my, y, xbar, ybar, iscale, xstd, ystd, maxfac, xres, yres, w, p, t,
c, u, xcv, ycv, out ifail);
if (ifail != 0)
{
Console.WriteLine("** g02la failed with ifail = {0,5}", ifail);
goto L80;
}
X04.x04ca("G", "X", ip, maxfac, p, "x-loadings, P", out ifail);
X04.x04ca("G", "X", n, maxfac, t, "x-scores, T", out ifail);
X04.x04ca("G", "X", my, maxfac, c, "y-loadings, C", out ifail);
X04.x04ca("G", "X", n, maxfac, u, "y-scores, U", out ifail);
Console.WriteLine(" ");
Console.WriteLine(" {0}", "Explained Variance");
Console.WriteLine(" {0,12} {1,24}", "Model effects", "Dependent variable(s)");
for (i = 1; i <= maxfac; i++)
{
Console.Write(" {0, 12:f6} ", xcv[i - 1]);
for (j = 1; j <= my; j++)
{
Console.Write(" {0, 12:f6}", ycv[i - 1, j - 1]);
}
Console.WriteLine(" ");
}
//
L80: ;
//
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.Write( "Exception Raised");
}
}
}
}
