Ранговая корреляция Спирмена в пространственной области

#python #geospatial #correlation #netcdf #python-xarray

Вопрос:

Я хотел бы рассчитать ранговую корреляцию Спирмена между двумя наборами данных о осадках (файлы netcdf, открытые с помощью xarray) по области Африки с течением времени для каждого сезона и построить пространственные корреляции. Я обнаружил, что следующие функции работают, но вычисленная корреляция-это корреляция Пирсона, и я хотел бы получить корреляцию Спирмена.

 def covariance(x, y, dims=None):
    return xr.dot(x - x.mean(dims), y - y.mean(dims), dims=dims) / x.count(dims)

def corrrelation(x, y, dims=None):
    return covariance(x, y, dims) / (x.std(dims) * y.std(dims))

ds2_djf_cor = corrrelation(da2_sum_season.sel(time=da2_sum_season.time.dt.month.isin([12])),
                           da1_sum_season.sel(time=da1_sum_season.time.dt.month.isin([12])), dims='time')
 

Кто-нибудь знает, как я мог бы это сделать, либо настроив вышеуказанные функции, либо начав с нуля?

Вот как выглядят данные (они были пересчитаны для получения сезонных итогов): da1_sum_season

 <xarray.DataArray 'pre' (time: 148, lat: 162, lon: 162)>
array([[[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        ...,
        [        nan,         nan,         nan, ..., 137.2      ,
         142.3      , 143.9      ],
        [        nan,         nan,         nan, ..., 143.7      ,
         148.5      , 147.2      ],
        [        nan,         nan,         nan, ..., 146.1      ,
         150.2      , 154.70001  ]],

       [[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
...
        [        nan,         nan,         nan, ...,  26.900002 ,
          26.400002 ,  21.900002 ],
        [        nan,         nan,         nan, ...,  33.2      ,
          28.2      ,  26.7      ],
        [        nan,         nan,         nan, ...,  31.       ,
          31.400002 ,  25.800001 ]],

       [[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        ...,
        [        nan,         nan,         nan, ...,  35.       ,
          33.600002 ,  37.5      ],
        [        nan,         nan,         nan, ...,  36.6      ,
          37.4      ,  35.5      ],
        [        nan,         nan,         nan, ...,  36.       ,
          36.2      ,  34.4      ]]], dtype=float32)
Coordinates:
  * time     (time) datetime64[ns] 1981-03-01 1981-06-01 ... 2017-12-01
  * lon      (lon) float64 -20.25 -19.75 -19.25 -18.75 ... 59.25 59.75 60.25
  * lat      (lat) float64 -40.25 -39.75 -39.25 -38.75 ... 39.25 39.75 40.25
 

da2_sum_season

 <xarray.DataArray 'precip' (time: 148, lat: 162, lon: 162)>
array([[[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        ...,
        [        nan,         nan,         nan, ..., 117.96996  ,
         137.49915  , 149.82387  ],
        [        nan,         nan,         nan, ..., 102.017044 ,
         128.21773  , 149.24342  ],
        [        nan,         nan,         nan, ..., 115.326996 ,
         114.31691  , 124.208435 ]],

       [[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
...
        [        nan,         nan,         nan, ...,  17.362268 ,
          17.088856 ,  15.534197 ],
        [        nan,         nan,         nan, ...,  20.717667 ,
          18.122211 ,  16.771612 ],
        [        nan,         nan,         nan, ...,  20.810205 ,
          20.894186 ,  19.719692 ]],

       [[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        ...,
        [        nan,         nan,         nan, ...,  30.264874 ,
          29.965853 ,  29.489614 ],
        [        nan,         nan,         nan, ...,  31.865303 ,
          30.22337  ,  29.885433 ],
        [        nan,         nan,         nan, ...,  29.05289  ,
          31.94003  ,  29.72091  ]]], dtype=float32)
Coordinates:
  * time     (time) datetime64[ns] 1981-03-01 1981-06-01 ... 2017-12-01
  * lon      (lon) float64 -20.25 -19.75 -19.25 -18.75 ... 59.25 59.75 60.25
  * lat      (lat) float64 -40.25 -39.75 -39.25 -38.75 ... 39.25 39.75 40.25
 

Комментарии:

1. Я отмечаю, что вы хотели сделать это «с нуля», однако xskillscore в пакете есть такая функция: xskillscore.readthedocs.io/en/stable/api/…

2. @RobertDavy большое вам спасибо, это то, что я искал. Я только предлагал «начать с нуля», если не было альтернативы/по необходимости.

3. @RobertDavy извините за другой вопрос, при использовании xskillscore_spearman_r на выходе появляются большие белые пятна (т. е. Отсутствуют). Вы знаете, что могло бы стать причиной этого? Невозможно, чтобы в исходном наборе данных было так много недостающих данных. Я думаю, что это связано со связанными рангами. Как эта операция относится к связанным рангам?

4. Возможно, лучше всего поднять вопрос на их github, если вы считаете, что он существует. Если вы углубитесь в код, он выполнит корреляцию Спирмена, вызывая bottleneck.nanrankdata каждый временной ряд, а затем выполняя корреляцию Пирсона этих двух. Я полагаю, что если бы у вас были временные ряды всех нулей ( не редкость для precip ?) это может привести к некоторым странным результатам.

5. Большое спасибо, я думаю, что проблема заключается во временном ряду нулей.