Topへ戻る 

05:データ観察1(時系列データ解析)

フィルタ処理(移動平均,自己相関係数による周期性の観察)


簡単なフィルタ処理
オリジナルの南方振動指数には、短周期変動が混在している。
ここでは、簡単なフィルタ処理を行い、比較的長周期の変動を抽出してみる。
今回扱うフィルタ処理は、「移動平均」である。
処理は2段階に分けて行う。


(1)121か月(10年分)移動平均の計算
はじめに、121か月(つまり10年)の移動平均を行う。
時系列データの順番をNで表す場合、
N=1~121の平均、N=2~122の平均、N=3~123・・・
と121個分のウィンドウを移動させながら、平均を求めていく。
この処理を行うことで10年以内の周期を取り除く。
※現代においてはあまり用いない。フーリエ変換などをベースにフィルタ処理を行うのが一般的



(2)SOI時系列から121か月(10年分)移動平均を引く
次に、オリジナルのSOI時系列から、121か月移動平均の成分を除去する。
この処理により、SOI時系列科10年以上のゆったりとした長周期変動を取り除く。
この時点でSOI時系列データは、10年以内の変動成分しかもっていない、としたい。
※121か月移動平均のデータは前後60か月分、つまり120か月分のデータを失っていることに注意。


(3)さらに13か月の移動平均を行う
次に13か月移動平均を施すことで、1年以内の変動成分(例えば季節変動)を除去する。



 サンプルコードはここ




GMTで描くSOI時系列(オリジナルと処理後)

gmt begin SOItimeseries
gmt set FONT_HEADING 24p
gmt basemap -R1951/2023/-4/4 -JX15c/7c -Bxaf5+l"Date" -Byaf0.5+l"Southern Oscillation Index"
gmt plot SOItimeseries.txt -R1951/2023/-4/4 -W0.2p -Bxag5 -Byag0.5 -BWSne+gazure1 -lSOI
gmt plot SOItimeseries.txt -Sc0.1c -Gwhite -W0.2p,black
gmt plot SOIsmoothed.txt -W0.8p,red -lSOI_smoothed
gmt legend -DjBL+o0.3c -F+gwhite+pthicker --FONT_ANNOT_PRIMARY=10p,Helvetica-Bold
gmt end show









自己相関係数
 

まず相関係数を理解しよう。ベクトルがわかっていれば問題なし。
相関係数についてはここを参照
標準偏差と共分散がわかっていればどうってことはない。
変数XとYの相関係数は、XとYの共分散をそれぞれの標準偏差で割ればよい。

自己相関を求めるコード(ラグ相関)

このままでは同時相関しかも求められません。

c============================================
C This code reads sea level purresure dataset
C from NOAA & cal Southern Oscillation Index!
C K.Mizobata
C 2024.03.28
c============================================
C234567--------------------------------------
    character*120 header
    real*8 date(732),SOI1(732)! smoothed data
    real*8 SOI2(732)! smoothed data
    real*8 COR(160) ! for correlation coeff.

!------ input "smothing" data ------!
    open(10,file="SOIsmoothed.txt")
    !do k=1,732!
    do k=1,576  ! until Jun 2014
    read(10,*) date(k),SOI1(k)
    SOI2(k)=SOI1(k) ! copy!!
    enddo
    close(10) !<-- caution: should be closed

!=============================
! START CAL AutoCorrel
    open(20,file="AutoCor.txt")
    do i=1,160 !ラグを制御
!=============================

!------ cal mean -----!
    icount=0
    ave1=0; ave2=0;
    !do k=1,732 ! all data
    do k=1,576 ! until Jun 2014
    ave1=ave1+SOI1(k) ! 合計の計算
    ave2=ave2+SOI2(k)
    icount=icount+1
    enddo

    ave1=ave1/real(icount) ! 平均の計算
    ave2=ave2/real(icount)

!------ cal mean -----!
    var1=0; var2=0; covar=0
    std1=0; std2=0;
    !do k=1,732
    do k=1,576
    var1=var1+(SOI1(k)-ave1)**2
    var2=var2+(SOI2(k)-ave2)**2
    covar=covar+(SOI1(k)-ave1)*(SOI2(k)-ave2)
    enddo

    var1=var1/real(icount) ! 分散
    std1=sqrt(var1) ! 標準偏差
    var2=var2/real(icount)
    std2=sqrt(var2)
    covar=covar/real(icount) ! 共分散

    COR(i)=0 ! ゼロリセット
    COR(i)=covar/std1/std2
    !write(*,*) ave1,ave2,var1,var2,std1,std2,covar
    write(*,*) "COR(",i,")=",COR(i)
    write(20,*) i,COR(i)

!=============================
! FINISH CAL AutoCorrel
    enddo
    close(20)
!=============================
    stop !<---- we need to add it ALWAYS!
    end






GMTで自己相関係数 

gmt begin AuoCor
gmt set FONT_HEADING 24p
gmt basemap -R1/160/-0.5/1 -JX15c/7c -Bxaf5+l"Lag(month)" -Byaf0.5+l"Correlation coeff."
gmt plot AutoCor.txt -R1/160/-0.5/1 -W0.2p -Bxag5 -Byag0.5 -BWSne -lCorrelation
gmt plot AutoCor.txt -Sc0.1c -Gwhite -W0.2p,black
gmt legend -DjTR+o0.5c -F+gwhite+pthicker --FONT_ANNOT_PRIMARY=10p,Helvetica-Bold
gmt end show