Large-scale vegetation-rainfall correlations in Africa

Weather and climatic variability affect vegetation on continental scales. Intuitively, healthy vegetation is greener. A quantitative index of “greenness” called Normalised Difference Vegetation Index (NDVI) was developed by NASA.  The index takes values between 0 and 1. NDVI is related to the fraction of photosynthetically active radiation absorbed by the vegetation canopy. It is a powerful tool in vegetation monitoring.

Quantifying the relationship between weather and vegetation on a regional scale is a statistical problem which requires long time-series of NDVI. GIMMS is a 25 year (1981-2006) NDVI dataset based on inputs from a sequence of NOAA weather satellites carrying AVHRR radiometers. The GIMMS team removed satellite drift, calibration effects etc.[1] Of course NDVI has a complex spatial variation which is related to variations in vegetation cover type, not to weather variations. To isolate the impact of weather variations, it makes sense to “standardize” NDVI. Vegetation Condition Index (VCI) is:

VCI=\frac{NDVI \; \:-\; \:NDVI_{min}}{NDVI_{max}-NDVI_{min}}

For example, NDVImin might refer to the minimum local May NDVI value observed during 1981-2006. A tropical rainforest and a semi-arid region have very different NDVI, but both may have VCI close to 1 during a favourable period.

The maps below show the correlation between VCI and 3-month Standardized Precipitation Index (SPI3) computed for Africa by calendar month. GIMMS 8km NDVI was upscaled to 200km to match the scale of gridded monthly climate datasets for precipitation (GPCP).[2] The red areas correspond to areas of high correlation between VCI and SPI3. Vegetation in these areas responsive to rainfall variations on a 3-month timescale. A striking feature  is the line high correlation in the Sahel region. Vegetation in the Sahel is highly sensitive to drought. Southern Africa is also highly rainfall sensitive during Dec-May. It is impressive that the combination of datasets of very different origins (GPCP and GIMMS) produces spatially and temporally consistent information.

Sensitivity of Vegetation to Precipitation 1981-2006


R code snippets

Most of the effort is in pre-processing the climate and NDVI data so that they share the same projection, grid, time coordinate etc. GDAL and the interp() function from the akima package were used for this purpose. Eventually we end up with SPI3 and VCI data represented by N × T matrices where N = Nx ×Ny is the dimension of the spatial maps and T is the number of observations. From there,  SPI3 and VCI maps were organized by calendar month,

vci.m <- lapply(seq(1:12),function(m) vci[,seq(from=m, to=T, by=12)])
spi3.m <- lapply(seq(1:12), function(m) spi3[,seq(from=m, to=T, by=12)])

Correlation maps between VCI and SPI3  for each calendar month are obtained from,

corr.maps <- lapply(seq(1:12),function(m) sapply(seq(1:N), function(i) cor( vci.m[[m]][i,],spi3.m[[m]][i,]) ))

Finally the above map table was produced using spplot() from the sp package with overlays from the maps package.

[1]  Tucker, C.J., J.E. Pinzon, and M.E. Brown (2004), Global Inventory Modeling and Mapping Studies, NA94apr15b.n11-VIg, 2.0, Global Land Cover Facility, University of Maryland, College Park, Maryland, 04/15/1994.

[2] SG: Adler, R.F., G.J. Huffman, A. Chang, R. Ferraro, P. Xie, J. Janowiak, B. Rudolf, U. Schneider, S. Curtis, D. Bolvin, A. Gruber, J. Susskind, P. Arkin, 2003: The Version 2 Global Precipitation Climatology Project (GPCP) Monthly Precipitation Analysis (1979-Present). J. Hydrometeor., 4,1147-1167.



  1. Is the complete data R file for reading and processing the data available for public use? Or is the processed NDVI, vci and spi3 available for public use?

  2. Peter, thanks for your interest

    The code contains some stuff which is meant for internal use at Biospherica. However if you need the processed NDVI/VCI/SPI3 data for Africa, we can provide these in .RData files?

  3. I will appreciate getting the data including the precipitation used to calulate SP13 and collect reference quote is used in any study for publication.

  4. Hi Joe
    Would it be possible to obtain sample R file with available codes for generating images as shown above?

  5. Hi Joe

    I have one more question to ask.
    I happened to find an old script to compute SPI using netcdf file.

    Do you this I can work around using gridded precipitation data using your old script?
    I was able to run the code until #pdata.mon[[m]], and it returns error message when I type in function for SPI, below 3 lines onward:

    #spi.m[[k]] is the spi index for timescale k
    #time-scale loop. k is timescale index 1 .. 12

    spi.m <- as.list(rep(0,N_timescale))
    for (k in 1:12){
    spi.m[[k]] <- as.list(rep(0,12))

    It says "Error in as.list(rep(0, N_timescale)) : object 'N_timescale' not found". Filename N_timescale wasn't identified throughout the script.

    Is there any updated or alternative script for this?


  6. Hi Joe

    Would it be possible for me to obtain full script for producing correlation maps?
    I have both SPI and NDVI file in raster format and would like to use your script.

    Thank you in advance!

  7. Hi Joe,
    I am an Agrometeorologist working for Malawi Meteorological Services. I am very much interested to reproduce the maps with your code but for my country Malawi. I am new to R but given direction I can manage to work things around. Can you please assist me with processed NDVI/VCI/SPI3 data for Malawi 32E to 37E and 8S to 18S. I would also like to request if I can be given the code used to produce the maps. I would appreciate if I can be assisted with such kind of data.
    Thank you Charles


Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.