Search code examples
rrasterlogistic-regressionr-raster

Apply boot::inv.logit() to a raster in R


I have a Formal Class Raster and I am trying to apply the boot::inv.logit() function to its raster cells, for example:

r1 <- raster(nrows=25, ncols=25, vals=rtnorm(n = 625, .1, .9))
r2 <- boot::inv.logit(r1)

However, when I try that, it retruns an error:

> Error in plogis(x) : Non-numeric argument to mathematical function

If I turn the raster into a matrix, and then back to raster, it gets the job done, but I loose all the other info associated with the "Formal Class Raster" I had at the beginning, which is not ideal:

r2 <- boot::inv.logit(as.matrix(r1))
r2 <- as.raster(r2)

Is there an easy way to either recover the Formal Class Raster info I had before or apply the inv.logit() to the raster without the as.matrix() transformation? Thank you in advance.


Solution

  • If you want to apply the function to the raster, use the calc method from raster:

    r2 <- calc(r1,boot::inv.logit)
    
    > r2 
    
    # class       : RasterLayer 
    # dimensions  : 25, 25, 625  (nrow, ncol, ncell)
    # resolution  : 14.4, 7.2  (x, y)
    # extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
    # coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
    # data source : in memory
    # names       : layer 
    # values      : 0.07434905, 0.9498965  (min, max)
    

    Alternatively, you can make an empty copy of r1, and just fill in the values coming out of inv.logit:

    r2 <- raster(r1)
    r2[] <- boot::inv.logit(as.matrix(r1))