Stratified random sampling in GRASS GIS

There are various options to create a vector or raster layers with random sample points, including v.random, r.random and r.random.cells. The first two generate random points within the defined region. However, only r.random will respect the mask if set. The r.random.cells creates random points with spatial dependency.

But how to carry out stratified random sample points with e.g. an equal sample sizes per strata? You would need to divide your sample area in the desired strata, and sample each stratum separately. Below are two possible approaches, one using r.random and another using the GRASS add-on v.random.cover.

Edit: As pointed out by Anna in the comments, there is now a new addon for GRASS that basically automates the steps in the first example, creating sampling points from each category in a raster map (

Using r.random

Suppose we want to divide our area of interest in three different strata. On the raster layer ‘STRATA, these are mapped and numbered as 1, 2 and 3. We would then create a mask of stratum 1, create a layer with X random sample points, create a new mask for stratum 2, create a random point layer again, etc. If you have to deal with many strata, this can best be done using a loop.

STRATA = ( 1 2 3 )
for ST in ${STRATA[@]}; do
  r.mask -o input=a maskcats=$ST
  r.random input=STRATA vector_output=samplepoints_$ST n=100
v.patch -e input=`g.mlist type=vect pattern=samplepoints_* \
separator=,` output=samplepoints

In the example, the output is given a s a vector layer. Depending on your further analysis, you can also opt for a raster layer  instead of a vector point layer, or both.

One problem you are likely to encounter when using r.sample is that it will often return less then the requested number of sample points. One option, if you are creating a vector layer, is to create more points then you need, and later select as sub-set with the required number of sample points. Edit: this problem has been solved, the function should return the exact number of points now.

The other option is to (1) create the random sample points, (2) check how many sample points you have and if these are less then the required number, (3) create an additional set of sample points, (4) repeat steps 2 and 3 till you have enough points. This is, if I am correct, the solution the v.random.cover add-on follows.

Using v.random.cover

You can find the v.random.cover add-on in the GRASS addon repositories or install it using the g.extension function. It allows you to create random sample points within selected polygons of a vector layer. Strata should be identified by the vector category values. In the example below, I am using the STRATA vector layer.

STRATA = ( 1 2 3 )
for ST in ${STRATA[@]}; do
  r.mask -o input=a maskcats=$ST
  v.random.cover input=STRATA output=samplepoints_$ST n=100
v.patch -e input=`g.mlist type=vect pattern=samplepoints_* \
separator=,` output=samplepoints

An advantage of this script is that it checks the number of sample points created, and will automatically add sample points till the desired number of points have been created.

If you have a map where the strata are identified in one of the columns of your attribute table rather then the vector category values, use v.reclass first to create a new layer where the category values represent the strata.

See my next post for a short explanation how to carry out stratified random sampling in QGIS.


3 thoughts on “Stratified random sampling in GRASS GIS

  1. Pingback: Stratified random sampling in QGIS | Ecostudies

    1. Hi Anna, thanks for the tip. Looks like a very useful addon. One small suggestion for the manual page, perhaps good to add as keyword “stratified sampling”?

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s