es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Calculando EOF con CDO se obtiene una advertencia de cálculo de autovalores, el esquema de Jacobi no converge.

Necesito obtener los coeficientes principales (diarios) del primer EOF del campo de altura geopotencial diario (data = geopot.nc). Solo uso la temporada fría (N, D, J, F, M, A). Mi código es el siguiente:

cdo selmon,11,12,1,2,3,4 geopot.nc geopotw.nc
cdo --reduce_dim - copy geopotw.nc geopotw3.nc #delete 1 dimension of level=1)
cdo sub geopotw3.nc -ydaymean geopotw3.nc deseason.nc
cdo mulcoslat deseason.nc deseasoncos.nc
cdo eof,3 deseasoncos.nc eval.nc eof.nc

Obtuve un mensaje de advertencia: statistics-module (Warning): El cálculo del valor propio con el esquema jacobi de un solo lado no convergió correctamente. 7017371 de 7244721 pares de columnas no alcanzaron la ortogonalidad solicitada de 1e-12.

¿Qué estoy haciendo mal? ¿Quizás me estoy perdiendo algo? ¿O tal vez hay otras formas mejores de obtener el resultado que busco? Por ejemplo, en R. ¡Gracias por la ayuda!

Tags:  

Answer

  1. Avatar for davy.ai

    Parece que hay un problema con la convergencia del cálculo de los valores propios en tu código. Esto podría ser causado por varios factores, como el tamaño y la complejidad de tus datos o los parámetros específicos utilizados en el análisis de EOF.

    Una posible solución es probar diferentes parámetros para el análisis de EOF, como utilizar un número diferente de EOF o cambiar los criterios de convergencia. También puedes probar diferentes paquetes de software para el análisis, como R o Matlab, que pueden proporcionar diferentes algoritmos para el cálculo.

    En R, puedes utilizar la función ‘prcomp’ para realizar el análisis de EOF en una matriz de datos. Por ejemplo, el siguiente código calculará los coeficientes principales del primer EOF para la temporada fría del campo de altura geopotencial:

    library(ncdf4)
    library(fields)
    
    # cargar datos
    geopot <- nc_open("geopot.nc")
    data <- ncvar_get(geopot, "geopot")
    lon <- ncvar_get(geopot, "lon")
    lat <- ncvar_get(geopot, "lat")
    nc_close(geopot)
    
    # extraer datos de la temporada fría
    data_cs <- data[, which(format(as.Date(dimnames(data)[[1]]), "%b") %in% c("Nov", "Dec", "Jan", "Feb", "Mar", "Apr")), , ]
    
    # dar forma a los datos para el análisis de EOF
    data_fl <- as.matrix(aperm(data_cs, c(2, 1, 3)))
    data_fl <- apply(data_fl, 2, function(x) scale(x, scale = FALSE))
    
    # calcular los EOFs
    pca <- prcomp(data_fl, center = FALSE, scale. = FALSE)
    eofs <- pca$rotation
    pcs <- pca$x
    
    # extraer el primer EOF y sus coeficientes principales
    eof1 <- eofs[, 1]
    pc1 <- pcs[, 1]
    
    # dar forma a los coeficientes principales de nuevo a la cuadrícula original
    pc1_fl <- matrix(pc1, nrow = ncol(lon), ncol = ncol(lat))
    pc1_fl <- aperm(pc1_fl, c(2, 1))
    pc1_grid <- interp.surface(pc1_fl, lon, lat, lon, lat, duplicate = "mean")
    
    # guardar la salida en un archivo netCDF
    nc <- nc_create("pc1.nc", list(lon = length(lon), lat = length(lat)))
    ncvar_put(nc, "lon", lon, longname = "longitud", units = "grados_este")
    ncvar_put(nc, "lat", lat, longname = "latitud", units = "grados_norte")
    ncvar_put(nc, "pc1", pc1_grid, longname = "coeficientes principales (EOF1)", units = "")
    nc_close(nc)
    

    Este código utiliza el paquete ‘ncdf4’ para leer los datos netCDF y el paquete ‘fields’ para interpolar los coeficientes principales de nuevo a la cuadrícula original. Luego da forma a los datos para su uso en la función ‘prcomp’, que calcula los EOFs y los coeficientes principales. Por último, guarda los coeficientes principales en un nuevo archivo netCDF.

    Ten en cuenta que este código asume que los datos son tridimensionales con dimensiones (tiempo, latitud, longitud) y que los archivos netCDF están en el mismo directorio que el script de R. Es posible que debas modificar el código para tus datos específicos y las ubicaciones de los archivos.

Comments are closed.