I have a MODIS MOD11A2 (LST) grid, which has a spatial resolution of 1000m. For the purpose of Surface Energy Balance modelling, I'm trying to improve the resolution of this data to 250m, using a covariate like the NDVI. Lots of literature is available on this topic, with various titles and subjects like "spatial downscaling', 'downscaling co-kriging', etc.

I've been looking for software that is capable of performing this operation for me. Since I'm a R user, I was happy to find the dissever package (https://github.com/pierreroudier/dissever). However, this package seems like it is no longer maintained, and some errors prohibid me from using the package.

Does anyone know a working sofware package, preferably in R or Python, that is capable of performing such spatial downscaling?

  • 1
    Though not part of the classical downscaling literature, we had some good success using empirical orthogonal teleconnections for this purpose (though not via covariates). You could try to adapt the example we outline here jstatsoft.org/article/view/v065i10 – TimSalabim Nov 29 '17 at 12:10
  • 1
    dissever works with caret... If you have error with different versions of caret package, modify the code to adapt it into the latest format, or, install an old version of this package – aldo_tapia Nov 29 '17 at 12:15

I have used a robust regression approach, for downscaling of climate data, with consistent success. The idea is that you treat the lower-resolution data as the dependent variable, as a sample or population, and sample the higher-resolution data, treating it as the independent variable, to build a bivariate (or even multivariate) regression model. You then estimate the model to the higher-resolution data. You can do this using a variety of statistical models but, robust regressions can handle data with a very large n without introducing too much bias.

There is an function in the spatialEco 1.0-0 R package for downscaling rasters. Here is an example from the functions help.


elev <- raster::getData('alt', country='SWZ', mask=TRUE)
tmax <- raster::getData('worldclim', var='tmax', res=10, lon=8.25, lat=46.8)
  tmax <- crop(tmax[[1]], extent(elev))

tmax.ds <- raster.downscale(elev, tmax, scatter=TRUE)
  cat("Mean Square Error", tmax.ds$MSE, "\n")

    plot(tmax, main="Temp max")
    plot(elev, main="elevation")
    plot(tmax.ds$downscale, main="Downscaled Temp max") 

results of downscale function

  • Thank you for your solution! However, your functions calls psi.hampel, which belongs to namespace MASS. spatialEco does not have a active Github, where can I file this "bug?" :) – mcdesign Dec 1 '17 at 9:27
  • All you have to do is put psi.hampel in quotes, which I forgot. – Jeffrey Evans Dec 1 '17 at 15:58
  • I have not yet pushed this code to the GitHub repository (will update today) but, for future reference the package is at: github.com/jeffreyevans/spatialEco – Jeffrey Evans Dec 1 '17 at 17:18

One approach is to run a regression between the 1km MODIS-NDVI and MODIS-LST layers. Then assuming you obtain a good model fit, apply this model to the corresponding 250m NDVI layer. I have used robust linear regression in the past with ok results.

This is fairly straight forward to run using raster function. I might have some code i can dig out if required

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.