ログイン新規登録

Qiitaにログインして、便利な機能を使ってみませんか?

あなたにマッチした記事をお届けします

便利な情報をあとから読み返せます

10
12

この記事は最終更新日から5年以上が経過しています。

サロゲートデータ生成

最終更新日 投稿日 2018年12月03日

本記事は、 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

はじめに

サロゲートデータとは

時系列データ x=(x0,x1,,xN1) が与えられたとします。
サロゲートデータとは、 x の「特徴」の一部だけを保存した時系列 s=(s0,s1,,sN1) のことです。

記号・用語の定義

時系列データ
時系列データを小文字のアルファベットで表します。
実数値を取る時系列 x=(x0,x1,,xN1)RN を考えます。
以下、元のデータを x, サロゲートデータを s と書きます。

虚数単位
i=1 とアップライト体で書きます。(イタリック体の i は反復回数のインデックスとして使います。)

離散 Fourier 変換
本記事では離散 Fourier 変換しか登場しないので、離散 Fourier 変換のことを単に Fourier 変換と呼びます。
変換後の係数は大文字のアルファベットで表します:

Xk=DFT[xn]=1Nn=0N1xnexp(i2πknN),k=1,,N1.

逆離散 Fourier 変換

xn=DFT1[Xk]=1Nn=0N1Xkexp(i2πknN),n=1,,N1.

振幅
Fourier 変換の絶対値 |Xk| を振幅と呼びます1

位相
Fourier 変換の偏角 argXk を位相 (phase) と呼びます。

パワースペクトル
Fourier 変換の絶対値の2乗 |Xk|2 をパワースペクトルと呼びます。
パワースペクトルはその周波数成分のエネルギーを表しています。

Random shuffle (RS) surrogates

Random shuffle surrogates は、 x0,x1,,xN1 をランダムに入れ替えたサロゲートデータです。
つまり、 p=(p0,p1,,pN1){0,1,,N1} の順列(置換)として、

sn=xpn,n=0,1,,N1

で表されます。
RS サロゲートは時系列の分布を保存します。

rssurrogate.m
function y = rssurrogate(x)
    perm = randperm(length(x));
    y = x(perm);
end

Fourier transform (FT) surrogates

RS サロゲートはパワースペクトルを保存しません。
つまり、 x の Fourier 変換の振幅 |X|s の Fourier 変換の振幅 |S| は全く別のものとなります。
FT サロゲート(phase-randomised surrogates とも言います)は、元の時系列を Fourier 変換し、振幅は保存しつつ位相をランダムに変えて、逆 Fourier 変換したものです。
作り方は次の通りです。

  1. x を Fourier 変換する。

    Xk=1Nn=0N1xnexp(i2πknN)
  2. Xk の位相をランダムに変換する。
    次のステップ3で逆 Fourier 変換した際にきちんと実数値の時系列になるように、前半はランダムに位相を変換し、後半は逆位相となるように変換する。
    実装上は、時系列の長さ N が偶数か奇数かによって分けて考える。
    uk を独立な [0,1] 上の一様乱数とする。

    • N が偶数のとき
      • k=0,N/2 はそのまま X^0=X0, X^N/2=XN/2,
      • k=1,,N/21 に対して X^k=Xkexp(i2πuk),
      • k=N/2+1,,N1 に対して X^k=Xkexp(i2πuNk).
    • N が奇数のとき
      • k=0 はそのまま X^0=X0,
      • k=1,,(N1)/2 に対して X^k=Xkexp(i2πuk),
      • k=(N+1)/2,,N1 に対して X^k=Xkexp(i2πuNk).
  3. X^k を逆 Fourier 変換する。

    sn=1Nn=0N1X^kexp(i2πknN)

ステップ2で、位相は変わりますが、振幅は |Xk|=|X^k| と保存されます。
従って、 FT サロゲートのパワースペクトルは、元のデータのパワースペクトルと一致します。

ftsurrogate.m
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 サロゲートは、データの分布を保存しながら、パワースペクトルもあまり変化しないように工夫したサロゲートです。
作り方は次の通りです。

  1. 標準正規分布 N(0,1) に従う乱数を N 個発生させ、x と同じ大小関係になるように並べ替えたものを g とする。すなわち、g0<g1<<gN1.

  2. g のFT サロゲート g^ を作る。

  3. 元の時系列 x を、大小関係が g^ と同じになるように並べ替えたものが AAFT サロゲートである。
    すなわち、 x を小さい順に並べたものを x とし、 g^ng^i 番目に小さい要素であるとき rankg^n=i1 と書くことにすると、 sn=xrankg^n.

AAFT サロゲートは、元の時系列を並べ替えたものなので、分布は保存されています。
さらに、パワースペクトルも、元のデータのパワースペクトルに近いものが得られます。

aaftsurrogate.m
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 サロゲートです。
サロゲートデータのパワースペクトルが元のデータのパワースペクトルに近づくように並べ替える操作を繰り返して作ります。

  1. x の RS サロゲート又は AAFT サロゲートを作り、これを初期値 s(0) とする。

  2. 以下を s(i) が変化しなくなる(つまり s(i)=s(i1) になる)まで繰り返す。

    1. s(i) を Fourier 変換する。

      Sk(i)=1Nn=0N1sn(i)exp(i2πknN)
    2. 振幅を元のデータの振幅で置き換えたものを S^(i) とする。

      S^k(i)=|Xk||Sk(i)|Sk(i)
    3. S^(i) を逆 Fourier 変換する。

      s^n(i)=1Nn=0N1S^k(i)exp(i2πknN)
    4. s^(i) の大小関係を使って x を並べ替える。

      sn(i+1)=xranks^n(i)
    5. ii+1

  3. 反復後の s(i) が IAAFT サロゲートである。

iaaftsurrogate.m
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.

  1. 正確には、振幅の定数倍です。 

10
12
0

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
  3. ダークテーマを利用できます
ログインすると使える機能について
aya-chan

@aya-chan(Aya)

時系列解析に関心を持つ会社員です。 (元:東京大学大学院情報理工学系研究科)

コメント

この記事にコメントはありません。

いいね以上の気持ちはコメントで

記事投稿キャンペーン開催中

アクセシビリティの知見を発信しよう!

~
詳細を見る

音声認識APIを使ってみよう!

~
詳細を見る
10
12

ログインして続ける

ソーシャルアカウントでログイン・新規登録

メールアドレスでログイン・新規登録