2011-06-20 8 views
3

Je rencontre des problèmes pour extraire des données à partir de fichiers de données NetCDF à l'aide de RNetCDF. Les fichiers de données ont chacun trois dimensions (longitude, latitude et date) et trois variables (latitude, longitude et variable climatique). Il y a quatre jeux de données, chacun avec une variable climatique différente.Résultats incohérents dans R avec RNetCDF - pourquoi?

Voici une partie de la sortie de print.nc (p8m.tmax) pour plus de clarté. Les autres ensembles de données sont identiques à l'exception de la variable climatique spécifique.

dimensions: 
    month = UNLIMITED ; // (1368 currently) 
    lat = 3105 ; 
    lon = 7025 ; 
variables: 
    float lat(lat) ; 
      lat:long_name = "latitude" ; 
      lat:standard_name = "latitude" ; 
      lat:units = "degrees_north" ; 
    float lon(lon) ; 
      lon:long_name = "longitude" ; 
      lon:standard_name = "longitude" ; 
      lon:units = "degrees_east" ; 
    short tmax(lon, lat, month) ; 
      tmax:missing_value = -9999 ; 
      tmax:_FillValue = -9999 ; 
      tmax:units = "degree_celsius" ; 
      tmax:scale_factor = 0.01 ; 
      tmax:valid_min = -5000 ; 
      tmax:valid_max = 6000 ; 

Je reçois le comportement que je ne comprends pas quand j'utiliser la fonction var.get.nc du package RNetCDF.

Par exemple, lorsque je tente d'extraire 82 valeurs à partir de stval à partir des données de température maximale (p8m.tmax < - open.nc (tmaxdataset.nc)) avec

> var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,82)) 

(où lon_val et lat_val spécifiez l'emplacement dans l'ensemble de données des coordonnées qui m'intéresse et stval est stval est défini à which (time_vec == 200201), qui dans ce cas égalait 1285.) Je reçois Erreur: Argument invalide

Mais après extraction réussie des valeurs 80 et 81

> var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,80)) 
> var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,81)) 

la commande avec 82 œuvres:

> var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,82)) 

[1] 444 866 1063 ... [output snipped] 

Le même problème se produit dans le fichier tmin structure identique, mais à 36 au lieu de 82:

> var.get.nc(p8m.tmin,'tmin', start=c(lon_val, lat_val, stval),count=c(1,1,36)) 

produit Erreur: Invalid argument

Mais après avoir répété avec des comptes de 30, 31, etc

> var.get.nc(p8m.tmin,'tmin', start=c(lon_val, lat_val, stval), count=c(1,1,36)) 

fonctionne. Ces exemples donnent l'impression que la fonction échoue au dernier décompte, mais ce n'est pas le cas. Dans le premier exemple, var.get.nc a donné Erreur: Argument invalide après avoir demandé 84 valeurs. J'ai ensuite réduit l'échec à la 82e fois en faisant varier le point de départ dans l'ensemble de données et en demandant seulement 1 valeur à la fois. Le nombre particulier du problème varie également. Je peux fermer et rouvrir l'ensemble de données et faire en sorte que le problème se produise à un emplacement différent. Dans les exemples particuliers ci-dessus, lon_val et lat_val sont 1595 et 1751, respectivement, identifiant l'emplacement dans l'ensemble de données le long des dimensions lat et lon pour la latitude et la longitude qui m'intéresse. La 1595ème latitude et la 1751ème longitude sont pas le problème, cependant. Le problème se produit avec toutes les autres latitude et longitudes que j'ai essayées.

La modification de l'emplacement de départ dans l'ensemble de données le long de la dimension de variable climatique (stval) et/ou la spécification différente (comme un nombre dans la commande au lieu de l'objet stval) ne résout pas le problème.

Ce problème ne se produit pas toujours. Je peux exécuter un code identique trois fois de suite (en effaçant tous les objets entre deux passages) et obtenir un résultat différent à chaque fois. La première course risque de s'étouffer avec la 7e entrée que j'essaie d'obtenir, la deuxième pourrait bien fonctionner, et la troisième pourrait m'étouffer à la 83e entrée. Je suis absolument déconcerté par un tel comportement incohérent.

La fonction open.nc a également commencé à échouer avec la même erreur: Argument invalide. Comme les problèmes var.get.nc, il se produit également de manière incohérente.

Est-ce que quelqu'un sait ce qui cause l'échec initial d'extraire la variable? Et comment je pourrais l'empêcher? Pourrait avoir à faire avec la taille des fichiers de données (~ 60 Go chacun) et/ou le fait que j'y accède à travers des lecteurs en réseau?

Cela a également été posée ici: https://stat.ethz.ch/pipermail/r-help/2011-June/281233.html

> sessionInfo() 
R version 2.13.0 (2011-04-13) 
Platform: i386-pc-mingw32/i386 (32-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] reshape_0.8.4 plyr_1.5.2  RNetCDF_1.5.2-2 

loaded via a namespace (and not attached): 
[1] tools_2.13.0 
+0

quelles sont les valeurs de lon_val, lat_val et stval? et p8m.tmax est-il vraiment une variable nc de open.nc? Que vous dit sessionInfo()? pouvez-vous partager un lien vers le fichier, ou un lien similaire et le code complet que vous utilisez? – mdsumner

+0

@mdsumner p8m.tmax est la façon dont j'ai affecté la connexion à l'ensemble de données tmax. Comme p8m.tmax <- open.nc ('tmax.nc'). Dans les exemples particuliers ci-dessus, lon_val et lat_val sont respectivement 1595 et 1751, identifiant l'emplacement dans l'ensemble de données de la latitude et de la longitude qui m'intéresse. Stval est défini sur which (time_vec == 200201) qui dans ce cas égalait 1285 Le même problème (erreur: argument invalide) se produit que j'entre ou non les nombres réels dans le vecteur de démarrage. – sarcozona

+0

@mdsumner Je ne peux pas partager un lien vers les données car je ne possède pas les données et je ne connais pas trop netcdf pour en créer un similaire. Chaque fichier de données est également de 60 Go. Exemple de code est dans le «dossier Stack» dans ma boîte de dépôt publique http://db.tt/BFn0W5Q – sarcozona

Répondre

0

Pour résoudre ce problème, je suis passé de l'emballage RNetCDF (version 1.5.2-2) à l'ensemble de NCDF (1.6.5). Les fonctions dans les deux paquets sont nommées de la même manière et ont les mêmes objectifs [open.nc vs open.ncdf, var.get.nc vs get.var.ncdf]. En utilisant exactement le même code avec les noms de fonctions RNetCDF remplacés par des fonctions ncdf, je n'obtiens aucune erreur et les résultats attendus.

Ainsi, alors que les commandes de RNetCDF suivantes ne (parfois seulement & sans raison apparente)

>p8m.tmax <- open.nc('tmax.nc') 
>var.get.nc(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,82)) 

Ces NCDF commandes ne manquent jamais

>p8m.tmax <- open.ncdf('tmax.nc') 
>get.var.ncdf(p8m.tmax,'tmax', start=c(lon_val, lat_val, stval),count=c(1,1,82)) 

Ce n'est pas une véritable solution - Je ne toujours » Je sais pourquoi les fonctions du package RNetCDF fonctionnent parfois et parfois non. Cependant, cela me permet d'extraire les données dont j'ai besoin et j'espère qu'elles seront utiles à d'autres personnes travaillant avec des données netcdf dans R.

Questions connexes