Topへ戻る 

13: データ分析(時空間解析4): ラグ相関 (関連性・仮説検証・知識発見・原因究明・可視化)

時空間方向のラグ相関

対象海域における「ある変数」の空間代表性、卓越する時空間変動を理解する。
「ある変数」はなんでもよいが、ここでは海洋のデータを扱っているので、
衛星観測値の中でも密度(水温と塩分の関数)の逆数の積分、つまり
水柱の情報を
反映する海面高度
を用いることにする。




(実践)
まずは図を示す。以下の図は北緯27度、東経127度の海面高度偏差と周囲の海域における海面高度偏差との相関係数の分布図である。混乱すると思うので、今回は南北方向のみ考える。
X軸は空間方向のラグ、Y軸は時間方向のラグを示している。
たとえば
X=0、Y=0(時間のラグなし)における相関係数は「1」
X=100km、Y=0(時間のラグなし)における相関係数は「0.7」程度
X=100km、Y=2(2か月のラグ)における相関係数は「0.1」程度



時間方向のラグで考えると同じ場所でも1か月ズレると相関係数は落ちる。

ここでは、黒潮&黒潮続流域で切り出した海面高度データを使用する(Teamsで配布済み)
端的に言えば、自分が指定したグリッドの海面高度偏差時系列と、南北方向にズレた海域における海面高度偏差時系列との相関係数(同時相関・ラグ相関の双方)を計算する。

以下はFortranのサンプルコード。例によって穴埋め形式。
あくまで説明用なので、Teamsで配布したコードを使うこと。

c234567
! This code calculates autocorrelation in time & space domain
character*120 header(364)
character*120 ifl
real sla3d(80,80,364),lon(80,80),lat(80,80),dummy(80,80)
real COR(23,13),ilon,ilat,DIST(23,13),TIME(23,13),dif1,dif2
integer year(364),month(364),xvar(364),smo,emo
real ave1,ave2,var1,var2,std1,std2,covar,dnum

!------------ parameter! --------------
g=9.8; ! m/s^2
pi=3.141592;
omega=7.29*1e-5;
a=6378136; ! m
e2=0.006694470
!----------------------------------------------
! read SLA dataset; build SLA 3d(lon,lat,time)
! ファイル名を作成して、海面高度データを読み込む
!----------------------------------------------
inum=1
smo=1;emo=12;
do iyr=1993,2023

if(iyr.eq.1993)then
smo=2
endif
if(iyr.eq.2023)then
emo=5
endif

do imo=smo,emo
if(imo.ge.10)then
write(ifl,'("./KuroshioBIN/",i4,i2,"-80x80.bin")') iyr,imo
else
write(ifl,'("./KuroshioBIN/",i4,"0",i1,"-80x80.bin")') iyr,imo
endif
write(*,*) ifl
200 format(a120) !--make file's name

open(10,file=ifl,form='unformatted',
& access="direct",status="old",recl=80*80*4)
read(10,rec=1) dummy
do j=1,80
do i=1,80
sla3d(i,j,inum)=dummy(i,j)
enddo
enddo

year(inum)=iyr ! we will use it later!
month(inum)=imo ! we will use it later!
xvar(inum)=inum
write(*,*) inum,year(inum),month(inum),xvar(inum)
inum=inum+1

enddo
enddo

inum=inum-1
write(*,*) "inum=",inum

!----LONLAT info
open(10,file="./KuroshioBIN/lon-80x80.bin",form='unformatted',
& access="direct",status="old",recl=80*80*4)
read(10,rec=1) lon
close(10)
open(10,file="./KuroshioBIN/lat-80x80.bin",form='unformatted',
& access="direct",status="old",recl=80*80*4)
read(10,rec=1) lat
close(10)


!----------------------------------------------
! specify x,y coordinate based on my input
! 調べたい場所の経度、緯度を入力する。
! そのあと、入力した緯度経度に最も近いグリッドの座標をix,iyに格納する。
!----------------------------------------------
write(*,*) "Enter Lon/Lat info"
write(*,*) "Enter longitude"
read(*,*) ilon
write(*,*) "Enter lat"
read(*,*) ilat
write(*,*) "You entered",ilon,ilat

dif1=100000; dif2=100000
do j=1,80
do i=1,80
write(*,*) i,abs(ilon-lon(i,j)),ilon,lon(i,j)

if(abs(ilon-lon(i,j)).lt.dif1)then
dif1=abs(ilon-lon(i,j))
ix=i
endif
if(abs(ilat-lat(i,j)).lt.dif2)then
dif2=abs(ilat-lat(i,j))
iy=j
endif

enddo
enddo

write(*,*) "ix and iy are ",ix,iy

!----------------------------------------------
! cal autocorrelation in time-space domain
!----------------------------------------------
! consider in latitudinal direction only, this time
! COR=nan(23,13)-->(space and time)
!----------------------------------------------

do it=0,12 ! temporal 時間方向のラグを決める
istart=1; iend=364;
do j=-11,11 ! spatial 空間方向のラグを決める

!~~~~ cal distance ~~~~! ここは前回行った距離計算!
mlat=(lat(ix,iy)+lat(ix,iy+j))*0.5
dlat=
coli=
AA=
BB=
CC=
DD=
disty=(pi/180)*(AA/DD)*dlat !! distance (m) between two grids

if(lat(ix,iy).gt.lat(ix,iy+j))then !!!!! caution !!!!!
disty=-1*disty
endif


! write(*,*) mlat,coli,AA,BB,CC,DD,"disty=",disty

!------ Cal. Autocorrelation
! 1. get "MEAN" values
ave1=0
ave2=0
iend2=iend-it
do k=istart,iend2 !--> ex) 1-363 2-364
ave1=ave1+sla3d(ix,iy,k) 自分が入力した緯度経度の海面高度偏差を使う
ave2=ave2+ 入力した緯度経度から空間・時間方向にラグを持つ海面高度偏差を使う、変数itとjも使う
enddo
dnum=iend2-istart+1
ave1=ave1/dnum
ave2=ave2/dnum
write(*,*) "average",ave1,ave2,iend2

! 2. get variance and std
var1=0; var2=0;covar=0
do k=istart,iend2
var1=var1+
var2=var2+
covar=covar+
enddo
var1=var1/dnum
var2=var2/dnum
covar=covar/dnum
std1=sqrt(var1)
std2=sqrt(var2)

! 3. cal correlation
write(*,*) "var1,var2,covar",var1,var2,covar
write(*,*) "std1,std2",std1,std2
COR(12+j,1+it)=covar/std1/std2 相関係数の行列
DIST(12+j,1+it)=disty; 空間方向のラグの行列
TIME(12+j,1+it)=it;   時間方向のラグの行列
write(*,202) j,it,COR(12+j,1+it)
202 format("Area and Correlation-->",i4,i4,2f12.2)

enddo
enddo

open(30,file="SLAautocor.txt")
do j=1,13
do i=1,23
write(*,300) DIST(i,j)/1000,TIME(i,j),COR(i,j) 距離の単位は「m」なので「km」に換算
write(30,300) DIST(i,j)/1000,TIME(i,j),COR(i,j)
enddo
enddo

300 format(3f14.4)

stop
end

 
※赤字の箇所は自分が指定した緯度・経度に書き換えること

GMTスクリプト

gmt begin TimeSpaceCor
gmt set FONT 18p,Helvetica-Bold  
フォントとフォントサイズ
gmt surface SLAautocor.txt -R-305/305/0/12 -I5/0.1 -GSLAautocor.nc
 テキストデータからNetCDFを作成
gmt makecpt -Crainbow -T-0.5/1/0.1 -N                
カラーパレットを作成
gmt grdimage SLAautocor.nc -R-305/305/0/12 -Jx0.05/2 -BWSne+t"
27N, 127E Correlation matrix"  塗りつぶし
gmt grdcontour SLAautocor.nc -C0.1 -A0.2+f16p -Gd4c -S4      
等値線の描画
gmt basemap -R-305/305/0/12 -Jx0.05/2 -Bxaf5+l"Lag(distance, km)" -Byaf0.5+l"Lag(time, month)"  
X軸・Y軸の描画
gmt colorbar -DJRM+o0.3c/0+e+mc -Bx0.2 -By0.2          
カラーパレットの描画
gmt end show