Masthead

Lab: Estimating Uncertainty

This lab will help you to estimate the uncertainty in your data.

Estimating Uncertainty in Remotely Sensed Predictors

1.Obtain a continuous raster. This can be one from your own research or the Humboldt County 10 meter DEM.

2. Use the code below to create a function that will compute the mean or standard deviation of a down-sampled raster. Note that the code contains examples of if statements, while loops and functions in R.

The code below requires the packages rgdal and raster. Please see the R website for information on installing these packages. I also highly recommend using small rasters to get started as these functions will take much longer with large rasters.

###############################################################################
# Function to obtain a down-sampled raster where each pixel represents the 
# mean of the pixels that it overlapped with in the original raster.
#
# Inputs:
# - OriginalRaster - The raster to be downsampled
#   CellSize - The number of pixels in the x and y directions that will be
#             downsampled for each new pixel(i.e. a 2 to convert 4 pixels to 1)
#   Type - The type of raster to be created
#         MEAN for a raster with the average value for the sub-sampled pixels
#         STDDEV for a raster with the standard deviation for the sub-sampled pixels
#         MIN for a raster with the minimum values from the sub-sampled pixels
#         MAX for a raster with max values
#         FIRST for the first value in each sub-sample.
###############################################################################

###############################################################################
# Constant definitions
###############################################################################

# these constants specify the "Type" of downsampled raster to obtain
MEAN=1
STDDEV=2
MIN=3
MAX=4
FIRST=5

###############################################################################
# The Function
###############################################################################

DownSampleRaster=function(OriginalRaster,CellSize,Type)
{
  # Get the matrix containing the pixels for the original raster
  TheMatrix=as.matrix(OriginalRaster)
  
  # Get the number of rows and columns in the original raster
  NumRasterColumns=ncol(OriginalRaster)
  NumRasterRows=nrow(OriginalRaster)
  
  # Get the number of rows and columns in the new raster
  NumRows=NumRasterRows/CellSize
  NumColumns=NumRasterColumns/CellSize
  NumRows=as.integer(NumRows)
  NumColumns=as.integer(NumColumns)
  
  # Create the matrix that will include the pixels for the new raster
  NewMatrix=matrix(nrow = NumRows,ncol=NumColumns) # 
  
  # Setup a variable with the number of cells in the subset as we'll use this again and again
  NumSubsetPixels=CellSize^2
  
  # Initialize the row and column counters
  Row=0
  Column=0
  
  while (Row<NumRows) # interate through each row in the new raster (we skip the last row if partial)
  {
    Column=0 # reset the column counter to go through each column for each row
    while (Column<NumColumns)
    {
      
      # Find the row and column indexes into the original raster
      FirstPixelX=Column*CellSize+1 # R indexes from 1
      FirstPixelY=Row*CellSize+1
      
      LastPixelX=FirstPixelX+CellSize-1
      LastPixelY=FirstPixelY+CellSize-1
      
      # Get the Subset from the original raster that is downsampled into the new raster
      Subset=TheMatrix[FirstPixelY:LastPixelY,FirstPixelX:LastPixelX]
      
      # Find the mean value
      # This can be replaced by other code to find the minimum, maximum, and std. dev.
      if (Type==MEAN)
      {
        Value=mean(Subset) 
      }
      else if (Type==STDDEV)
      {
        Value=sd(Subset)
      }
      else if (Type==MIN)
      {
        Value=min(Subset)
      }
      else if (Type==MAX)
      {
        Value=max(Subset)
      }
      else if (Type==FIRST)
      {
        Value=sd(Subset[1])
      }
      
      # Save the new value into the raster
      NewMatrix[Row+1,Column+1]=Value
      
      # Move to the next column
      Column=Column+1
    }
    Row=Row+1
  }
  # Create the new raster
  NewRaster=raster(NewMatrix)
  
  # Copy the spatial reference from the original raster to the new raster
  TheProjection=projection(OriginalRaster)
  projection(NewRaster)=TheProjection
  
  # Copy the raster extent (even downsampled, the extent is the same)
  # The pixels do get larger
  xmin(NewRaster)=xmin(OriginalRaster)
  xmax(NewRaster)=xmax(OriginalRaster)
  ymin(NewRaster)=ymin(OriginalRaster)
  ymax(NewRaster)=ymax(OriginalRaster)
  
  # return the new raster
  return(NewRaster)
}

3. Use the code below to call the function above to complete a mean or standard deviation raster by passing a defined "TYPE" to in with the function. In a standard deviation raster, each pixel represents the standard deviation of the pixels down sampled from in the original pixel. Try this for at least 3 cell sizes.

 # Setup the folder and file paths
FolderPath="C:\\jg2345\\GSP 570\\Lab 3 Predictor Uncertainty\\"

#InputFilePath=paste(FolderPath,"HumboldtDEM_10Meter.tif")
InputFilePath=paste(FolderPath,"Cropped_1.tif",sep="")

# Read the raster into a raster object
OriginalRaster=raster(InputFilePath)

# Setup the cell size
CellSize=2

# Get the downsampled raster
NewRaster=DownSampleRaster(OriginalRaster,CellSize,STDDEV)

# Setup the output file path
OutputFilePath=paste(FolderPath,"NewRaster",format(CellSize),".tif")

#Save the raster
writeRaster(NewRaster, filename=OutputFilePath, format="GTiff", overwrite=TRUE)

# convert the raster to a matrix that R can perform stats on
TheMatrix=as.matrix(NewRaster)
			

4. Compute the overall mean of the standard deviation raster. This is the average standard deviation for our down-sampled raster.

5. Estimate a mean standard deviation for each pixel in the original raster. A formal process for this would include making measurements in the area the raster originated from and developing an approximation for the standard deviation. We'll estimate this by making a visual examination of the area around campus but if you can visit your study site, you can do this yourself. Remember that the standard deviation contains about 2/3's of the values within one standard deviation of the mean.

6. Write a function in R to inject noise (randomness) into the original raster (you can use the function above as a starting point).

7. Create a loop that injects noise into a raster, finds the overall (mean) standard deviation of the raster, saves this in a vector, and then repeats the process.

8. Plot the histogram of your results.

The image below illustrates this process. The "Original Raster" is the one we started with. We take it and add some "random noise" to create a noisy raster. This is simulating the process of collecting another dataset without having to go out in the field. Typically we would down sample this raster and then use it in our models. However, this exercise is seeing about how noise affects our models so we want to create a raster with the standard deviation of each of the pixels in the Down-sampled raster instead. Then, we'll record the means of the standard deviation rasters and repeat the process a number of times. When done, take a look at the histogram and see what effect the noise is having on your raster covariate layers.

9. Finally, run the loop above with the different cell sizes.

2. Quantifying the uncertainty in interpolated rasters (Extra Credit)

1. Obtain a point data set to create an interpolated surface. If you do not have one, you can use a remotely sensed dataset (such as a DEM) and select points that might be used for interpolation (flat spots, etc.).

2. Create an interpolated surface from the point data set.

3. Find the overall standard deviation for the raster. This will only quantify the uncertainty in the process of interpolating, not the uncertainty from sub-sampling the data or the uncertainty in measurements.

4. Estimate the standard deviation of the data.

5. Randomly subsample the original data set (or raster) and add error based on the standard deviation.

6. Repeat 5 and 6 saving the min, max, and standard deviation values.

Question: What is the effect of different numbers of sub-samples on the uncertainty of our final interpolated raster.

Additional Resources

Introduction to the "Raster" package

Package Raster


© Copyright 2018 HSU - All rights reserved.