Topへ戻る 

07&08:データ分析

El Nino監視海域の海面温度データとSOIとの関係(クロス集計)


SOIと海面温度の関係

南方振動指数は大気海洋相互作用の「大気側」を見ている。
では海側はどうか?
何回も出てきた以下の図は、El Nino監視海域を示している。



(1)各監視海域の海面温度時系列とSOIとの相関関係

各海域の海面温度データ(DLすること)
NINO1,2,1+2,3,4,3.4の海面温度データでANOMは偏差を示す。
どの海域(どの列の海面温度データ)とSOIとの相関係数が大きくなるか調べよ。

(2)最小二乗法で求める回帰式
高い相関関係が得られた海域の海面温度を説明変数、SOIを説明変数として、単回帰式を求めよ。
Y(SOI)=a × X(海面温度偏差) + b
の傾きaと切片bを求めるということ。

回帰式についてはここを参照

(3)決定係数
決定係数についてはここを参照
決定係数は回帰式がどれだけ当てはまっているかの指標。



以下はオリジナルのSOI時系列とSSTとの相関関係を調べるためのサンプルコード(ただし、いつも通り穴埋め形式)。
今回の課題は121か月移動平成分均を除去し、13か月移動平均をかけたSOI時系列とSSTを用いた相関係数、回帰式、決定係数の計算です。

c234567
character*120 header
real SOI(864),SOI2(502),date(864)
real YR(502),MO(502)
real nino(502,8),COR(8)
real eSOI(502),R2 !回帰式から求める水温、決定係数

!------- read SOI timeseries ---------!
inum=1
open(10,file="SOItimeseries.txt")
1000 read(10,*,end=555) date(inum),SOI(inum)
write(*,*) date(inum),SOI(inum)
inum=inum+1
goto 1000
555 inum=inum-1
close(10)
write(*,*) "number of data(SOI) = ",inum

!------- 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)

!------- find index to compare two datasets ---------!
! period: Jan. 1982 ~ Dec. 2022
!!2つのデータセットは期間が異なる。共通する期間の"座標"を見つける
!----------------------------------------------------!
istart=0 ; iend=0 ! SOI
istart2=0 ; iend2=0 ! SST

!!----SOI時系列で1982年1月と2022年12月の場所を探す
icheck=1
do i=1,inum
if(icheck.eq.1.and.date(i).ge.1982)then
istart=i
icheck=icheck+1
endif
enddo
iend=inum
write(*,*) "SOI: istart,iend",istart,iend
write(*,*) "date start and end",date(istart),date(iend)
write(*,*) "icheck",icheck

!!----SST時系列で1982年1月と2022年12月の場所を探す
icheck2=1
do j=1,inum2
if(変数YRが1982、かつ変数MOが1という条件)then
istart2=j
elseif(変数YRが2022、かつ変数MOが12という条件)then
iend2=j
endif
enddo
write(*,*) "SST: istart2,iend2",istart2,iend2
write(*,*) "date start",YR(istart2),MO(istart2)
write(*,*) "date end",YR(iend2),MO(iend2)


!------------------------------------------------------
!------ Cal. correlation (SOI .vs. SST)
do j=1,8 ! choose region of SST monitoring area


! 1. get "MEAN" values !平均の計算
ave1=0 ! SOI
ave2=0 ! SST
idt=istart-istart2 !座標のギャップ
do i=istart,iend
ave1=ave1+SOI(i) ! sum of SOI
ave2=ave2+nino(i-idt,j)! sum of SST
enddo
dnum=iend-istart+1! データの数
ave1=ave1/dnum
ave2=ave2/dnum
!write(*,*) "idt,average",idt,ave1,ave2

! 2. get variance and std !分散・共分散と標準偏差
var1=0; var2=0;covar=0
do i=istart,iend ! SOIの座標を起点にしていることに注意
var1=var1+(SOI(i)-ave1)**2 ! sum of SOI anomaly
var2=var2+(nino(座標を計算,j)-ave2)**2 ! sum of SSTI anomaly
covar=covar+(SOI(i)-ave1)*(nino(座標を計算t,j)-ave2)
enddo
var1= !分散の計算
var2=!分散の計算
covar=!共分散の計算
std1=sqrt(var1)
std2=sqrt(var2)

! 3. cal correlation
!write(*,*) "var1,var2,covar",var1,var2,covar
!write(*,*) "std1,std2",std1,std2
COR(j)= !相関係数の計算
write(*,202) j,COR(j)
202 format("Area and Correlation-->",i4,f12.2)

enddo
!------ cal correlation finish! ----------------
!------------------------------------------------------

!======== LINEAR REGRESSION start! =============!
! X=SST(nino) & Y=SOI
!
do j=1,8 ! select sst data

B=0; C=0; D=0; E=0
do i=istart,iend
B=B+
C=C+
D=D+
E=E+
enddo

slope=
offset=
write(*,203) slope,offset
203 format("slope & offset -->",2f10.3)


C~~~~~~~~~~~~~~~~
C 決定係数の計算
C~~~~~~~~~~~~~~~~
!(1) SSTから予想されるSOIを回帰式から求める
do i=istart,iend
eSOI(i-idt)=
enddo

!(2) 残差平方和(SOIとeSOIの差を考える)
SSR=0
do i=istart,iend ! 373 ~ 864
SSR=SSR+
enddo

!(3) 全平方和TSSを求める
TSS=var1*dnum

R2=1-(SSR/TSS)
write(*,*) "SSR,TSS,R2",SSR,TSS,R2

enddo ! finish

stop
end