8. NetCDF Proxy Workflows

David Blodgett

star の vignette のより良いバージョンは、 https://r-spatial.github.io/stars/articles/ を参照。

NetCDFデータソースはより細かいファイルやOPeNDAPエンドポイントを介して利用可能である。この記事では、stars、このようなソース-データ構成スキームの広い範囲にわたってNetCDFデータの発見、アクセス、処理を可能にする方法を紹介する。

まず、stars のインストールに含まれるデータセットを使って、いくつかの基本的なことから始めることにする。デフォルトの閾値より小さいデータセットに対して read_ncdf() を呼ぶと、すべてのデータを読み込むだけである。以下では reduced.nc NetCDF ファイルを読み込んで表示する。

library(stars)
#> Loading required package: abind
#> Loading required package: sf
#> Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
f <- system.file("nc/reduced.nc", package = "stars")
(nc <- read_ncdf(f))
#> no 'var' specified, using sst, anom, err, ice
#> other available variables:
#>  lon, lat, zlev, time
#> 0-360 longitude crossing the international dateline encountered.
#> Longitude coordinates will be0-360 in output.
#> Will return stars object with 16200 cells.
#> No projection information found in nc file. 
#>  Coordinate variable units found to be degrees, 
#>  assuming WGS84 Lat/Lon.
#> stars object with 4 dimensions and 4 attributes
#> attribute(s):
#>                Min. 1st Qu. Median       Mean 3rd Qu.  Max.  NA's
#> sst [°C]      -1.80   -0.03 13.655 12.9940841 24.8125 32.97  4448
#> anom [°C]     -7.95   -0.58 -0.080 -0.1847324  0.2100  2.99  4449
#> err [°C]       0.11    0.16  0.270  0.2626872  0.3200  0.84  4448
#> ice [percent]  0.01    0.47  0.920  0.7178118  0.9600  1.00 13266
#> dimension(s):
#>      from  to offset delta  refsys         values x/y
#> lon     1 180     -1     2  WGS 84           NULL [x]
#> lat     1  90    -90     2  WGS 84           NULL [y]
#> zlev    1   1     NA    NA      NA              0    
#> time    1   1     NA    NA POSIXct 1981-12-31 UTC

1タイムステップではなく、reduced.nc が10年分の時系列データだったとしよう。130KB程度ではなく、10GB以上となり、すべてをメモリに読み込むことはできないだろう。この場合、ワークフローの目的に合った方法で反復処理できるように、ファイルのメタデータを読み取る方法が必要である。そこで登場するのが、proxy = TRUE。以下では、read_ncdf() のデフォルトをプロキシにするかどうかを制御するオプションを下げ、proxy = TRUE を使用して、同じ結果を得るための両方の方法を紹介する。

old_options <- options("stars.n_proxy" = 100)
(nc <- read_ncdf(f, proxy = TRUE))
#> no 'var' specified, using sst, anom, err, ice
#> other available variables:
#>  lon, lat, zlev, time
#> 0-360 longitude crossing the international dateline encountered.
#> Longitude coordinates will be0-360 in output.
#> No projection information found in nc file. 
#>  Coordinate variable units found to be degrees, 
#>  assuming WGS84 Lat/Lon.
#> netcdf source stars proxy object from:
#> [1] "[...]/reduced.nc"
#> 
#> Available nc variables:
#> sst
#> anom
#> err
#> ice
#> 
#> dimension(s):
#>      from  to offset delta  refsys         values x/y
#> lon     1 180     -1     2  WGS 84           NULL [x]
#> lat     1  90    -90     2  WGS 84           NULL [y]
#> zlev    1   1     NA    NA      NA              0    
#> time    1   1     NA    NA POSIXct 1981-12-31 UTC
options(old_options)

上記は reduced.nc ファイルから作成した NetCDF ソースの恒star プロキシを表示している。4つの変数があり、その単位が表示されているのがわかる。通常の stars dimension(s) が利用可能で、さらに nc_request オブジェクトも利用可能である。nc_request オブジェクトは NetCDF データソースの次元に応じたデータの要求を行うために必要な情報を含んでいる。この情報により、私たちは欲しいもので、大きすぎないデータの塊を要求するのに必要なものを手に入れた。

(nc <- read_ncdf(f, 
                 var = "sst", 
                 ncsub = cbind(start = c(90, 45, 1 , 1), 
                              count = c(90, 45, 1, 1))))
#> 0-360 longitude crossing the international dateline encountered.
#> Longitude coordinates will be0-360 in output.
#> Will return stars object with 4050 cells.
#> No projection information found in nc file. 
#>  Coordinate variable units found to be degrees, 
#>  assuming WGS84 Lat/Lon.
#> stars object with 4 dimensions and 1 attribute
#> attribute(s):
#>          Min. 1st Qu. Median     Mean 3rd Qu.  Max. NA's
#> sst [°C] -1.8   -1.04     14 12.92722   25.13 29.81  757
#> dimension(s):
#>      from to offset delta  refsys         values x/y
#> lon     1 90    177     2  WGS 84           NULL [x]
#> lat     1 45     -2     2  WGS 84           NULL [y]
#> zlev    1  1     NA    NA      NA              0    
#> time    1  1     NA    NA POSIXct 1981-12-31 UTC

plot(nc)

NetCDFのメタデータを見ることができるので、データに対してきちんとしたリクエストをすることができるのは便利だが、プロキシオブジェクトの本当の力は、それを「遅延評価」コーディングスタイルで使うことができることである。つまり、実際にデータボリュームにアクセスする前に、別のデータセットとサブセットするような仮想的な操作をオブジェクトに対して行うことができるのである。

怠慢な操作。

stars_proxy オブジェクトで可能な遅延操作には2種類ある。あるものは、基礎データにアクセスすることなく、stars_proxy オブジェクト自体に適用することができる。他のものは、データが実際に必要とされるときに適用される呼び出しの連鎖として構成されなければならない。

stars_proxy オブジェクトに適用されるメソッドである。

select - [<- - adrop - aperm - is.na - split - st_apply - predict - merge - st_crop - drop_levels - Ops (+, -などのグループ総称) - Math (abs, sqrt, tanなどのグループ総称) - filter - mutate - tansmute - rename - pull - slice * NetCDF用のハイパースラビングは上記のようにすればよいのでは? - pull - replace_na

stars_proxy オブジェクトを取得し、stars オブジェクトにするためのメソッドである。