時系列解析の方法
私のおおざっぱな理解。時間につれて変化する値から、周期などを自動的に得る方法。
Dec. 6, 2004
コサイナー法 cosinor method
時系列信号に余弦曲線を最小二乗法であてはめ、周期、振幅、頂点位相を求める方法。
線形回帰のように定式化できるかと思って5分ほどやってみたが、めんどうで飽きた。
勾配法かなんか、繰り返し計算でやるのが楽でよい。
しかしどんな信号にもとりあえず当てはめてしまうので、
当てはまり具合を判定する必要があり、
またパラメータ探索の初期値依存がかなり高いので、
いったんDFTやって初期値の目星を付けるとか、やっぱり現場の経験が欠かせない。
gnuplot> f(x) = a*cos(6.2832/b*x+c)
gnuplot> fit f(x) 'data.txt' via a, b, c
...
a = ... # 振幅、fと同じ単位
b = ... # 周期、xと同じ単位
c = ... # 位相、xと同じ単位
gnuplot>
自己相関 auto correlation method
信号を複製して、一方では時刻にオフセットを加え、
元の信号と時刻が共通する点だけで相関係数を計算し、
相関係数が極大になるオフセットの大きさをもって周期とみなす方法。
オフセットが大きくなるにつれ相関係数を計算する点数が減り、
信頼性が下がるので、大きな周期は見つけられない。
またこの方法だけでは振幅と位相は決められない。
フーリエ変換 Fourier transform
時系列信号をフーリエ級数に展開して、
どの周波数成分がどの程度寄与しているかをスペクトルとして表現する方法。
これだけでは振幅と位相は決められない。
- フーリエ変換 Fourier transform
連続した時系列値を無限級数に変換する。各項は周期が整数比の三角関数。
連続とは数学的な意味ではなく、値が未定義の点がないという意味。
導関数や微分係数は関知しない。
- 離散フーリエ変換 Discrete Fourier Transform (DFT)
- サンプリング点数が有限の時系列信号を、有限項数の三角関数の和に変換する。
サンプリングは等間隔。サンプルがn点なら、
三角関数にかかる係数がn-1個と定数項が一つでn個の係数が決まる。
定数項を除く各係数は複素数で、実部がcosの、虚部がsinの係数になる。
nが偶数なら、もっとも高周波数に当たる三角関数の係数は実数で、
定数項と同じ値になる。
一つの複素係数がかかるcosとsinは同じ周期である。
複素係数の絶対値をスペクトルとし、
横軸を周波数、縦軸をスペクトルの大きさとしてプロットすると、
nが偶数ならスペクトルはx軸に関して対称、奇数ならx=0を除いて対称になる。
- 三角関数の周期は、サンプルの全時間と点数によって決まる。
Tをサンプルの全時間とすると、係数が与えられる三角関数の周期はtを整数として
T/t (1 &le t &le n-1)のn-1個で、
5分間に100点(観察開始点を含む)観察すると、
周期が3秒以下の波(3秒の波を含む)は検知されない。
- 注目している周期xがあるとき、サンプル時間とサンプル数によっては、
T/t = xとならないことがある。
そのときは信号の前後に適宜0を追加し(zero padding)、Tを大きくして調整する。
数時間間隔のサンプルから概日周期の遺伝子を探したい、などという時には、
Tが24の倍数になるように0を追加する。
- 高速フーリエ変換 Fast Fourier Transform (FFT)
サンプル数が2の累乗の時にだけ使える、高速なDFTアルゴリズム。
得られるものはDFTと同じ。