Spatial degrees of freedom test
https://journals.ametsoc.org/view/journals/clim/12/5/1520-0442_1999_012_1280_eosdof_2.0.co_2.xml
Xi-squared method:
library(startR)
library(multiApply)
path <- "/gpfs/projects/bsc32/esarchive_cache/recon/ecmwf/era5/monthly_mean/tas_f1h-r1440x721cds/$var$_$sdate$.nc"
res <- Start(dat = path, var = 'tas', sdate = paste0(1993:2016,'01'),
lat = values(list(30, 90)),
lon = 'all',
transform = CDORemapper,
transform_extra_cells = 2,
transform_params = list(grid = 'r360x181',
method = 'conservative'),
transform_vars = c('lat', 'lon'),
synonims = list(lat=c('lat','latitude'), lon=c('lon','longitude')),
return_vars = list(time = NULL,
lat = 'dat',
lon = 'dat'),
retrieve = T)
tmp <- Apply(list(res), target_dims = 'sdate',
fun = function(x) {
(x - mean(x))/sd(x)}, ncores = 14)$output1
# eigenvalues of the covariance matrix
dim(tmp) <- c(time = 24, points = 360*61)
test <- cov(tmp)
eigenvalues <- eigen(test)$values
dof <- dim(tmp)['points']^2/sum(eigenvalues^2)
# dof = 10.80762
For North Hemisphere 0:90 N --> of = 12.30232
# Sum of eigenvalues (total variance)
sum_eigenvalues <- sum(eigenvalues)
# Sum of squared eigenvalues
sum_squared_eigenvalues <- sum(eigenvalues^2)
# Degrees of freedom
N_eff <- (sum_eigenvalues^2) / sum_squared_eigenvalues
#N_eff = 10.80762
Increase sample size with all months in the years
library(startR)
library(multiApply)
path <- "/gpfs/projects/bsc32/esarchive_cache/recon/ecmwf/era5/monthly_mean/tas_f1h-r1440x721cds/$var$_$sdate$.nc"
res <- Start(dat = path, var = 'tas', sdate = paste0(1993:2016, sprintf("%02d", sort(rep(1:12, 24)))),
lat = values(list(30, 90)),
lon = 'all',
transform = CDORemapper,
transform_extra_cells = 2,
transform_params = list(grid = 'r360x181',
method = 'conservative'),
transform_vars = c('lat', 'lon'),
synonims = list(lat=c('lat','latitude'), lon=c('lon','longitude')),
return_vars = list(time = NULL,
lat = 'dat',
lon = 'dat'),
retrieve = T)
tmp <- Apply(list(res), target_dims = 'sdate',
fun = function(x) {
(x - mean(x))/sd(x)}, ncores = 14)$output1
# eigenvalues of the covariance matrix
dim(tmp) <- c(time = 24*12, points = 360*61)
start.time <- Sys.time()
test <- cov(tmp)
mid.time <- Sys.time()
eigenvalues <- eigen(test)$values
end.time <- Sys.time()
dof <- dim(tmp)['points']^2/sum(eigenvalues^2)
# dof = 1.298337
round(mid.time - start.time, 2)
round(end.time - mid.time, 2)
Edited by Nuria Pérez-Zanón