ohi logo
OHI Science | Citation policy

Summary

The commercial fishing pressure layers are created from spatialized catch by gear data provided by Watson (2017), and net primary production data from the Vertically Generalized Production Model (VGPM) as described in Behrenfeld and Falkowski (1997)

Three layers are created in this analysis, commercial fishing pressure from high bycatch gear and low bycatch gear as well as artisanal fishing pressure.

Updates from previous assessment

Previously, catch data from the Sea Around Us Project was used in conjunction with spatial data from Halpern 2008 to assign proportional catch to each gear type. Watson (2017) published updated sptial catch data by gear type from 1950-2014 and that is used in this assessment as it more accurately represents the type of information needed for these layers.


Data Source

Reference: Watson (2017)

Downloaded: April 21, 2017

Description: Catch per half degree cell (raw values are in tons per km2)

Native data resolution: 0.5 degree

Time range: 2003 - 2014 (raw data goes back to 1950 but NPP data limits time series to 2003)

Format: Tabular


Methods

Setup

Load all relevant libraries including parallel processing packages.

#set options for all chunks in code
knitr::opts_chunk$set(warning=FALSE, message=FALSE,fig.width = 6, fig.height = 4, fig.path = 'figs/')

# comment out when knitting
# setwd("globalprep/prs_fish/v2017")

library(tidyverse)
library(parallel)
library(foreach)
library(doParallel)
library(raster)
library(rasterVis)
library(seaaroundus)
library(RColorBrewer)
library(cowplot)
library(stringr)

source('../../../src/R/common.R')

ocean <- raster::raster(file.path(dir_M, 'model/GL-NCEAS-Halpern2008/tmp/ocean.tif'))

registerDoParallel(14) #registering cores for parallel processing

options(scipen=999)

cols = rev(colorRampPalette(brewer.pal(11, 'Spectral'))(255)) # rainbow color scheme
mytheme=rasterTheme(region=cols)

#set mollweide projection CRS
  mollCRS=crs('+proj=moll +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs')
  
#paths
 dir_git <- file.path(dir_M,'git-annex/globalprep/prs_fish/v2017')

Aggregate annual catch by type

First get the template raster with a resolution of 0.5 degree cells. The getcells() function comes from the seaaroundus R package.

The values of these cells are the Cell ID numbers. In the fisheries catch dataset, these Cell ID numbers match up with the “Seq” numbers.

  saup_cells <- getcells("POLYGON ((-180 90, 180 90, 180 -90, -180 -90, -180 90))")

   saup_rast <- raster(ncol=720, nrow=360)
   saup_rast[] <- saup_cells
   
   plot(saup_rast,col=cols,main = "SAUP Cell IDs")

For each year read in the raw data, filter for appropriate type (high, low and artisanal) and then summarize total catch per cell (in tons/km2)

years = c(2003:2014)

foreach(yr = years) %dopar%{ #yr = 2014
  
  #read in raw data for the year
  raw <- readRDS(paste0(file.path(dir_M,'marine_threats/impact_acceleration/stressors/comm_fish/int/catch_data_'),yr,'.rds'))
  
  #high bycatch
  high <- raw %>%
          dplyr::filter(bycatch == "high") %>%
          rowwise() %>%
          dplyr::mutate(catch = sum(LSF_CR, IUU_CR, Discards_CR, na.rm=TRUE) * 1000) %>% #there shouldnt be NAs but just in case, converting from tonnes to kg to get rid of low values
          dplyr::group_by(Seq) %>%
          dplyr::summarise(cell_catch = sum(catch))
          
    #rasterize catch by swapping cell ids with 
raster::subs(saup_rast, high, by = 1, which = 2, subsWithNA=TRUE, filename = paste0('int/high_bycatch/annual_catch/high_bc_',yr,'.tif'), overwrite=TRUE) 
  
  #low bycatch
  low <- raw%>%
          filter(bycatch == "low")%>%
          rowwise()%>%
          mutate(catch = sum(LSF_CR, IUU_CR, Discards_CR, na.rm=TRUE) * 1000)%>% #there shouldnt be NAs but just in case
          group_by(Seq)%>%
          summarise(cell_catch = sum(catch))


raster::subs(saup_rast, low, by = 1, which = 2, subsWithNA=TRUE, filename = paste0('int/low_bycatch/annual_catch/low_bc_',yr,'.tif'),overwrite=T) 
  
  #artisanal bycatch
  artisanal <- raw%>%
               group_by(Seq)%>%
              summarise(cell_catch = sum(SSF_CR * 1000)) #small scale fisheries catch rate
  
raster::subs(saup_rast, artisanal, by = 1, which = 2, subsWithNA=TRUE, filename = paste0('int/artisanal/annual_catch/art_',yr,'.tif'),overwrite=T)
}

Meta-analyis

I wanted to look at how well our high and low bycatch gear designations align with the reported discard rates per cell. While not perfect, the majority of cells show that catch caught with high bycatch gear leads to a higher proportion of discards than when caught with low bycatch gear.

#read in raw data for the year
  raw <- readRDS(paste0(file.path(dir_M,'marine_threats/impact_acceleration/stressors/comm_fish/int/catch_data_2014.rds')))

  df <- raw %>% 
        dplyr::select(Seq, OceanArea, LSF_CR, SSF_CR, IUU_CR, Discards_CR, bycatch) %>%
        rowwise() %>%
        mutate(catch = sum(SSF_CR, LSF_CR, IUU_CR, Discards_CR)*OceanArea,
               discards = Discards_CR * OceanArea) %>%
        group_by(Seq, bycatch) %>%
        mutate(gear_cell_catch = sum(catch)) %>%
        ungroup() %>%
        dplyr::select(-LSF_CR, -OceanArea, -SSF_CR, -IUU_CR, -Discards_CR) %>%
        group_by(Seq, bycatch) %>%
        mutate(disc_cell_catch = sum(discards)) %>%
        dplyr::select(-catch, -discards) %>%
        distinct() %>%
        ungroup() %>%
        mutate(disc_prop = disc_cell_catch/gear_cell_catch) %>%
        dplyr::select(Seq, bycatch, disc_prop) %>%
        spread(bycatch, disc_prop) %>%
        mutate(ratio = high/low)
        
plot(df$high ~ df$low, ylab = "Prop. of catch discarded using high bycatch gears", xlab = "Prop. of catch discarded using low bycatch gears")
abline(0,1,col="red")

Net Primary Production (NPP)

The Net Primary Production data was prepared in npp.Rmd.

npp <- list.files(file.path(dir_M,'git-annex/globalprep/prs_fish/v2016/VGPM_primary_productivity/int/annual_npp'), pattern = 'npp_2', full.names=TRUE)

plot(raster(npp[12]), col=cols, axes=FALSE, main = 'Net Primary Production (mg C/m2/day) \n 2014')

Standardize by NPP

Total catch per cell is standardized by the NPP values. This is done because the same fishing pressure can have different impacts depending on the productivity in the region.

Before standardizing, the NPP data is aggregated to the same spatial resolution as the catch data, 0.5 degree cells, to accurately calculate catch in tons/km2 standardized by mg C/m2/day.

npp_stand <- function(file,fname){
  
  yr <- substr(file,nchar(file)-7,nchar(file)-4)
  
  catch <- raster(file)
  
  #get net primary production for that year
  n <- npp[substr(npp,111,114)==yr] %>%
          raster() %>%
          projectRaster(saup_rast) %>%
          resample(.,saup_rast)

  #3. Divide catch by npp and save to git-annex
  overlay(catch,n,fun=function(x,y){x/y},filename = paste0('int/', fname,'/annual_catch_npp/annual_catch_npp_', yr, '.tif'), overwrite=TRUE, progress="text") 

}

#apply the function
hb_files <- list.files('int/high_bycatch/annual_catch', full.names=TRUE)
lb_files <- list.files('int/low_bycatch/annual_catch', full.names=TRUE)
art_files <- list.files('int/artisanal/annual_catch', full.names=TRUE)

lapply(hb_files,npp_stand,fname = "high_bycatch")
lapply(lb_files,npp_stand,fname = "low_bycatch")
lapply(art_files,npp_stand,fname = "artisanal")

Five year means

Mean catch per cell is calculated over a rolling window of 5 years to account for interannual variability. The data is then log transformed.

lb_npp <- list.files('int/low_bycatch/annual_catch_npp', full.names=TRUE)
hb_npp <- list.files('int/high_bycatch/annual_catch_npp', full.names=TRUE)
art_npp <- list.files('int/artisanal/annual_catch_npp', full.names=TRUE)

registerDoParallel(6)

foreach (i = 2003:2010) %dopar%{ # i = 2010
  
  yrs <- c(i:(i+4))
  
  out_lb <- lb_npp[which(substr(lb_npp, 51, 54) %in% yrs)] %>%
            stack() %>%
            calc(fun=function(x){mean(x, na.rm=TRUE)}) %>%
            calc(fun=function(x){log(x+1)}, filename = paste0('int/low_bycatch/five_year_means/mean_catch_',yrs[1],'_',yrs[5],'.tif'),overwrite=TRUE)
  
  out_hb <- hb_npp[which(substr(hb_npp, 52, 55) %in% yrs)] %>%
            stack() %>%
            calc(fun=function(x){mean(x,na.rm=TRUE)}) %>%
            calc(fun=function(x){log(x+1)}, filename = paste0('int/high_bycatch/five_year_means/mean_catch_',yrs[1],'_',yrs[5],'.tif'), overwrite=TRUE)
  
  out_art <- art_npp[which(substr(art_npp,49,52) %in% yrs)]%>%
            stack()%>%
            calc(fun=function(x){mean(x,na.rm=T)})%>%
            calc(fun=function(x){log(x+1)}, filename = paste0('int/artisanal/five_year_means/mean_catch_',yrs[1],'_',yrs[5],'.tif'),overwrite=T)
  
}

Reference Point

Look at all mean catch data standardized by NPP and use the 99.99th quantile as the reference point.

mean_hb <- list.files('int/high_bycatch/five_year_means', full.names=TRUE)
mean_lb <- list.files('int/low_bycatch/five_year_means', full.names=TRUE)
mean_art <- list.files('int/artisanal/five_year_means', full.names = TRUE)

# HIGH BYCATCH

#get data across all years
vals <- c()

for(i in 2007:2014){ # i = 2007
#print(i)
  m <- mean_hb[which(str_sub(mean_hb, -8, -5) == i)] %>%
    raster()%>%
    getValues()
  
 n <- m[!is.na(m)]

  vals <- c(vals, n)

}

ref_hb <- quantile(vals, prob = 0.9999, na.rm=T)  #9.48


#LOW BYCATCH

#get data across all years
lb_vals <- c()

for(i in 2007:2014){

  m <- mean_lb[which(str_sub(mean_lb, -8, -5) == i)] %>%
    raster() %>%
    getValues()

  n <- m[!is.na(m)]
  
  lb_vals <- c(lb_vals, n)

}

ref_lb <- quantile(lb_vals, prob = 0.9999, na.rm=TRUE) #10.24

#Artisanal
#LOW BYCATCH

#get data across all years
art_vals <- c()

for(i in 2007:2014){

  m <- mean_art[which(str_sub(mean_art, -8, -5) == i)]%>%
    raster()%>%
    getValues()

  n <- m[!is.na(m)]
  
  art_vals <- c(art_vals,n)

}

ref_art <- quantile(art_vals, prob = 0.9999, na.rm=TRUE) #6.89

The reference point is 8.6706183 for high bycatch, 9.4098829 for low bycatch and 5.9811736 for artisanal.

Rescale, Resample and Reproject

mean_hb <- list.files('int/high_bycatch/five_year_means',full.names=T)
mean_lb <- list.files('int/low_bycatch/five_year_means',full.names=T)
mean_art <- list.files('int/artisanal/five_year_means',full.names = T)

registerDoParallel(8)

foreach (i = 2003:2010) %dopar%{ # i = 2003
  
  yrs <- c(i:(i+4))
  
  out_hb <- mean_hb[which(substr(mean_hb, 45, 48) == i)] %>%
            raster()%>%
            calc(fun=function(x){ifelse(x>ref_hb, 1, x/ref_hb)}) %>%
            calc(fun=function(x){ifelse(x<0, 0, x)}) %>%
            projectRaster(crs = mollCRS, over=TRUE, method = 'ngb') %>%
            resample(ocean, method = 'ngb', filename = paste0(file.path(dir_git), '/output/high_bycatch/hb_fish_pressure_', yrs[1], '-', yrs[5], '.tif'), overwrite = TRUE)
  
  out_lb <- mean_lb[which(substr(mean_lb, 44, 47) == i)] %>%
            raster() %>%
            calc(fun=function(x){ifelse(x>ref_lb, 1, x/ref_lb)}) %>%
            calc(fun=function(x){ifelse(x<0, 0, x)}) %>%
            projectRaster(crs = mollCRS, over=TRUE, method = "ngb") %>%
            resample(ocean, method = 'ngb', filename = paste0(file.path(dir_git),'/output/low_bycatch/lb_fish_pressure_',yrs[1],'-',yrs[5],'.tif'),overwrite=T)


  out_art <- mean_art[which(substr(mean_art, 42, 45) == i)] %>%
            raster() %>%
            calc(fun = function(x){ifelse(x>ref_art, 1, x/ref_art)}) %>%
            calc(fun = function(x){ifelse(x<0, 0, x)}) %>%
            projectRaster(crs = mollCRS, over=TRUE, method = "ngb") %>%
            resample(ocean, method = 'ngb', filename = paste0(file.path(dir_git), '/output/artisanal/art_fish_pressure_', yrs[1], '-', yrs[5], '.tif'), overwrite=TRUE)

}

Results

hb <- raster(file.path(dir_git, 'output/high_bycatch/hb_fish_pressure_2010-2014.tif'))
lb <- raster(file.path(dir_git, 'output/low_bycatch/lb_fish_pressure_2010-2014.tif'))
art <- raster(file.path(dir_git, 'output/artisanal/art_fish_pressure_2010-2014.tif'))

s = stack(hb, lb, art)
plot(s, col=cols, axes=FALSE, box=FALSE)


Extract the data by OHI region

setwd('globalprep/prs_fish/v2017')

# raster/zonal data

zones <- raster(file.path(dir_M, "git-annex/globalprep/spatial/v2017/regions_eez_with_fao_ant.tif"))  # raster data
rgn_data <- read.csv(file.path(dir_M, "git-annex/globalprep/spatial/d2014/data/rgn_mol_raster_1km/regionData.csv"))    # data for sp_id's used in raster

### Low bycatch data first
# get raster data:
rasts <- list.files(file.path(dir_git,'output/low_bycatch'), full =TRUE)

pressure_stack <- stack(rasts)

# extract data for each region:
regions_stats <- zonal(pressure_stack,  zones, fun="mean", na.rm=TRUE, progress="text")
regions_stats2 <- data.frame(regions_stats) 
write.csv(regions_stats2, "int/low_bycatch.csv", row.names=FALSE)
setdiff(regions_stats2$zone, rgn_data$ant_id) 
setdiff(rgn_data$ant_id, regions_stats2$zone)

data <- merge(rgn_data, regions_stats2, all.y=TRUE, by.x="rgn_id", by.y="zone") %>%
  tidyr::gather("year", "pressure_score", starts_with("lb")) 

lb_data <- data %>%
  dplyr::mutate(year = stringr::str_sub(year, -4, -1)) %>%
  dplyr::mutate(year = as.numeric(year)) %>%
  dplyr::filter(rgn_id <= 250) %>%
  dplyr::select(rgn_id, year, pressure_score)

write.csv(lb_data, "output/lb.csv", row.names=FALSE)
summary(lb_data)
filter(lb_data, is.na(pressure_score))

rasts <- list.files(file.path(dir_git,'output/high_bycatch'), full = TRUE)

pressure_stack <- stack(rasts)

# extract data for each region:
regions_stats <- zonal(pressure_stack,  zones, fun="mean", na.rm=TRUE, progress="text")
regions_stats2 <- data.frame(regions_stats)
write.csv(regions_stats2, "int/high_bycatch.csv", row.names = FALSE)
setdiff(regions_stats2$zone, rgn_data$ant_id) 
setdiff(rgn_data$ant_id, regions_stats2$zone) 

data <- merge(rgn_data, regions_stats, all.y=TRUE, by.x="rgn_id", by.y="zone") %>%
  tidyr::gather("year", "pressure_score", starts_with("hb")) 

hb_data <- data %>%
  dplyr::mutate(year = stringr::str_sub(year, -4, -1)) %>%
  dplyr::mutate(year = as.numeric(year)) %>%
  dplyr::filter(rgn_id <= 250) %>%
  dplyr::select(rgn_id, year, pressure_score) # na values 71, 72, 74, 75, 188, 215

write.csv(hb_data, "output/hb.csv", row.names=FALSE)


rasts <- list.files(file.path(dir_git,'output/artisanal'), full = TRUE)

pressure_stack <- stack(rasts)


# extract data for each region:
regions_stats <- zonal(pressure_stack,  zones, fun="mean", na.rm=TRUE, progress="text")
regions_stats2 <- data.frame(regions_stats)
write.csv(regions_stats2, "int/artisanal.csv", row.names = FALSE)
setdiff(regions_stats2$zone, rgn_data$ant_id) # antarctica regions are in there, makes sense....no land
setdiff(rgn_data$ant_id, regions_stats2$zone) # 213 is in there, that makes sense (Antarctica)

data <- merge(rgn_data, regions_stats, all.y=TRUE, by.x="rgn_id", by.y="zone") %>%
  tidyr::gather("year", "pressure_score", starts_with("art")) 

art_data <- data %>%
  dplyr::mutate(year = stringr::str_sub(year, -4, -1)) %>%
  dplyr::mutate(year = as.numeric(year)) %>%
  dplyr::filter(rgn_id <= 250) %>%
  dplyr::select(rgn_id, year, pressure_score)

write.csv(art_data, "output/art.csv", row.names=FALSE)

## compare with previous year's data

new <- read.csv("output/lb.csv") %>%
  filter(year == 2010) %>%
  dplyr::select(rgn_id, new_pressure_score = pressure_score) 

old <- read.csv("../v2016/output/comm_fish_lb_2016.csv") %>%
  left_join(new, by = 'rgn_id')

plot(old$new_pressure_score, old$pressure_score)
abline(0, 1, col="red")


new <- read.csv("output/hb.csv") %>%
  filter(year == 2010) %>%
  dplyr::select(rgn_id, new_pressure_score = pressure_score) 

old <- read.csv("../v2016/output/comm_fish_hb_2016.csv") %>%
  left_join(new, by = 'rgn_id')

plot(old$new_pressure_score, old$pressure_score)
abline(0, 1, col="red")


new <- read.csv("output/art.csv") %>%
  filter(year == 2010) %>%
  dplyr::select(rgn_id, new_pressure_score = pressure_score) 

old <- read.csv("../v2016/output/artisanal_fish_lb_2016.csv") %>%
  left_join(new, by = 'rgn_id')

plot(old$new_pressure_score, old$pressure_score)
abline(0, 1, col="red")

Citation information

Watson, R. A. (2017). A database of global marine commercial, small-scale, illegal and unreported fisheries catch 1950–2014. Scientific Data, 4.