本記事は、 U-TOKYO AP Advent Calendar 2018 の3日目です。
サロゲートデータの作り方を解説します。
解説の後に Matlab のソースコードを付けています。
目次
- はじめに
- Random shuffle surrogates
- Fourier transform surrogates
- Amplitude adjusted Fourier transform surrogates
- Iterated amplitude adjusted Fourier transform surrogates
はじめに
サロゲートデータとは
時系列データ
サロゲートデータとは、
記号・用語の定義
時系列データ
時系列データを小文字のアルファベットで表します。
実数値を取る時系列
以下、元のデータを
虚数単位
離散 Fourier 変換
本記事では離散 Fourier 変換しか登場しないので、離散 Fourier 変換のことを単に Fourier 変換と呼びます。
変換後の係数は大文字のアルファベットで表します:
逆離散 Fourier 変換
振幅
Fourier 変換の絶対値
位相
Fourier 変換の偏角
パワースペクトル
Fourier 変換の絶対値の2乗
パワースペクトルはその周波数成分のエネルギーを表しています。
Random shuffle (RS) surrogates
Random shuffle surrogates は、
つまり、
で表されます。
RS サロゲートは時系列の分布を保存します。
function y = rssurrogate(x)
perm = randperm(length(x));
y = x(perm);
end
Fourier transform (FT) surrogates
RS サロゲートはパワースペクトルを保存しません。
つまり、
FT サロゲート(phase-randomised surrogates とも言います)は、元の時系列を Fourier 変換し、振幅は保存しつつ位相をランダムに変えて、逆 Fourier 変換したものです。
作り方は次の通りです。
-
を Fourier 変換する。 -
各
の位相をランダムに変換する。
次のステップ3で逆 Fourier 変換した際にきちんと実数値の時系列になるように、前半はランダムに位相を変換し、後半は逆位相となるように変換する。
実装上は、時系列の長さ が偶数か奇数かによって分けて考える。
を独立な 上の一様乱数とする。 が偶数のとき はそのまま , , に対して , に対して .
が奇数のとき はそのまま , に対して , に対して .
-
を逆 Fourier 変換する。
ステップ2で、位相は変わりますが、振幅は
従って、 FT サロゲートのパワースペクトルは、元のデータのパワースペクトルと一致します。
function z = ftsurrogate(x)
y = fft(x);
n = length(x);
if mod(n, 2) == 0
l = n/2 - 1;
r = exp(2i*pi*rand(l,1));
v = [1; r; 1; flip(conj(r))];
else
l = (n-1)/2;
r = exp(2i*pi*rand(l,1));
v = [1; r; flip(conj(r))];
end
z = ifft(y.*v);
end
Amplitude adjusted Fourier transform (AAFT) surrogates
FT サロゲートは、パワースペクトルを保存する一方で、データの分布を変えてしまいます。
AAFT サロゲートは、データの分布を保存しながら、パワースペクトルもあまり変化しないように工夫したサロゲートです。
作り方は次の通りです。
標準正規分布
に従う乱数を 個発生させ、 と同じ大小関係になるように並べ替えたものを とする。すなわち、 . のFT サロゲート を作る。元の時系列
を、大小関係が と同じになるように並べ替えたものが AAFT サロゲートである。
すなわち、 を小さい順に並べたものを とし、 が の 番目に小さい要素であるとき と書くことにすると、 .
AAFT サロゲートは、元の時系列を並べ替えたものなので、分布は保存されています。
さらに、パワースペクトルも、元のデータのパワースペクトルに近いものが得られます。
function z = aaftsurrogate(x)
n = length(x);
r = sort(randn(n,1));
[y, I] = sort(x);
[I2, J] = sort(I);
g = r(J);
h = ftsurrogate(g);
[h2, K] = sort(h);
[K2, L] = sort(K);
z = y(L);
end
Iterated amplitude adjusted Fourier transform (IAAFT) surrogates
通常の AAFT サロゲートよりも、さらにパワースペクトルを元の時系列に近づけたのが IAAFT サロゲートです。
サロゲートデータのパワースペクトルが元のデータのパワースペクトルに近づくように並べ替える操作を繰り返して作ります。
の RS サロゲート又は AAFT サロゲートを作り、これを初期値 とする。-
以下を
が変化しなくなる(つまり になる)まで繰り返す。-
を Fourier 変換する。 -
振幅を元のデータの振幅で置き換えたものを
とする。 -
を逆 Fourier 変換する。 -
の大小関係を使って を並べ替える。
-
反復後の
が IAAFT サロゲートである。
function z = iaaftsurrogate(x)
[sx, I] = sort(x);
c = abs(fft(x));
% y = rssurrogate(x); % 初期値RSサロゲート
y = aaftsurrogate(x); % 初期値AAFTサロゲート
count = 0;
while(count < 100) % 繰り返しは100回まで
count = count + 1
f = fft(y);
g = c.*f./abs(f);
h = ifft(g);
[h2, K] = sort(h);
[K2, L] = sort(K);
z = sx(L);
if(z == y)
break
end
y = z;
end
end
参考文献
- Theiler, J., Eubank, S., Longtin, A., Galdrikian, B., & Farmer, J. D. (1992). Testing for nonlinearity in time series: the method of surrogate data. Physica D: Nonlinear Phenomena, 58(1-4), 77-94.
- Schreiber, T., & Schmitz, A. (1996). Improved Surrogate Data for Nonlinearity Tests. Physical Review Letters, 77(4), 635.
- Schreiber, T., & Schmitz, A. (2000). Surrogate time series. Physica D: Nonlinear Phenomena, 142(3-4), 346-382.
-
正確には、振幅の定数倍です。 ↩
コメント
いいね以上の気持ちはコメントで