Usando reamostragem vs. agregada e estenda em R para ter rasters de resolução e extensão correspondentes

8

Eu tenho dois rasters de resolução e extensão diferentes:

> res(Elevation)
[1] 0.002083333 0.002083333

> res(Ann_precip)
[1] 0.008333333 0.008333333 

> extent(Elevation)
class       : Extent 
xmin        : -15.07722 
xmax        : -7.641806 
ymin        : 7.193611 
ymax        : 12.67694 

> extent(Ann_precip)
class       : Extent 
xmin        : -15.075 
xmax        : -7.641667 
ymin        : 7.191667 
ymax        : 12.675

Minha pergunta é : para que esses dois rasters tenham resoluções e extensões correspondentes, é melhor:

A) use a raster::aggregatefunção

> 0.008333333/0.002083333
[1] 4

Elevation_res<-aggregate(Elevation, fact=4, fun=mean)

e a raster::extendfunção

Elevation_res<-extend(Elevation_res, Ann_precip, values=NA)

(embora aqui eu ainda tenha extensões e resoluções diferentes, mas muito semelhantes):

> res(Elevation_res)
[1] 0.008333333 0.008333333

> res(Ann_precip)
[1] 0.008333333 0.008333333

> res(Elevation_res)==res(Ann_precip)
[1] FALSE FALSE

> extent(Elevation_res)
class       : Extent 
xmin        : -15.07722 
xmax        : -7.635556 
ymin        : 7.193611 
ymax        : 12.67694 

> extent(Ann_precip)
class       : Extent 
xmin        : -15.075 
xmax        : -7.641667 
ymin        : 7.191667 
ymax        : 12.675 

ou

b) use a raster::resamplefunção

Elevation_res<-resample(Elevation, Ann_precip, method="bilinear")

> res(Elevation_res)==res(Ann_precip)
[1] TRUE TRUE

> extent(Elevation_res)==extent(Ann_precip)
[1] TRUE

Estou perguntando isso porque li em Wegmann et al (2016) (p110) (se entendi corretamente) que a reamostragem afeta muito os valores de pixel, e isso aggregate(), extend()e crop()deve ser usada. Como as diferenças de resolução e extensão são bastante pequenas no meu caso, posso assumir que o viés criado pela reamostragem seria mínimo aqui?

M514
fonte

Respostas:

9

Verifique a resamplefunção do rasterpacote . Quando resampleé usado com o 'bilinearmétodo, a saída é a mesma que aggregate:

if (!skipaggregate) {
    rres <- res(y) / res(x)
    resdif <- max(rres)
    if (resdif > 2) {
        ag <- pmax(1, floor(rres-1))
        if (max(ag) > 1) {
            if (method == 'bilinear') {
                x <- aggregate(x, ag, 'mean')
            } else {  
                x <- aggregate(x, ag, modal)
            }
        }
    }

Com um exemplo:

library(raster)

r <- raster(nrow=4,ncol=8)

r2 <- raster(nrow=2,ncol=4)

r <- setValues(r,values = 1:32)

r_agg <- aggregate(r,fact=2,fun=mean)

r_resam <- resample(r,r2,method='bilinear')

values(r_resam) == values(r_agg)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

values(r_resam)
## [1]  5.5  7.5  9.5 11.5 21.5 23.5 25.5 27.5

Mas se você usar 'ngb'como método, o resultado será diferente (o método depende dos seus dados, se for categórico, você deve usar 'ngb'):

r_resam2 <- resample(r,r2,method='ngb')

values(r_resam2)
## [1] 10 12 14 16 26 28 30 32

E estender não altera a resolução, apenas a extensão:

r
## class       : RasterLayer 
## dimensions  : 4, 8, 32  (nrow, ncol, ncell)
## resolution  : 45, 45  (x, y)
## extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 

r_ext <- extend(r,r2,values=NA)

r_ext
## class       : RasterLayer 
## dimensions  : 4, 8, 32  (nrow, ncol, ncell)
## resolution  : 45, 45  (x, y)
## extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0

E crop()como extend(), não vai mudar a resolução.

aldo_tapia
fonte
@MarieL Desculpe, é medida (I grafada a palavra)
aldo_tapia
A bilinearopção é equivalente a meancomo a função aggregatee a ngbopção é equivalente a modal? Estou me referindo a casos em que o destino é de resolução mais grossa (tamanho de pixel maior) do que a entrada que precisa ser transformada.
user3386170
1
@ user3386170 sim, verifique estas linhas: github.com/cran/raster/blob/…
aldo_tapia