Keyword: 指数平滑化, ホルトウィンタース, 線形ホルト, 2重指数平滑化, Holt Winters
概要
本サンプルはC言語により指数平滑化による予測を行うプログラムです。 入力データとして11個の観察データと指数平滑パラメータ(α、γ、φ)を与え、5ステップ分の予測を行います。

以下のプログラム例では線形ホルト指数平滑化を利用して予測を行いますが、その他に単純指数平滑化、ブラウン2重指数平滑化、ホルトウィンタース乗法、ホルトウィンタース加法の各平滑化法にも対応しています。
※本サンプルはnAG Cライブラリに含まれる関数nag_tsa_exp_smooth()のExampleコードです。本サンプル及び関数の詳細情報はnag_tsa_exp_smoothのマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_tsa_exp_smoothのマニュアルページを参照)| このデータをダウンロード |
nag_tsa_exp_smooth (g13amc) Example Program Data Nag_EstimateInitialValues Nag_LinearHolt 11 5 : mode,itype,n,nf 180 135 213 181 148 204 228 225 198 200 187 : y dependent arguments for itype = Nag_LinearHolt 0.01 1.0 1.0 : param[0],param[1],param[2] dependent arguments for mode = Nag_ContinueAndUpdate 11 : k
- 1行目はタイトル行で読み飛ばされます。
- 2行目では初期値の与え方 (mode=Nag_EstimateInitialValues)、平滑化の手法 (itype=Nag_LinearHolt)、観察データ数 (n=11)、予測を行いステップ数 (nf=5)を与えます。コロン(:)以降は無視されます。
- 3行目で観察データの値(y)を与えます。コロン(:)以降は無視されます。
- 4行目は読み飛ばされます。
- 5行目では指数平滑化パラメータ(param)としてα(=0.01)、γ(=1.0)、φ(=1.0)を与えています。コロン(:)以降は無視されます。
- 6行目は読み飛ばされます。
- 7行目は初期値の推定に使用する観察データ数 (k=11)を与えています。コロン(:)以降は無視されます。
出力結果
(本関数の詳細はnag_tsa_exp_smoothのマニュアルページを参照)| この出力例をダウンロード |
nag_tsa_exp_smooth (g13amc) Example Program Results
Initial values used:
1 168.018
2 3.800
Mean Deviation = 2.5473e+01
Absolute Deviation = 2.1233e+01
Observed 1-Step
Period Values Forecast Residual
1 180.000 171.818 8.182
2 135.000 175.782 -40.782
3 213.000 178.848 34.152
4 181.000 183.005 -2.005
5 148.000 186.780 -38.780
6 204.000 189.800 14.200
7 228.000 193.492 34.508
8 225.000 197.732 27.268
9 198.000 202.172 -4.172
10 200.000 206.256 -6.256
11 187.000 210.256 -23.256
Forecast Standard
Period Values Errors
12 213.854 25.473
13 217.685 25.478
14 221.516 25.490
15 225.346 25.510
16 229.177 25.542
- 1行目はタイトルです
- 3〜4行目は計算に使われた初期値です。
- 6行目は平均偏差、7行目は絶対偏差で双方ともモデルの当てはまり具合を示しています。小さい値であればあるほど当てはまりが良いことを示します。
- 11行目〜21行目は観察値、1ステップ予測、及び残差を示します。
- 25行目〜29行目は5ステップ分の予測値とその標準誤差を示します。
ソースコード
(本関数の詳細はnag_tsa_exp_smoothのマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
| このソースコードをダウンロード |
/* nag_tsa_exp_smooth (g13amc) 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 <nagg13.h>
int main(void)
{
/* Integer scalar and array declarations */
Integer exit_status = 0;
Integer i, ival, k, n, nf, p;
/* Double scalar and array declarations */
double ad, dv;
double *fse = 0, *fv = 0, *init = 0, *param = 0, *r = 0, *res = 0;
double *y = 0, *yhat = 0;
/* Character scalar and array declarations */
char smode[40], sitype[40];
/* nAG structures */
Nag_InitialValues mode;
Nag_ExpSmoothType itype;
NagError fail;
/* Initialize the error structure */
INIT_FAIL(fail);
printf("nag_tsa_exp_smooth (g13amc) Example Program Results\n");
/* Skip headings in data file */
scanf("%*[^\n] ");
/* Read in the initial arguments */
scanf("%39s%39s%ld%ld%*[^\n] ", smode, sitype, &n, &nf);
/*
* nag_enum_name_to_value (x04nac).
* Converts nAG enum member name to value
*/
mode = (Nag_InitialValues) nag_enum_name_to_value(smode);
itype = (Nag_ExpSmoothType) nag_enum_name_to_value(sitype);
if (!(fse = nAG_ALLOC(nf, double)) ||
!(fv = nAG_ALLOC(nf, double)) ||
!(res = nAG_ALLOC(n, double)) ||
!(y = nAG_ALLOC(n, double)) || !(yhat = nAG_ALLOC(n, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Read in the observed data */
for (i = 0; i < n; i++)
scanf("%lf ", &y[i]);
scanf("%*[^\n] ");
/* Read in the itype dependent arguments (skipping headings) */
scanf("%*[^\n] ");
if (itype == Nag_SingleExponential) {
/* Single exponential smoothing required */
if (!(param = nAG_ALLOC(1, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
scanf("%lf%*[^\n] ", ¶m[0]);
p = 0;
ival = 1;
}
else if (itype == Nag_BrownsExponential) {
/* Browns exponential smoothing required */
if (!(param = nAG_ALLOC(2, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
scanf("%lf %lf%*[^\n] ", ¶m[0], ¶m[1]);
p = 0;
ival = 2;
}
else if (itype == Nag_LinearHolt) {
/* Linear Holt smoothing required */
if (!(param = nAG_ALLOC(3, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
scanf("%lf %lf %lf%*[^\n] ", ¶m[0], ¶m[1], ¶m[2]);
p = 0;
ival = 2;
}
else if (itype == Nag_AdditiveHoltWinters) {
/* Additive Holt Winters smoothing required */
if (!(param = nAG_ALLOC(4, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
scanf("%lf %lf %lf %lf %ld%*[^\n] ", ¶m[0], ¶m[1],
¶m[2], ¶m[3], &p);
ival = p + 2;
}
else if (itype == Nag_MultiplicativeHoltWinters) {
/* Multiplicative Holt Winters smoothing required */
if (!(param = nAG_ALLOC(4, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
scanf("%lf %lf %lf %lf %ld%*[^\n] ", ¶m[0], ¶m[1],
¶m[2], ¶m[3], &p);
ival = p + 2;
}
else {
printf("%s is an unknown type\n", sitype);
exit_status = -1;
goto END;
}
/* Allocate some more memory */
if (!(init = nAG_ALLOC(p + 2, double)) || !(r = nAG_ALLOC(p + 13, double)))
{
printf("Allocation failure\n");
exit_status = -1;
goto END;
}
/* Read in the mode dependent arguments (skipping headings) */
scanf("%*[^\n] ");
if (mode == Nag_InitialValuesSupplied) {
/* User supplied initial values */
for (i = 0; i < ival; i++)
scanf("%lf ", &init[i]);
scanf("%*[^\n] ");
}
else if (mode == Nag_ContinueAndUpdate) {
/* Continuing from a previously saved R */
for (i = 0; i < p + 13; i++)
scanf("%lf ", &r[i]);
scanf("%*[^\n] ");
}
else if (mode == Nag_EstimateInitialValues) {
/* Initial values calculated from first k observations */
scanf("%ld%*[^\n] ", &k);
}
else {
printf("%s is an unknown mode\n", smode);
exit_status = -1;
goto END;
}
/* Call the library routine to smooth the series */
nag_tsa_exp_smooth(mode, itype, p, param, n, y, k, init, nf, fv, fse, yhat,
res, &dv, &ad, r, &fail);
if (fail.code != NE_NOERROR) {
printf("Error from nag_tsa_exp_smooth (g13amc).\n%s\n", fail.message);
exit_status = 1;
goto END;
}
/* Display the output */
printf("Initial values used:\n");
for (i = 0; i < ival; i++)
printf("%4ld %12.3f \n", i + 1, init[i]);
printf("\n");
printf("Mean Deviation = %13.4e\n", dv);
printf("Absolute Deviation = %13.4e\n", ad);
printf("\n");
printf(" Observed 1-Step\n");
printf(" Period Values Forecast Residual\n");
for (i = 0; i < n; i++)
printf("%4ld %12.3f %12.3f %12.3f\n", i + 1, y[i],
yhat[i], res[i]);
printf("\n");
printf(" Forecast Standard\n");
printf(" Period Values Errors\n");
for (i = 0; i < nf; i++)
printf("%4ld %12.3f %12.3f \n", n + i + 1, fv[i], fse[i]);
END:
nAG_FREE(fse);
nAG_FREE(fv);
nAG_FREE(init);
nAG_FREE(param);
nAG_FREE(r);
nAG_FREE(res);
nAG_FREE(y);
nAG_FREE(yhat);
return exit_status;
}
