Topへ戻る 

12: データ分析(時空間解析3): コンポジット解析・Regression解析 (関連性・仮説検証・知識発見・原因究明・可視化)

コンポジット解析

(参考)
https://www.nature.com/articles/srep33790
上記リンク先は数値モデルのデータを使い、出力されたデータから"Strong El Nino”期および"Strong La Nina”期における海面温度を計算している。
ここでは同様の計算を観測値を用いて計算します






(実践)
以前使った、エルニーニョ監視海域Nino3.4における水温データを指標にして、"Strong El Nino”期および"Strong La Nina”期における平均海面温度の計算(コンポジット解析)を行う

今回はCaiらがよく使う指標で「0.5 s.d.」を用いる。s.d.は標準偏差standard deviationのこと。
例えば
More extreme swings of the South Pacific convergence zone due to greenhouse warming | Nature


ここでは、Nino3.4海域の海面温度時系列の平均と標準偏差を用いた閾値を計算する。

用意するデータ(いずれも前回使用したもの)

・海面温度データOISST
・エルニーニョ監視海域のSSTアノマリー


c234567---------------------------------
character*120 ifl(494)
integer num
integer*1 lmask(360,180) ! land mask
real dummy(360,180),msst(360,180)
real sst3d(360,180,494),xvar(494),dnum(360,180)
real YR(502),MO(502)
real nino(502,8)
real ELNINO(360,180),LANINA(360,180)
real COUNT1(360,180),COUNT2(360,180)

! SST : Dec. 1981 to Jan. 2023 (2~494)
! Nino SST: Jan. 1982 to Oct. 2023 (1~493)

C---------------------------------------
C read the list of FILENAME
C and make time axis
C---------------------------------------
open(10,file="list.txt")
read(10,*) num
do k=1,num
read(10,'(a120)') ifl(k)
write(*,'(a120)') ifl(k)
xvar(k)=k
enddo
close(10)
C---------------------------------------
C read SST files and make 3-D dataset
C---------------------------------------
do k=1,num
open(15,file=ifl(k),form='unformatted',
& access="direct",status="old",recl=360*180*4)
read(15,rec=1) dummy

do j=1,180
do i=1,360
sst3d(i,j,k)=dummy(i,j)
enddo
enddo

close(15)
enddo

C---------------------
C read LAND MASK
C---------------------
open(20,file='lmask.bin',form='unformatted',
& access="direct",status="old",recl=360*180)
read(20,rec=1) lmask
close(20)

C----------------------------
C cal mean for anomaly
C----------------------------
do j=1,180
do i=1,360
msst(i,j)=0; ic=0
do k=1,num
if(sst3d(i,j,k).gt.-1.79)then
msst(i,j)=msst(i,j)+sst3d(i,j,k)
ic=ic+1
endif
enddo
msst(i,j)=msst(i,j)/ic
dnum(i,j)=real(ic)
enddo
enddo


!------- read SST timeseries ---------!
inum2=1
open(11,file="sstoi.indices.txt")
read(11,'(a120)') header
write(*,'(a120)') header
1001 read(11,*,end=666) YR(inum2),MO(inum2),(nino(inum2,k),k=1,8)
write(*,201) YR(inum2),MO(inum2),(nino(inum2,k),k=1,8)
inum2=inum2+1
goto 1001
666 inum2=inum2-1
close(11)
write(*,*) "number of data(SST) = ",inum2

201 format(f6.0,1x,f4.0,1x,8f8.2)


C==================================
C define "Strong" Nino using Nino3.4
C cal. standard deviation
C==================================

mNino34=0; ! mean vaue of Nino3.4 <--initialize!
do i=1,inum2
mNino34=mNino34+nino(i,8);
enddo
mNino34=mNino34/real(inum2);

sNino34=0; ! std of Nino3.4 <--initialize!
do i=1,inum2
sNino34=sNino34+(nino(i,8)-mNino34)**2;
enddo
sNino34=sNino34/real(inum2); ! <--- variance
sNino34=sqrt(sNino34); ! <--- std

cr1=mNino34+0.5*sNino34 !<--criteria for strong El Nino
cr2=mNino34-0.5*sNino34 !<--criteria for strong La Nina
write(*,*) cr1,cr2


C============================================
C COMPOSITE SST based on criteria above
C============================================

! SST : Dec. 1981 to Jan. 2023 (2~494)
! Nino SST: Jan. 1982 to Oct. 2023 (1~493)

do j=1,180
do i=1,360
ELNINO(i,j)=0; COUNT1(i,j)=0; ic=0
LANINA(i,j)=0; COUNT2(i,j)=0;
enddo
enddo

do k=2,num
if(nino(k-1,8).gt.cr1)then
write(*,*) "Strong k=",k
do j=1,180
do i=1,360
if(sst3d(i,j,k).gt.-1.79)then
ELNINO(i,j)=ELNINO(i,j)+sst3d(i,j,k)-msst(i,j)
COUNT1(i,j)=COUNT1(i,j)+1
endif
enddo
enddo
endif

if(nino(k-1,8).lt.cr2)then
do j=1,180
do i=1,360
if(sst3d(i,j,k).gt.-1.79)then
LANINA(i,j)=LANINA(i,j)+sst3d(i,j,k)-msst(i,j)
COUNT2(i,j)=COUNT2(i,j)+1
endif
enddo
enddo
endif
enddo

! finalize !
do j=1,180
do i=1,360
if(COUNT1(i,j).gt.0)then
ELNINO(i,j)=ELNINO(i,j)/COUNT1(i,j);
endif
if(COUNT2(i,j).gt.0)then
LANINA(i,j)=LANINA(i,j)/COUNT2(i,j);
endif
enddo
enddo

C----------------------------
C ERASE SST data on "LAND"
C----------------------------
do j=1,180
do i=1,360
if(lmask(i,j)==0)then
ELNINO(i,j)=0
LANINA(i,j)=0
endif
enddo
enddo

C----------------------------
C OUTPUT-->write BINARY file
C----------------------------
open(80,file='ELNINO.bin',form='unformatted',
& access="direct",recl=360*180*4)
write(80,rec=1) ELNINO
open(81,file='LANINA.bin',form='unformatted',
& access="direct",recl=360*180*4)
write(81,rec=1) LANINA

stop
end



 
gmt begin StrongElNinoSST
gmt xyz2grd ELNINO.bin -R0.5/359.5/-89.5/89.5 -I1 -ZTLf -Gelnino -di-999
gmt makecpt -Chaxby -T-1/1/0.05 -N
gmt grdimage elnino -R0.5/359.5/-89.5/89.5 -JR16c
gmt grdcontour elnino -C0.5 -A1+f10p -Gd8c -S4
gmt coast -B+t"SST during strong El Nino" -B -Gwhite -Wthinnest
gmt colorbar -DjTR+o0c+w3c/0.4c -Bx -By+loC -I -F+gwhite+p1p
gmt end show