我有一个海洋表面温度时间序列,我想计算热带地区(30.0N到30S)节点之间的(Pearson)相关系数。在时间序列中,土地信息被掩盖。我不知道在相关性计算中如何处理蒙面数据。请帮助。我在这里使用的数据是在这个链接https://drive.google.com/file/d/1SVKQ4uBDEZOuN7_ftd5tqpF9_NGKY3pZ/view?usp=sharing
我尝试了以下代码,这没有工作:
temp5 = 'sst.day.mean.1983。fh5 =数据集(temp5, mode = 'r') sst5 = fh5。变量['sst'][:365] time = fh5。变量['time'][:] lat = fh5。变量['lat'][210:510][::35] #热带纬度lon = fh5。变量['lon'][::45] mar_05=[] for I in range(len(lat)): for j in range(len(lon)): for m in range(len(lat)): for n in range(len(lon)): mar_05.append(np。corrcoef (sst5 [59:90, i, j], sst5 [59:90, m, n] [0,1])) df = pd。DataFrame(data = mar_05)
我要冒险猜测,你正在使用NOAA OISST数据,尽管我不认为这对这里的答案有什么影响。
注意,您的循环,
for i in range(len(lat)): for j in range(len(lon)): for m in range(len(lat)): for n in range(len(lon)):
将只生成索引,
i = 0,…, 8 j = 0,…, 31 m = 0,…, n = 0,…, 31
当您使用sst5[59:90,i,j]
和sst5[59:90,m,n]
时,您不是从lat
和lon
变量中的热带点提取数据,您只是从完整的全局数组的角落提取数据,即sst5[:, 0:8, 0:31]
。您可以通过打印sst5来查看这一点。形状
在你的循环中,它将显示
…(365, 720, 1440)(365, 720, 1440)(365, 720, 1440)(365, 720, 1440)…
这个角在南极洲,因此没有SST数据,numpy。corrcoef
将只看到缺失的数据值,并试图除以零协方差,产生NaN值。
RuntimeWarning: invalid value occurred in true_divide c /= stddev[:, None]
你可以修改你的程序,在循环之前子集sst5
数组:
sst5_子集= sst5[59:90, 210:510:35,::45]
,然后在循环中引用这个数组:
mar_05.append(np。corrcoef(sst5_子集[:,i,j], sst5_子集[:,m,n])[0,1])
但是,就我个人而言,我会消除循环,并将其作为一个全数组操作:
sst_array = sst5_子集. rewrite (sst5_子集。形状[0],1)。T corr = np.ma.corrcoef(sst_array)
一个感兴趣的点的输出的快速图片:< A href="https://i.stack.imgur.com/bzCFL.png" rel="nofollow noreferrer"> A >