RNetCDF在R中的结果不一致 - 为什么?

3
我在使用RNetCDF从NetCDF数据文件中提取数据时遇到了困难。每个数据文件都有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 ;

当我使用RNetCDF包中的var.get.nc函数时,我遇到了一些不理解的行为。

例如,当我尝试从最高温度数据(p8m.tmax <- open.nc(tmaxdataset.nc))中提取从stval开始的82个值时,出现了问题。

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

(其中lon_val和lat_val指定了我感兴趣的坐标在数据集中的位置,stval设置为which(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)) 

工作正常。

这些示例似乎表明函数在最后一个计数时失败了,但实际上并非如此。在第一个示例中,当我请求84个值时,var.get.nc会给出错误:无效参数。然后,我通过在数据集中变化起点并一次只请求1个值来缩小故障范围,将故障缩小到第82个计数。问题发生的特定数字也会有所变化。我可以关闭并重新打开数据集,并在不同位置遇到问题。

在上述特定示例中,lon_val和lat_val分别为1595和1751,它们确定了我感兴趣的纬度和经度沿着数据集的位置。然而,第1595个纬度和第1751个经度并不是问题所在。然而,我尝试的所有其他纬度和经度都存在问题。

在气候变量维度(stval)中对数据集的起始位置进行变化和/或将其指定为命令中的数字(而不是对象stval)也无法解决该问题。

这个问题并不总是发生。我可以连续三次运行相同的代码(在运行之间清除所有对象),每次都得到不同的结果。第一次运行可能会卡在我尝试获取的第7个条目上,第二次可能会正常工作,第三次运行可能会在第83个条目上卡住。这种不一致的行为让我感到困惑。

open.nc函数也开始出现了相同的错误:无效参数。与var.get.nc问题一样,它也不稳定地出现。

有没有人知道是什么导致了提取变量的初始失败?我该如何防止它发生?可能与数据文件的大小(每个文件约60GB)以及我通过网络驱动器访问它们有关吗?

这也在这里提问过: 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

lon_val、lat_val和stval的值是什么?而p8m.tmax真的是来自open.nc的nc变量吗?sessionInfo()告诉你什么?你能分享一个文件链接或类似的链接以及你使用的完整代码吗? - mdsumner
@mdsumner p8m.tmax 是我如何将连接分配给tmax数据集的方式。就像p8m.tmax <- open.nc('tmax.nc')一样。在上面的特定示例中,lon_val和lat_val分别为1595和1751,它们标识了我感兴趣的纬度和经度在数据集中的位置。stval设置为which(time_vec==200201),在这种情况下等于1285。无论我是否将实际数字输入起始向量中,都会出现相同的问题(错误:无效参数)。 - sarcozona
@mdsumner,我无法分享数据链接,因为我不拥有这些数据,并且我对netcdf也不熟悉,无法创建类似的数据。每个数据文件也有60GB。示例代码在我的公共Dropbox的“Stack文件夹”中http://db.tt/BFn0W5Q。 - sarcozona
请在问题中提供详细信息,这是为了让人们更容易阅读和理解您的问题,而不必查看此事的历史记录。此外,您说“lon_val和lat_val分别为1595和1751”,但随后又说“纬度和经度”-您确定维度顺序正确吗?在这种情况下似乎不是问题,但您不应该将这样的细节未加说明。使用哪个版本的R和RNetCDF?(您可以使用sessionInfo()轻松总结这一点) - mdsumner
1个回答

0
为了解决这个问题,我从RNetCDF包(版本1.5.2-2)切换到ncdf包(1.6.5)。这两个包中的函数名称相似且目的相同[open.nc vs. open.ncdf, var.get.nc vs. get.var.ncdf]。使用完全相同的代码,只是将RNetCDF函数名称替换为ncdf函数,我没有出现任何错误并得到了预期结果。
因此,尽管以下RNetCDF命令有时会失败(原因不明),但使用ncdf包的相应命令则可以正常运行。
>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包中的函数有时候为什么有效,有时候为什么无效。但是,它确实允许我提取我需要的数据,并且希望对在R中使用netcdf数据的其他人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接