Несовместимые результаты в R с RNetCDF - почему? - PullRequest
3 голосов
/ 20 июня 2011

У меня проблемы с извлечением данных из файлов данных NetCDF с использованием RNetCDF. Каждый файл данных имеет 3 измерения (долгота, широта и дата) и 3 переменные (широта, долгота и климатическая переменная). Существует четыре набора данных, каждый с различной климатической переменной.

Вот некоторые из выводов из print.nc (p8m.tmax) для ясности. Другие наборы данных идентичны, за исключением конкретной климатической переменной.

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 ;

Я получаю поведение, которое не понимаю, когда использую функцию var.get.nc из пакета RNetCDF.

Например, когда я пытаюсь извлечь 82 значения, начиная с stval, из данных максимальной температуры (p8m.tmax <- open.nc (tmaxdataset.nc)) с помощью </p>

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

(где lon_val и lat_val указывают местоположение в наборе данных интересующих меня координат, а stval - это stval, для которого установлено (time_vec == 200201), что в данном случае равняется 1285.) Я получаю Ошибка: неверный аргумент

Но после успешного извлечения 80 и 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))

работает команда с 82:

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

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

Та же проблема возникает в идентично структурированном файле tmin, но на 36 вместо 82:

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

выдает ошибку: неверный аргумент

Но после повторения со счетами 30, 31 и т. Д.

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

работает.

В этих примерах создается впечатление, что функция завершается с ошибкой при последнем подсчете, но на самом деле это не так. В первом примере var.get.nc выдал Error: Недопустимый аргумент после того, как я запросил 84 значения. Затем я сократил число ошибок до 82-го числа, изменив начальную точку в наборе данных и запросив только 1 значение за раз. Конкретное число, в котором возникает проблема, также варьируется. Я могу закрыть и снова открыть набор данных, и проблема возникнет в другом месте.

В приведенных выше конкретных примерах lon_val и lat_val равны 1595 и 1751, соответственно, определяя местоположение в наборе данных вдоль широт и долгот для интересующей меня широты и долготы. 1595-я широта и 1751-я долгота не являются проблема, однако. Проблема возникает со всеми другими широтами и долготами, которые я пробовал.

Изменение начального местоположения в наборе данных по измерению климатической переменной (stval) и / или указание его другим (как число в команде вместо объекта stval) также не решает проблему.

Эта проблема не всегда возникает. Я могу запустить один и тот же код три раза подряд (очистить все объекты между прогонами) и каждый раз получать разные результаты. Первый прогон может захлебнуться 7-й записью, которую я пытаюсь получить, второй может работать нормально, а третий прогон может захлебнуться 83-й записью. Я совершенно сбит с толку таким непоследовательным поведением.

Функция open.nc также перестала работать с той же ошибкой: неверный аргумент. Как и проблемы var.get.nc, это также происходит непоследовательно.

Кто-нибудь знает, что вызывает первоначальный сбой при извлечении переменной? И как я мог бы предотвратить это? Может быть, это связано с размером файлов данных (~ 60 ГБ каждый) и / или с тем, что я обращаюсь к ним через сетевые диски?

Это также спрашивали здесь: 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

1 Ответ

0 голосов
/ 23 июня 2011

Чтобы решить эту проблему, я переключился с пакета RNetCDF (версия 1.5.2-2) на пакет ncdf (1.6.5).Функции в двух пакетах имеют одинаковые имена и имеют одинаковые цели [open.nc vs. open.ncdf, var.get.nc vs. get.var.ncdf].Используя точно такой же код с именами функций RNetCDF, замененными на функции ncdf, я не получаю ошибок и ожидаемых результатов.

Таким образом, хотя следующие команды RNetCDF не работают (только иногда и без видимой причины)

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

Эти команды ncdf никогда не завершаются

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

Это не реальнорешение - я до сих пор не знаю, почему функции в пакете RNetCDF иногда работают, а иногда нет.Тем не менее, это позволяет мне извлекать данные, которые мне нужны, и, надеюсь, будет полезным для других, работающих с данными netcdf в R.

...