knitr::opts_chunk$set(echo=FALSE, warning = FALSE, message = FALSE, cache = FALSE, progress = TRUE, verbose = FALSE, comment = F , error = FALSE, dev = 'png', dpi = 200) options(knitr.kable.NA = '')
Exploration of discard estimates from may year module developed for hake
pull all merged trips from CAMS_OBS_CATCH
Set stratification variables for all trips
# FULL Stratification variables stratvars = c('SPECIES_STOCK' ,'CAMS_GEAR_GROUP' , 'MESHGROUP' , 'TRIPCATEGORY' , 'ACCESSAREA')
- SPECIES_STOCK is taken from CAMS support table `MAPS.CAMS_STATAREA_STOCK` - CAMS_GEAR_GROUP is derived from a support table (`MAPS.CAMS_GEARCODE_STRATA`) - MESHGROUP is hardcoded for all trips according to decisions made by the mesh subgroup (see summary when available) - SECTID comes from a CAMS matching table (`MAPS.MATCH_MULT_SECTID`)
discaRd
# Assumed Stratification variables stratvars = c('SPECIES_STOCK' , 'CAMS_GEAR_GROUP')
The discaRd functions allow for an assumed rate to be calculated. This assumed rate is realtive to the stratification used in the functions. Here, the stratification is coarsened to 'SPECIES_STOCK', 'CAMS_GEAR_GROUP' and 'MESHGROUP'.
A transition rate is calculated between year t and year t-1. This rate determines how much, if any, information is used from previous years.
Rates and DISCARD_SOURCE
(in parentheses) are assigned for each trip according to:
CV calculations are available for (I) and (T). Obtaining a CV estimate for (A) would require a second pass of discaRd functions.
Discard pounds per trip are calculated according to
mutate(coalesce(DISC_MORT_RATIO, 1)) %>% mutate(DISCARD = case_when(!is.na(LINK1) ~ DISC_MORT_RATIO*OBS_DISCARD , is.na(LINK1) ~ DISC_MORT_RATIO*COAL_RATE*LIVE_POUNDS) # COAL_RATE is the final discard rate used. It is 'coalesced' from the (I), (A) and (B) rates
By assigning SPECIES_STOCK
as a stratification variable, the computation time is reduced. Each subtrip may only occur in a single statistical area so it should never cross stock boundaries.
Once the full table (CAMS_OBS_CATCH) is loaded, each species takes ~X seconds to process on the server.
Output tables are produced for each species. These can easily be recombined. An example table has been shared on MAPS
and CAMS_GARFO
.
MAPS.CAMS_DISCARD_EXAMPLE_CY_BARNDOORSKATE_19 CAMS_GARFO.CAMS_DISCARD_EXAMPLE_CY_BARNDOORSKATE_19 MAPS.CAMS_DISCARD_EXAMPLE_CY_CLEARNOSESKATE_19 CAMS_GARFO.CAMS_DISCARD_EXAMPLE_CY_CLEARNOSESKATE_19 MAPS.CAMS_DISCARD_EXAMPLE_CY_LITTLESKATE_19 CAMS_GARFO.CAMS_DISCARD_EXAMPLE_CY_LITTLESKATE_19 MAPS.CAMS_DISCARD_EXAMPLE_CY_ROSETTESKATE_19 CAMS_GARFO.CAMS_DISCARD_EXAMPLE_CY_ROSETTESKATE_19 MAPS.CAMS_DISCARD_EXAMPLE_CY_SMOOTHSKATE_19 CAMS_GARFO.CAMS_DISCARD_EXAMPLE_CY_SMOOTHSKATE_19 MAPS.CAMS_DISCARD_EXAMPLE_CY_WINTERSKATE_19 CAMS_GARFO.CAMS_DISCARD_EXAMPLE_CY_WINTERSKATE_19
library(odbc) library(dplyr, warn.conflicts = FALSE) # library(dbplyr) library(ggplot2) # library(config) library(stringr) library(discaRd) library(knitr) library(kableExtra) options(scipen = 999) discard <- read.csv("~/discaRd/CAMS/MODULES/MAY/Skate_comparisons.csv") discard %>% filter(Source %in% c("Federal"))%>% filter(Species %in% c("Skate complex")) %>% ggplot()+ geom_bar(aes(x = Method, y = Discards, fill = Source), stat = 'identity', position = 'dodge')+ facet_wrap(~Species, scales = 'free')+ theme_light()
Combined skate discard estimates are much higher for the seven skate species included in the MAPS discard mortality support table (ITIS: 564139, 160855, 564130, 564130, 564136, 564151, 564149 and 564145) compared to the 11 used for QM (160845, 160846, 160848, 160855, 564037, 564130, 564136, 564139, 564145, 564149, 564151).
Probably due to differences in gear types and discard mortality rates which I believe are just one value across skates for QM.
discard <- read.csv("~/discaRd/CAMS/MODULES/MAY/Skate_comparisons.csv") '%ni%' <- Negate("%in%") discard %>% filter(Source %in% c("Federal")) %>% dplyr::select(Species, Source, Discards) %>% DT::datatable(caption = 'Total discards by species for state trips')
discard <- read.csv("~/discaRd/CAMS/MODULES/MAY/Skate_comparisons.csv") '%ni%' <- Negate("%in%") discard %>% filter(Source %in% c("State")) %>% dplyr::select(Species, Source, Discards) %>% DT::datatable(caption = 'Total discards by species for state trips')
Red flag that some of those state estimates are the same between species.
Kall <- read.csv("~/discaRd/CAMS/MODULES/MAY/May_kall.csv") Kall %>% ggplot()+ geom_bar(aes(x = Method, y = kall, fill = Source), stat = 'identity', position = 'dodge')+ #facet_wrap(~Species, scales = 'free')+ theme_light()
Not quite sure why the QM kall estimate is so much lower. Got it from the 2019 ACL skate complex excel file.
dw_maps <- config::get(config = "maps", file = "~/config_group.yml") # Connect to database - move this to config file in the future - quick addition for server connectString <- paste( "(DESCRIPTION=", "(ADDRESS=(PROTOCOL=tcp)(HOST=", dw_maps$host, ")(PORT=", dw_maps$port, "))", "(CONNECT_DATA=(SERVICE_NAME=",dw_maps$svc, ")))", sep = "" ) # Connect to oracle each loop in case of timeouts bcon <- ROracle::dbConnect( drv = ROracle::Oracle(), username = dw_maps$uid, password = dw_maps$pwd, dbname = connectString ) db_barndoor = tbl(bcon, sql("select * from MAPS.CAMS_DISCARD_EXAMPLE_CY_BARNDOORSKATE_19")) %>% collect db_barndoor$SPECIES <- "BARNDOOR SKATE" db_clearnose = tbl(bcon, sql("select * from MAPS.CAMS_DISCARD_EXAMPLE_CY_CLEARNOSESKATE_19")) %>% collect db_clearnose$SPECIES <- "CLEARNOSE SKATE" db_little = tbl(bcon, sql("select * from MAPS.CAMS_DISCARD_EXAMPLE_CY_LITTLESKATE_19")) %>% collect db_little$SPECIES <- "LITTLENOSE SKATE" db_rosette = tbl(bcon, sql("select * from MAPS.CAMS_DISCARD_EXAMPLE_CY_ROSETTESKATE_19")) %>% collect db_rosette$SPECIES <- "ROSETTE SKATE" db_smooth = tbl(bcon, sql("select * from MAPS.CAMS_DISCARD_EXAMPLE_CY_SMOOTHSKATE_19")) %>% collect db_smooth$SPECIES <- "SMOOTH SKATE" db_winter = tbl(bcon, sql("select * from MAPS.CAMS_DISCARD_EXAMPLE_CY_WINTERSKATE_19")) %>% collect db_winter$SPECIES <- "WINTER SKATE" db_final <- rbind(db_barndoor,db_clearnose, db_little, db_rosette, db_smooth, db_winter) strat_barndoor <- db_barndoor %>% filter(DISCARD_SOURCE != 'O') %>% group_by(SPECIES, STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select( SPECIES, STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD ,DISCARD_SOURCE ,TRIP_TYPE) # ,CV) #dplyr::arrange(desc(DISCARD)) strat_clearnose <- db_clearnose %>% filter(DISCARD_SOURCE != 'O') %>% group_by(SPECIES, STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select( SPECIES, STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD ,DISCARD_SOURCE ,TRIP_TYPE) strat_little <- db_little %>% filter(DISCARD_SOURCE != 'O') %>% group_by(SPECIES, STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select( SPECIES, STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD ,DISCARD_SOURCE ,TRIP_TYPE) strat_rosette <- db_rosette %>% filter(DISCARD_SOURCE != 'O') %>% group_by(SPECIES, STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select( SPECIES, STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD ,DISCARD_SOURCE ,TRIP_TYPE) strat_smooth <- db_smooth %>% filter(DISCARD_SOURCE != 'O') %>% group_by(SPECIES, STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select( SPECIES, STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD ,DISCARD_SOURCE ,TRIP_TYPE) strat_winter <- db_winter %>% filter(DISCARD_SOURCE != 'O') %>% group_by(SPECIES, STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select( SPECIES, STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD ,DISCARD_SOURCE ,TRIP_TYPE) strat_final <- rbind(strat_barndoor, strat_clearnose, strat_little, strat_rosette, strat_smooth, strat_winter) strat_final %>% filter(DISCARD_SOURCE != 'O' & CAMS_DISCARD_RATE) %>% dplyr::group_by(SPECIES, STRATA, DISCARD_SOURCE, TRIP_TYPE) %>% #slice(1) %>% ggplot()+ geom_histogram(aes(x = CAMS_DISCARD_RATE, fill = DISCARD_SOURCE), bins=60, position = "dodge") + facet_wrap(~SPECIES)+ theme_light()
db_final %>% # filter(DISCARD_SOURCE != 'O') %>% group_by(SPECIES, SPECIES_ITIS, DISCARD_SOURCE,SPECIES_STOCK) %>% dplyr::summarise(DSUM = sum(DISCARD, na.rm = T)) %>% # slice(1) %>% ggplot()+ geom_bar(aes(x = SPECIES_STOCK, y = DSUM, fill = DISCARD_SOURCE), stat = 'identity', position = 'dodge')+ facet_wrap(~SPECIES, scales = 'free')+ theme_light()
Not suprisingly, total discards at the end of the year come from strata with an in season rate.
db_barndoor %>% filter(DISCARD_SOURCE != 'O' & TRIP_TYPE=="FED") %>% group_by(STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select(STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD) %>% # ,CV) dplyr::arrange(desc(DISCARD)) %>% top_n(10) %>% DT::datatable(caption = 'Discard rates by Strata for Barndoor Skate')
db_clearnose %>% filter(DISCARD_SOURCE != 'O' & TRIP_TYPE=="FED") %>% group_by(STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select(STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD) %>% # ,CV) dplyr::arrange(desc(DISCARD)) %>% top_n(10) %>% DT::datatable(caption = 'Discard rates by Strata for Clearnose Skate based on federal trips')
db_little %>% filter(DISCARD_SOURCE != 'O' & TRIP_TYPE=="FED") %>% group_by(STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select(STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD) %>% # ,CV) dplyr::arrange(desc(DISCARD)) %>% top_n(10) %>% DT::datatable(caption = 'Discard rates by Strata for Little Skate based on federal trips')
db_rosette %>% filter(DISCARD_SOURCE != 'O' & TRIP_TYPE=="FED") %>% group_by(STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select(STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD) %>% # ,CV) dplyr::arrange(desc(DISCARD)) %>% top_n(10) %>% DT::datatable(caption = 'Discard rates by Strata for Rosette Skate based on federal trips')
db_smooth %>% filter(DISCARD_SOURCE != 'O' & TRIP_TYPE=="FED") %>% group_by(STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select(STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD) %>% # ,CV) dplyr::arrange(desc(DISCARD)) %>% top_n(10) %>% DT::datatable(caption = 'Discard rates by Strata for Smoothnose Skate based on federal trips')
db_winter %>% filter(DISCARD_SOURCE != 'O' & TRIP_TYPE=="FED") %>% group_by(STRATA_FULL, STRATA_ASSUMED, DISCARD_SOURCE, TRIP_TYPE) %>% dplyr::summarise(SUBTRIP_KALL = sum(SUBTRIP_KALL) , CAMS_DISCARD_RATE = round(mean(CAMS_DISCARD_RATE), digits=5) , DISC_MORT_RATIO = mean(DISC_MORT_RATIO) # , CV = mean(CV, na.rm=TRUE) , DISCARD = round(sum(DISCARD))) %>% # , N_OBS_TRIPS_F = mean(N_OBS_TRIPS_F)) %>% mutate(STRATA = case_when(DISCARD_SOURCE == "I" ~ STRATA_FULL, DISCARD_SOURCE == "A" ~ STRATA_ASSUMED)) %>% ungroup() %>% dplyr::select(STRATA # ,N_OBS_TRIPS_F ,CAMS_DISCARD_RATE ,SUBTRIP_KALL ,DISC_MORT_RATIO ,DISCARD) %>% # ,CV) dplyr::arrange(desc(DISCARD)) %>% top_n(10) %>% DT::datatable(caption = 'Discard rates by Strata for Winter Skate based on federal trips')
For more information regarding stratfication variables and discard rates by species see
MAPS.CAMS_STATAREA_STOCK, MAPS.CAMS_DISCARD_MORTALITY_STOCK, MAPS.CAMS_GEARCODE_STRATA, MAPS.CAMS_MASTER_GEAR, MAPS.CAMS_OBS_CATCH,
I may need to grant selection to APSD if you do not have access to MAPS.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.