BC AB Caribou IPM Results
Clayton T. Lamb
11 March, 2024
library(renv )
# # to pull packages
# restore(repos="https://cloud.r-project.org")
library(ggmap )
library(MCMCvis )
library(tidybayes )
library(ggmcmc )
library(boot )
library(cowplot )
library(hrbrthemes )
library(lme4 )
library(tidymodels )
library(broom.mixed )
library(RColorBrewer )
library(ggridges )
library(ggrepel )
library(tidylog )
library(gt )
library(patchwork )
library(sf )
library(basemaps )
library(ggtext )
library(knitr )
library(terra )
library(tidyverse )
# Load data ---------------------------------------------------------------
# # IPM Output
out <- readRDS(file = here :: here(" jags/output/BCAB_CaribouIPM_23update.rds" ))
# # IPM input to compare results
hd <- read.csv(" data/clean/blueprint.csv" )
hn <- hd %> %
dplyr :: select(herd , herd_num )
afs <- read.csv(" data/clean/survival.csv" ) %> %
arrange(herd ) %> %
left_join(hn , by = " herd" )
afr <- read.csv(" data/clean/recruitment.csv" ) %> %
arrange(herd ) %> %
left_join(hn , by = " herd" )
counts <- read.csv(" data/clean/counts.csv" ) %> %
arrange(herd ) %> %
left_join(hn , by = " herd" )
trt <- read.csv(" data/clean/treatments.csv" ) %> %
arrange(herd ) %> %
left_join(hn , by = " herd" )
ecotype <- read.csv(" data/raw/treatment.csv" ) %> %
dplyr :: select(herd = Herd , ECCC = ECCC_Recov_Grp , COSEWIC = COSEWIC_Grp , Heard_Vagt1998 = Heard.and.Vagt.1998.grouping ) %> %
distinct()
labels <- read.csv(" data/clean/labels.csv" )
label.lookup <- read.csv(" data/clean/label_lookup.csv" )
# Years of study
yrs <- seq(from = min(trt $ year ), to = max(trt $ year ), by = 1 )
nyr <- length(yrs )
yr_idx <- seq(from = 1 , to = nyr , by = 1 )
yr_df <- as.data.frame(cbind(yrs , yr_idx ))
rm(yrs )
rm(nyr )
rm(yr_idx )
# # set up colors for plotting
display.brewer.pal(8 , " Accent" )
cols <- RColorBrewer :: brewer.pal(8 , " Accent" )
# ## Change Narraway BC to Bearhole Redwillow
trt <- trt %> % mutate(herd = case_when(herd %in% " Narraway BC" ~ " Bearhole Redwillow" , TRUE ~ herd ))
hd <- hd %> % mutate(herd = case_when(herd %in% " Narraway BC" ~ " Bearhole Redwillow" , TRUE ~ herd ))
counts <- counts %> % mutate(herd = case_when(herd %in% " Narraway BC" ~ " Bearhole Redwillow" , TRUE ~ herd ))
afr <- afr %> % mutate(herd = case_when(herd %in% " Narraway BC" ~ " Bearhole Redwillow" , TRUE ~ herd ))
afs <- afs %> % mutate(herd = case_when(herd %in% " Narraway BC" ~ " Bearhole Redwillow" , TRUE ~ herd ))
ecotype <- ecotype %> % mutate(herd = case_when(herd %in% " Narraway BC" ~ " Bearhole Redwillow" , TRUE ~ herd ))
# Pull out some values, summarize to demog data frame ---------------------
# ### TREATMENT COMBOS
treatment.combos <- trt %> %
filter(applied == 1 ) %> %
group_by(herd , year ) %> %
summarize(
trt = paste(
gsub(" " , " " , treatment ), # Remove spaces
collapse = " -" # Add - between treatments
),
.groups = " drop"
) %> %
dplyr :: select(herd , yrs = year , trt )
# # pull posterior draws, add in herd, year, and treatment to each herd-year
ndraws <- 10000
demog.raw <- out %> %
spread_draws(
c(totNMF , totN , totAdults , S , R_adj , lambda , SR )[i , j ],
ndraws = ndraws
) %> %
median_qi(.width = 0.9 ) %> %
left_join(yr_df %> % rename(j = yr_idx ), by = " j" ) %> %
left_join(hd %> % dplyr :: select(herd , i = herd_num ), by = " i" ) %> %
left_join(treatment.combos , by = c(" herd" , " yrs" )) %> %
mutate(trt = replace_na(trt , " Reference" )) %> %
rename(R = R_adj , R.lower = R_adj.lower , R.upper = R_adj.upper ) %> %
ungroup()
# # determine which herds to keep
herds.keep <- demog.raw %> %
filter(herd != " Quintette Full" ) %> %
distinct(herd ) %> %
pull()
# # treatment sample sizes
trt.n <- demog.raw %> %
filter(herd %in% herds.keep ) %> %
group_by(trt ) %> %
summarize(
n_herds = n_distinct(herd ),
n_yrs = n()
)
write_csv(trt.n , here :: here(" tables" , " trt_sample_sizes.csv" ))
# # filter herds to a period where not fully extirpated
extirpated.yr <- demog.raw %> %
filter(round(totN , 0 ) == 0 ) %> %
group_by(herd ) %> %
filter(yrs == min(yrs )) %> %
ungroup()
herds <- unique(demog.raw $ herd )
demog.trim <- tibble()
for (i in 1 : length(herds )) {
if (herds [i ] %in% extirpated.yr $ herd ) {
yr <- extirpated.yr %> %
dplyr :: filter(herd == !! herds [i ])
a <- demog.raw %> %
dplyr :: filter(herd == !! herds [i ] & yrs < = yr $ yrs )
}
if (! herds [i ] %in% extirpated.yr $ herd ) {
a <- demog.raw %> %
dplyr :: filter(herd == !! herds [i ])
}
demog.trim <- bind_rows(a , demog.trim )
}
demog.raw <- demog.trim
rm(demog.trim )
rm(a )
rm(yr )
write_csv(demog.raw , " tables/demog.csv" )
demog <- demog.raw %> % filter(herd %in% herds.keep )
demog.mod <- demog %> % filter(totAdults > 10 & totNMF > 20 ) # # modelling data that doesn't include functionally extirpated herds, demography gets unstable
ggplot(demog , aes(y = log(lambda ), x = totNMF )) +
geom_point(alpha = 0.3 ) +
geom_vline(xintercept = 30 , color = " red" ) +
geom_hline(yintercept = 0 , color = " grey" , linetype = " dashed" ) +
theme_ipsum() +
theme(
axis.title.x = element_text(size = 15 ),
axis.title.y = element_text(size = 15 ),
strip.text.x = element_text(size = 15 ),
strip.text.y = element_text(size = 15 )
) +
labs(
title = " Population growth unstable when subpopulation too small" ,
subtitle = " remove data below functionally extirpated abundance (red line)" ,
x = " Subopulation abundance" ,
y = " Instanteous rate of increase (r)"
)
# # how many herds had sightability
counts %> %
filter(MinUsed == 0 , ! is.na(Sightability )) %> %
distinct(herd )
counts %> %
mutate(sight = case_when(! is.na(Sightability ) ~ 1 , TRUE ~ 0 )) %> %
count(sight )
First year of demographic data for each herd
raw.demog <- rbind(
afr %> % dplyr :: select(herd , year , est ) %> % mutate(type = " Recruit" ),
afs %> % dplyr :: select(herd , year , est ) %> % mutate(type = " Surv" ),
counts %> % dplyr :: select(herd , year , est = Est_CL ) %> % mutate(type = " Count" )
)
# ## Identify first year of demographic data for each herd
first.yr <- raw.demog %> %
dplyr :: select(herd , first.year = year ) %> %
distinct() %> %
group_by(herd ) %> %
filter(first.year == min(first.year ))
ggplot(first.yr , aes(x = first.year )) +
stat_bin(aes(y = cumsum(..count.. )), geom = " step" ) +
theme_ipsum() +
labs(
x = " Year" , y = " Cumulative count" ,
title = " First year of demographic data for the 41 SMC herds" ,
subtitle = " Cumulative count of herds being monitored through time"
) +
theme(
plot.title = element_text(size = 18 ),
axis.title.y = element_text(size = 15 ),
axis.title.x = element_text(size = 15 ),
axis.text.x = element_text(size = 12 ),
axis.text.y = element_text(size = 12 ),
strip.text.x = element_text(size = 14 ),
strip.text.y = element_text(size = 14 ),
legend.text = element_text(size = 12 ),
legend.title = element_text(size = 14 ),
legend.position = " bottom"
)
# # Prep data and layout for plot
# # treatments for plot,and where they go
trt.plot <- trt %> %
filter(applied == 1 ) %> %
left_join(demog %> % group_by(herd ) %> % summarize(max = max(totNMF.upper ))) %> %
mutate(y = case_when(
treatment %in% " transplant" & herd %in% " South Selkirks" ~ 250 ,
treatment %in% " reduce wolves" & herd %in% " Charlotte Alplands" ~ 150 ,
treatment %in% " transplant" & herd %in% " Telkwa" ~ 150 ,
treatment %in% " sterilize wolves" & herd %in% c(" Wells Gray North" ) ~ (max + 20 ) - (max * 0.25 ),
treatment %in% " reduce wolves" & herd %in% c(" Wells Gray North" ) ~ (max + 20 ) - (max * 0.10 ),
treatment %in% " sterilize wolves" & herd %in% " Barkerville" ~ 160 ,
treatment %in% " reduce wolves" & herd %in% " Barkerville" ~ 135 ,
treatment %in% " reduce wolves" & herd %in% " Kennedy Siding" ~ max - (max * 0.05 ),
treatment %in% " feed" & herd %in% " Kennedy Siding" ~ max - (max * 0.20 ),
treatment %in% " pen" & herd %in% " Columbia North" ~ 50 ,
treatment %in% " reduce moose" & herd %in% " Columbia North" ~ - 5 ,
treatment %in% " reduce wolves" & herd %in% " Columbia North" ~ 90 ,
treatment %in% " reduce moose" & herd %in% " Groundhog" ~ 88 ,
treatment %in% " reduce wolves" & herd %in% " Groundhog" ~ 70 ,
treatment %in% " reduce moose" & herd %in% " Hart North" ~ 420 ,
treatment %in% " reduce wolves" & herd %in% " Hart North" ~ 340 ,
treatment %in% " reduce wolves" ~ max - (max * 0.1 ),
treatment %in% " transplant" ~ max - (max * 0.15 ),
treatment %in% " reduce moose" ~ max - (max * 0.2 ),
treatment %in% " sterilize wolves" ~ max - (max * 0.25 ),
treatment %in% " pen" ~ max - (max * 0.3 ),
treatment %in% " feed" ~ max - (max * 0.35 )
))
# ## a couple functions for the red boxes around herd names of extirpated
element_textbox_highlight <- function (... , hi.labels = NULL , hi.fill = NULL ,
hi.col = NULL , hi.box.col = NULL , hi.family = NULL ) {
structure(
c(
element_textbox(... ),
list (hi.labels = hi.labels , hi.fill = hi.fill , hi.col = hi.col , hi.box.col = hi.box.col , hi.family = hi.family )
),
class = c(" element_textbox_highlight" , " element_textbox" , " element_text" , " element" )
)
}
element_grob.element_textbox_highlight <- function (element , label = " " , ... ) {
if (label %in% element $ hi.labels ) {
element $ fill <- element $ hi.fill %|| % element $ fill
element $ colour <- element $ hi.col %|| % element $ colour
element $ box.colour <- element $ hi.box.col %|| % element $ box.colour
element $ family <- element $ hi.family %|| % element $ family
}
NextMethod()
}
# # prep simulated counterfactuals
sims <- out %> %
gather_draws(c(pred_totNMF , totNMF , totAdults )[i , j ], ndraws = ndraws ) %> %
left_join(yr_df %> % rename(j = yr_idx ), by = " j" ) %> %
left_join(hd %> % dplyr :: select(herd , i = herd_num ), by = " i" ) %> %
dplyr :: left_join(treatment.combos , by = c(" herd" , " yrs" )) | >
dplyr :: mutate(
trt = tidyr :: replace_na(trt , " Reference" )
) %> %
filter(herd %in% herds.keep )
sims %> % write_csv(here :: here(" tables" , " draws" , " sims.draws.csv" ))
sims.plot <- sims %> %
dplyr :: group_by(yrs , .variable , .draw ) %> %
dplyr :: summarize(
mean = sum(.value ),
.groups = " drop"
) %> %
dplyr :: group_by(yrs , .variable ) %> %
dplyr :: summarize(
LCL = quantile(mean , 0.05 ),
UCL = quantile(mean , 0.95 ),
mean = mean(mean ),
.groups = " drop"
)
ext.yr <- demog %> %
dplyr :: select(herd , yrs , totAdults , totNMF ) %> %
group_by(herd ) %> %
mutate(
viable = case_when(yrs == 2021 & round(totAdults , 0 ) > 8 & round(totNMF , 0 ) > 20 ~ 1 , TRUE ~ 0 ),
viable = max(viable )
) %> %
filter(round(totAdults , 0 ) < = 8 | round(totNMF , 0 ) < = 20 , viable == 0 ) %> % # # pull if 8 or fewer females present, or 20 or fewer total
filter(yrs == (min(yrs ))) %> %
left_join(labels , by = " herd" ) %> %
mutate(herd2 = paste0(number_label , " ." , herd , " (" , human , " %)" )) %> %
left_join(
sims.plot %> %
filter(.variable %in% " totNMF" ) %> %
dplyr :: select(yrs , mean ),
by = " yrs"
) %> %
ungroup()
sims.plot <- sims.plot %> %
filter(.variable %in% c(" totNMF" , " pred_totNMF" ))
# # Herd Abundance
ggplot() +
geom_ribbon(
data = demog %> %
ungroup() %> %
left_join(labels , by = " herd" ) %> %
mutate(herd = paste0(number_label , " ." , herd , " (" , human , " %)" ) %> %
fct_reorder(.f = . , .x = number_label , .fun = max )),
aes(x = yrs , y = totNMF , ymin = totNMF.lower , ymax = totNMF.upper ), alpha = 0.4 , color = NA , fill = cols [3 ]
) +
geom_line(
data = demog %> %
ungroup() %> %
left_join(labels , by = " herd" ) %> %
mutate(herd = paste0(number_label , " ." , herd , " (" , human , " %)" ) %> %
fct_reorder(number_label )),
aes(x = yrs , y = totNMF , ymin = totNMF.lower , ymax = totNMF.upper ), size = 1 , color = cols [3 ]
) +
geom_rug(
data = raw.demog %> %
filter(herd %in% herds.keep ) %> %
ungroup() %> %
left_join(labels , by = " herd" ) %> %
mutate(herd = paste0(number_label , " ." , herd , " (" , human , " %)" ) %> %
fct_reorder(number_label )),
aes(x = year ), sides = " t" , length = unit(0.05 , " npc" ), alpha = 0.5
) +
theme_ipsum() +
theme(legend.position = " none" ) +
facet_wrap(vars(herd ), scales = " free_y" , ncol = 7 ) +
labs(x = " " , y = " " , title = " Abundance" ) +
expand_limits(y = 0 ) +
scale_x_continuous(
limits = c(1973 , 2026 ),
breaks = seq(1980 , 2020 , by = 20 )
) +
theme(
axis.title.x = element_text(size = 15 ),
axis.title.y = element_text(size = 15 ),
strip.text = element_textbox_highlight(
size = 14 ,
fill = " white" , box.color = " white" ,
halign = .5 , linetype = 1 , r = unit(0 , " pt" ), width = unit(1 , " npc" ),
padding = margin(b = 2 , t = 2 , r = 2 , l = 2 ), margin = margin(b = 8 , t = 2 ),
hi.labels = ext.yr $ herd2 ,
hi.fill = " firebrick" , hi.box.col = " firebrick" , hi.col = " white"
),
legend.text = element_text(size = 13 ),
legend.title = element_text(size = 15 )
# panel.grid.major = element_blank(),
# panel.grid.minor = element_blank()
# axis.line = element_line(colour = "black")
) +
geom_point(
data = counts %> %
filter(herd %in% herds.keep ) %> %
ungroup() %> %
left_join(labels , by = " herd" ) %> %
mutate(herd = paste0(number_label , " ." , herd , " (" , human , " %)" ) %> %
fct_reorder(number_label )),
aes(x = year , y = Est_CL ), size = 0.5 , alpha = 0.7
) +
geom_linerange(
data = counts %> %
filter(herd %in% herds.keep ) %> %
ungroup() %> %
mutate(Est_CL.max = case_when(Est_CL.max > 5000 ~ 5000 , herd == " Rainbows" & Est_CL.max > 500 ~ 500 , TRUE ~ Est_CL.max )) %> %
left_join(labels , by = " herd" ) %> % mutate(herd = paste0(number_label , " ." , herd , " (" , human , " %)" ) %> %
fct_reorder(number_label )),
aes(x = year , ymin = Est_CL.min , ymax = Est_CL.max ), alpha = 0.5
) +
geom_point(
data = trt.plot %> %
filter(herd %in% herds.keep ) %> %
ungroup() %> %
left_join(labels , by = " herd" ) %> %
mutate(herd = paste0(number_label , " ." , herd , " (" , human , " %)" ) %> %
fct_reorder(number_label )),
aes(x = year , y = y , group = treatment ), size = 0.5
) +
scale_color_manual(values = cols [- 4 ]) +
geom_text(
data = trt.plot %> %
filter(herd %in% herds.keep ) %> %
ungroup() %> %
distinct(herd , treatment , y ) %> %
mutate(t = str_remove(treatment , " reduce " ) %> % str_sub(1 , 1 )) %> %
left_join(labels , by = " herd" ) %> % mutate(herd = paste0(number_label , " ." , herd , " (" , human , " %)" ) %> %
fct_reorder(number_label )),
aes(label = t , x = 2026 , y = y ),
direction = " y"
) +
coord_cartesian(clip = " off" )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
## Warning in geom_line(data = demog %>% ungroup() %>% left_join(labels, by = "herd") %>% : Ignoring unknown aesthetics: ymin
## and ymax
## Warning in geom_text(data = trt.plot %>% filter(herd %in% herds.keep) %>% : Ignoring unknown parameters: `direction`
ggsave(here :: here(" plots" , " abundance.png" ), width = 15 , height = 11 , bg = " white" , dpi = 600 )
# #for Fuse
# library(Cairo)
# ggsave(here::here("plots", "abundance_forFUSE.svg"), width = 15, height = 11, bg = "transparent")
Plot Abundance across Herds
Considered only 1991-2023, as most herds don’t have demographic data before 1991,pre-1991 trends for most SMC herds are informed solely by the priors and shared paramaters with other herds
# ### Summarize bou pop in '91 vs 2023####
sims.summary <- sims.plot %> %
group_by(.variable ) %> %
filter(yrs == 1991 | yrs == 2023 ) %> %
arrange(yrs ) %> %
ungroup()
write_csv(sims.summary %> % mutate(.variable = case_when(.variable == " pred_totNMF" ~ " No action counterfactual" , TRUE ~ " Actual" )), here :: here(" tables/pop.size.csv" ))
# # what was the decline?
p.decline <- sims.summary %> %
filter(.variable == " totNMF" ) %> %
dplyr :: select(yrs , mean ) %> %
pivot_wider(names_from = yrs , values_from = mean ) %> %
summarise(dif = ((`1991` - `2023` ) / `1991` ) * 100 ) %> %
round(0 )
# # how many more caribou now than status quo w/ error
sims.draws <- out %> %
gather_draws(
pred_totNMF [i , j ], totNMF [i , j ], totCalvesMF [i , j ], pred_totCalvesMF [i , j ],
ndraws = ndraws
) %> %
left_join(hd %> % dplyr :: select(herd , i = herd_num ), by = " i" ) %> %
filter(herd %in% herds.keep )
n.recovery.all <- sims.draws %> %
ungroup() %> %
filter(j == max(j ), .variable %in% c(" totNMF" , " pred_totNMF" )) %> %
group_by(.draw , .variable ) %> %
summarise(across(.value , ~ sum(.x ))) %> %
pivot_wider(names_from = .variable , values_from = .value ) %> %
mutate(dif = totNMF - pred_totNMF ) %> %
pull(dif )
# # with error
median(n.recovery.all )
quantile(n.recovery.all , c(0.05 , 0.5 , 0.95 )) %> % round(0 )
## 5% 50% 95%
## 1175 1548 1942
n.recovery <- median(n.recovery.all ) %> % round(0 )
write.csv(quantile(n.recovery.all , c(0.05 , 0.5 , 0.95 )) %> % round(0 ) %> % as.data.frame(), here :: here(" tables/adults.recovered.csv" ), row.names = TRUE )
# # do again but just for calves
# # unlike above, also keep all year so we can compare how many more calves were born over the entire period
calves.recovered.all <- sims.draws %> %
filter(.variable %in% c(" totCalvesMF" , " pred_totCalvesMF" )) %> %
group_by(.draw , .variable , j ) %> %
summarise(across(.value , ~ sum(.x ))) %> %
pivot_wider(names_from = .variable , values_from = .value ) %> %
mutate(dif = totCalvesMF - pred_totCalvesMF ) %> %
group_by(.draw ) %> %
summarise(dif = sum(dif )) %> %
pull(dif )
quantile(calves.recovered.all , c(0.05 , 0.5 , 0.95 )) %> % round(0 )
## 5% 50% 95%
## 1140 1552 1934
calves.recovered <- median(calves.recovered.all ) %> % round(0 )
sum(out $ mean $ totCalvesMF - out $ mean $ pred_totCalvesMF )
write.csv(quantile(calves.recovered.all , c(0.05 , 0.5 , 0.95 )) %> % round(0 ) %> % as.data.frame(), here :: here(" tables/calves.recovered.csv" ), row.names = TRUE )
# ### Total Abundance####
abundance.all.plot <- ggplot(data = sims.plot %> %
mutate(.variable = case_when(
.variable == " totNMF" ~ " With recovery\n actions" ,
TRUE ~ " Status quo"
))) +
geom_ribbon(alpha = 0.3 , aes(x = yrs , y = mean , ymin = LCL , ymax = UCL , fill = fct_relevel(.variable , " Status quo" , " With recovery\n actions" )), color = NA ) +
geom_line(size = 1 , aes(x = yrs , y = mean , ymin = LCL , ymax = UCL , color = fct_relevel(.variable , " Status quo" , " With recovery\n actions" ), fill = fct_relevel(.variable , " Status quo" , " With recovery\n actions" ))) +
geom_text(data = sims.plot %> % filter(yrs == 2023 ) %> %
mutate(.variable = case_when(
.variable == " totNMF" ~ " With recovery\n actions" ,
TRUE ~ " Status quo"
)), aes(label = fct_relevel(.variable , " Status quo" , " With recovery\n actions" ), colour = .variable , x = Inf , y = mean ), hjust = 0 , size = 4 ) +
geom_jitter(data = ext.yr , size = 1 , aes(x = yrs , y = mean ), alpha = 0.5 ) +
theme_ipsum() +
theme(legend.position = " none" ) +
ylab(" " ) +
xlab(" Year" ) +
labs(
x = " Year" , y = " Abundance" , title = " b) Population Trend" ,
subtitle = paste0(p.decline , " % decline since 1991, +" , n.recovery , " caribou from recovery actions" )
) +
expand_limits(y = 0 ) +
scale_y_continuous(expand = c(0 , 100 ), limits = c(0 , 12000 )) +
scale_x_continuous(breaks = seq(1980 , 2020 , by = 10 ), limits = c(1991 , 2023 )) +
theme(
axis.title.x = element_text(size = 15 ),
axis.title.y = element_text(size = 15 ),
axis.text.x = element_text(size = 13 ),
axis.text.y = element_text(size = 13 ),
strip.text.x = element_text(size = 15 ),
strip.text.y = element_text(size = 15 ),
legend.text = element_text(size = 13 ),
plot.subtitle = element_text(size = 15 ),
legend.title = element_text(size = 15 ),
plot.margin = unit(c(1 , 5 , 1 , 1 ), " lines" )
) +
geom_text(data = trt %> % filter(applied %in% 1 ) %> % group_by(year ) %> % summarise(n = n_distinct(herd )) %> % filter(year %% 2 == 1 ), aes(x = year , y = 200 , label = n ), size = 3.5 ) +
scale_color_manual(values = cols [c(3 , 1 )]) +
annotate(geom = " text" , x = 1992 , y = 2500 , label = " Subpopulations w/\n recovery actions" , hjust = " left" , size = 5 ) +
annotate(
geom = " curve" , x = 1996 , y = 1800 , xend = 1998 , yend = 500 ,
curvature = 0 , arrow = arrow(length = unit(2 , " mm" ))
) +
annotate(geom = " text" , x = 2010 , y = 10000 , label = " Subpopulations w/\n demographic data" , hjust = " left" , size = 5 ) +
annotate(
geom = " curve" , x = 2015 , y = 10600 , xend = 2013 , yend = 11500 ,
curvature = 0 , arrow = arrow(length = unit(2 , " mm" ))
) +
annotate(geom = " text" , x = 1991 , y = 7000 , label = " Subpopulation\n extirpation event" , hjust = " left" , size = 5 ) +
annotate(
geom = " curve" , x = 1998 , y = 7800 , xend = (ext.yr %> % ungroup() %> % filter(herd == " Banff" ) %> % pull(yrs )) + 0.4 , yend = (ext.yr %> % ungroup() %> % filter(herd == " Banff" ) %> % pull(mean )) - 200 ,
curvature = 0 , arrow = arrow(length = unit(2 , " mm" ))
) +
coord_cartesian(
clip = " off"
) +
geom_text(data = raw.demog %> % group_by(year ) %> % summarise(n = n_distinct(herd )) %> % filter(year %% 2 == 0 ), aes(x = year , y = 11800 , label = n ), size = 3.5 )
abundance.all.plot
ggsave(plot = abundance.all.plot , here :: here(" plots" , " abundance_all.png" ), width = 6 , height = 6 , bg = " white" , dpi = 600 )
Summarize effects of treatments
Population growth by treatment
# # Gather draws
demog.draws <- out %> %
gather_draws(logla [i , j ], S [i , j ], R_adj [i , j ], totNMF [i , j ], ndraws = ndraws ) %> %
mutate(
.variable = case_when(
.variable == " R_adj" ~ " R" ,
.variable == " logla" ~ " r" ,
TRUE ~ .variable
)
) %> %
# ## pivot wider
ungroup() %> %
pivot_wider(names_from = .variable , values_from = .value ) %> %
# # add in years and herd names
left_join(yr_df %> % rename(j = yr_idx ), by = " j" ) %> %
left_join(trt %> % distinct(herd_num , herd ) %> % dplyr :: select(i = herd_num , herd ), by = c(" i" )) %> %
left_join(treatment.combos ) %> %
left_join(trt %> % distinct(herd , year , intensity ) %> % dplyr :: select(herd , yrs = year , intensity ) %> % filter(intensity %in% " low" ), by = c(" herd" , " yrs" )) %> %
replace_na(
list (trt = " Reference" )
) %> %
# # remove first year lambda for each herd, as lambda==1
dplyr :: mutate(
r = replace(r , yrs == 1973 , NA_real_ )
) %> %
drop_na(r ) %> %
filter(herd %in% herds.keep )
# # filter herds to a period where not extirpated
demog.draws.trim <- tibble()
for (i in 1 : length(herds )) {
if (herds [i ] %in% ext.yr $ herd ) {
yr <- ext.yr %> %
dplyr :: filter(herd == !! herds [i ])
a <- demog.draws %> %
dplyr :: filter(herd == !! herds [i ] & yrs < yr $ yrs )
}
if (! herds [i ] %in% ext.yr $ herd ) {
a <- demog.draws %> %
dplyr :: filter(herd == !! herds [i ])
}
demog.draws.trim <- bind_rows(a , demog.draws.trim )
}
demog.draws <- demog.draws.trim
rm(demog.draws.trim )
# # keep treatment years when applied to pops before functional extirpation
demog.draws <- demog.draws %> %
filter(paste(i , j , sep = " _" ) %in% paste(demog.mod $ i , demog.mod $ j , sep = " _" ))
# ## Remove years where transplant was being done (impossibly high lambda due to adding translocated individuals, not population response)
demog.draws <- demog.draws %> %
filter(
! (herd %in% " Charlotte Alplands" & yrs %in% c(1984 : 1991 )),
! (herd %in% " Telkwa" & yrs %in% c(1997 : 1999 )),
! (herd %in% " South Selkirks" & yrs %in% c(1987 : 1989 )),
! (herd %in% " Purcell South" & yrs %in% c(2012 : 2013 ))
)
demog.draws %> % write_csv(here :: here(" tables" , " draws" , " demog.draws.csv" ))
# ###how to calculate from draws
# lambda.compare <- demog%>%
# ungroup%>%
# dplyr::select(herd,yrs,lambda)%>%
# left_join(demog.draws %>%
# group_by(herd,yrs)%>%
# summarise(median=median(lambda),
# mean=mean(lambda)))
#
# lm(lambda~median, data=lambda.compare)%>%summary
# lm(lambda~mean, data=lambda.compare)%>%summary
#
# ##definitely median when calculating for each posterior. Geo mean likely more appropriate for summarizing pooled distributions (i.e., overall means)
demog.draws.combotreat <- demog.draws %> %
# filter(!(intensity%in%"low"|totNMF<20))%>%
group_by(.draw , trt ) %> %
summarise(r = mean(r , na.rm = TRUE )) %> % # # mean per treatment-draw
group_by(.draw , trt ) %> %
summarise(r = mean(r )) %> % # # mean lambda per treatment-draw
mutate(trt = case_when(is.na(trt ) ~ " Reference" , TRUE ~ trt )) %> %
mutate(group = case_when(trt %in% " Reference" ~ " Reference" , TRUE ~ " Treatment" ))
demog.draws.combotreat.rug <- demog.draws %> %
# filter(!(intensity%in%"low"|totNMF<20))%>%
group_by(trt , herd ) %> %
summarise(r = mean(r , na.rm = TRUE )) %> % # # mean per treatment-draw
mutate(trt = case_when(is.na(trt ) ~ " Reference" , TRUE ~ trt )) %> %
mutate(group = case_when(trt %in% " Reference" ~ " Reference" , TRUE ~ " Treatment" ))
order <- demog.draws.combotreat %> %
group_by(trt ) %> %
summarise(med = median(r ))
demog.draws.combotreat %> %
left_join(order ) %> %
left_join(label.lookup , by = " trt" ) %> %
filter(trt != " transplant" ) %> %
ggplot(aes(x = r , y = fct_reorder(new , med ), fill = group )) +
geom_density_ridges( # scale = 1.5,
# scale = 1.3,
rel_min_height = .01 ,
size = 0.15 ,
alpha = 0.9
) +
theme_ipsum() +
geom_point(
data = demog.draws.combotreat.rug %> %
left_join(order ) %> %
left_join(label.lookup , by = " trt" ) %> %
filter(trt != " transplant" ),
aes(y = fct_reorder(new , med ), x = r ),
shape = " |" ,
size = 0.8
) +
theme(
axis.title.x = element_text(size = 7 ),
axis.title.y = element_text(size = 7 ),
axis.text.x = element_text(size = 6 ),
axis.text.y = element_text(size = 6 ),
strip.text.x = element_text(size = 6 ),
strip.text.y = element_text(size = 6 ),
legend.text = element_text(size = 7 ),
legend.title = element_text(size = 7 ),
legend.position = " none" ,
plot.title = element_text(size = 7 ),
panel.grid.minor = element_line(linewidth = 0.1 ),
panel.grid.major = element_line(linewidth = 0.1 ),
) +
geom_vline(xintercept = 0 , linetype = " dashed" , size = 0.3 , alpha = 0.8 ) +
labs(
x = " Instantaneous rate of increase (r)" ,
y = " Recovery action(s)" ,
fill = " " ,
title = " Population Growth by Recovery Action"
) +
scale_fill_manual(values = cols [c(3 , 1 )]) +
xlim(- 0.25 , 0.3 )
# ggsave(here::here("plots", "lambda_treatments.png"), width = 8, height = 7, bg = "white", dpi=600)
ggsave(here :: here(" plots" , " final" ," Fig3.tiff" ), width = 8.5 , height = 8 , bg = " white" , units = " cm" , dpi = 600 )
lambda.table <- demog.draws.combotreat %> %
group_by(trt ) %> %
summarise(
r.med = median(r , na.rm = TRUE ) %> % round(2 ),
lower = quantile(r , 0.05 , na.rm = TRUE ) %> % round(2 ),
upper = quantile(r , 0.95 , na.rm = TRUE ) %> % round(2 )
) %> %
arrange(- r.med ) %> %
mutate(r = paste0(r.med , " (" , lower , " -" , upper , " )" ))
kable(lambda.table )
trt
r.med
lower
upper
r
feed
0.12
-0.29
0.46
0.12 (-0.29-0.46)
feed-reducewolves
0.12
0.10
0.15
0.12 (0.1-0.15)
reducemoose-reducewolves
0.11
0.06
0.17
0.11 (0.06-0.17)
pen-reducewolves
0.10
0.05
0.14
0.1 (0.05-0.14)
pen-reducemoose
0.06
-0.09
0.19
0.06 (-0.09-0.19)
reducewolves
0.06
0.03
0.09
0.06 (0.03-0.09)
reducewolves-sterilizewolves
0.04
0.02
0.06
0.04 (0.02-0.06)
pen-reducemoose-reducewolves
-0.02
-0.20
0.18
-0.02 (-0.2-0.18)
Reference
-0.03
-0.03
-0.03
-0.03 (-0.03–0.03)
transplant
-0.03
-0.04
-0.02
-0.03 (-0.04–0.02)
reducemoose
-0.05
-0.07
-0.03
-0.05 (-0.07–0.03)
Population growth Before-After
# Before-After ---------------------------------------------
# # pull draws and organize into treatment and untreated (reference) timeframes for each herd
eff.draws <- demog.draws %> %
ungroup() %> %
filter(! trt %in% " Reference" ) %> %
ungroup() %> %
pivot_longer(r : R ) %> %
dplyr :: select(.draw , trt , herd , yrs , name , eff = value ) %> %
# ## add in reference
left_join(
demog.draws %> %
ungroup() %> %
filter(trt %in% " Reference" ) %> %
group_by(.draw , herd ) %> %
summarise(across(r : R , ~ mean(.x , na.rm = TRUE ))) %> %
pivot_longer(r : R ) %> %
dplyr :: select(.draw , herd , name , ref = value ),
by = c(" .draw" , " herd" , " name" )
) %> %
# # calculate delta
mutate(
delta.r = eff - ref
) %> %
# # add a label that includes sample sizes for plot
left_join(trt.n , by = " trt" ) %> %
left_join(label.lookup , by = " trt" ) %> %
mutate(trt.label = paste0(new , " \n " , n_herds , " subpops, " , n_yrs , " yrs" ))
order <- eff.draws %> %
filter(name == " r" ) %> %
group_by(trt.label ) %> %
summarise(med = median(delta.r )) %> %
arrange(- med )
eff.draws <- eff.draws %> %
left_join(order , by = " trt.label" ) %> %
mutate(
trt.label = fct_reorder(trt.label , med ),
name = case_when(
name == " r" ~ " Rate of increase (r)" ,
name == " R" ~ " Recruitment (R)" ,
name == " S" ~ " Survival (S)" ,
TRUE ~ name
)
)
ggplot() +
geom_density_ridges(
data = eff.draws %> %
filter(trt != " transplant" ) %> %
group_by(name , trt.label , .draw ) %> %
summarise(delta = median(delta.r )) %> %
# # trim for plot, removes <1% of values,
filter(delta > - 0.25 & delta < 0.35 ),
aes(x = delta , y = trt.label , fill = name ),
scale = .9 ,
rel_min_height = .01 ,
size = 0.15 ,
alpha = 0.9
) +
geom_point(
data = eff.draws %> %
filter(trt != " transplant" ) %> %
group_by(herd , name , trt.label ) %> %
summarise(delta = median(delta.r )),
aes(y = trt.label , x = delta ),
shape = " |"
) +
theme_ipsum() +
facet_wrap(vars(name )) +
theme(
axis.title.x = element_text(size = 10 ),
axis.title.y = element_text(size = 10 ),
axis.text.x = element_text(size = 10 ),
axis.text.y = element_text(size = 9 ),
strip.text.x = element_text(size = 10 ),
strip.text.y = element_text(size = 10 ),
legend.text = element_text(size = 10 ),
legend.title = element_text(size = 10 ),
plot.title = element_text(size = 12 ),
legend.position = " none"
) +
geom_vline(xintercept = 0 , linetype = " dashed" ) +
labs(x = " Change in value" , y = " Recovery action(s)" , title = " Before-After Assessment of Effectivness" ) +
scale_fill_manual(values = cols [c(1 : 3 )])
# ggsave(here::here("plots", "ba_all.png"), width = 10, height = 7, bg = "white", dpi=600)
ggsave(here :: here(" plots" , " final" ," Fig4.tiff" ), width = 18 , height = 13 , bg = " white" , units = " cm" , dpi = 600 )
trt_eff_ba_table <- eff.draws %> %
filter(name == " Rate of increase (r)" ) %> %
group_by(new , .draw ) %> %
summarise(delta = median(delta.r )) %> % # # get mean effect for each treatment across herds for each draw
group_by(new ) %> %
summarise(
delta.l = median(delta , na.rm = TRUE ) %> % round(2 ), # # mean effect of each treatment
lower = quantile(delta , 0.05 , na.rm = TRUE ) %> % round(2 ),
upper = quantile(delta , 0.95 , na.rm = TRUE ) %> % round(2 )
) %> %
arrange(- delta.l ) %> %
mutate(delta.r = paste0(delta.l , " [" , lower , " -" , upper , " ]" )) %> %
filter(new != " transplant" ) %> %
dplyr :: select(`Recovery action` = new , `Change in instantaneous growth rate (r)` = delta.r )
trt_eff_ba_table %> %
gt() %> %
gtsave(here :: here(" tables" , " trt_eff_ba.rtf" ))
trt_eff_ba_table %> %
write_csv(here :: here(" tables" , " trt_eff_ba.csv" ))
kable(trt_eff_ba_table )
Recovery action
Change in instantaneous growth rate (r)
penning + wolf reduction
0.16 [0.12-0.2]
feeding
0.15 [-0.27-0.49]
feeding + wolf reduction
0.14 [0.09-0.2]
moose & wolf reduction
0.11 [0.04-0.18]
wolf reduction
0.08 [0.02-0.13]
penning + moose reduction
0.07 [-0.17-0.3]
wolf reduction + sterilization
0.07 [0.01-0.13]
penning + moose & wolf reduction
-0.01 [-0.2-0.19]
moose reduction
-0.04 [-0.1-0.01]
eff.draws %> %
filter(name == " Rate of increase (r)" ) %> %
group_by(herd , name , trt ) %> %
summarise(delta = median(delta.r )) %> %
ungroup() %> %
arrange(delta ) %> %
count(delta > 0 ) %> %
kable()
delta > 0
n
FALSE
5
TRUE
26
Summarize results by recovery action, including application intensity
eff.draws.app <- demog.draws %> %
group_by(herd , yrs , trt ) %> %
mutate(totNMF.median = median(totNMF )) %> % # get average pop size so popsize threshold doesnt split low/standard in some years due to draws being above/below threshold
ungroup() %> %
mutate(
application = case_when(intensity == " low" | totNMF.median < 30 ~ " low" , TRUE ~ " standard" )
) %> %
filter(! trt %in% " Reference" ) %> %
group_by(.draw , herd , trt , application ) %> %
summarise(across(r : R , ~ mean(.x , na.rm = TRUE ))) %> % # ## mean posterior per herd-treatment
ungroup() %> %
pivot_longer(r : R ) %> %
ungroup() %> %
dplyr :: select(.draw , application , trt , herd , name , eff = value ) %> %
left_join(
demog.draws %> %
ungroup() %> %
filter(trt %in% " Reference" ) %> %
group_by(.draw , herd ) %> %
summarise(across(r : R , ~ mean(.x , na.rm = TRUE ))) %> % # ## mean posterior per herd-treatment
pivot_longer(r : R ) %> %
dplyr :: select(.draw , herd , name , ref = value ),
by = c(" .draw" , " herd" , " name" )
) %> %
# # calculate delta
mutate(
delta.r = eff - ref
)
# eff.draws.app %>%
# filter(
# trt != "transplant",
# name == "r"
# ) %>%
# filter(trt %in% "reducewolves") %>%
# group_by(herd, trt, application) %>%
# summarize(mean = mean(eff)) %>%
# arrange(mean)
eff.draws.app %> %
filter(
trt != " transplant" ,
name == " r"
) %> %
filter(trt %in% " reducewolves" ) %> %
group_by(trt , application , herd ) %> %
summarize(mean = mean(eff )) %> %
group_by(trt , application ) %> %
summarize(
n = n(),
mean = median(mean )
) %> %
arrange(mean )
demog.draws %> %
filter(trt %in% " reducewolves" ) %> %
group_by(herd , yrs , intensity , trt ) %> %
summarize(mean = mean(r )) %> %
group_by(trt , intensity ) %> %
summarize(
n = n(),
mean = median(mean )
)
eff.draws.app %> % write_csv(here :: here(" tables" , " draws" , " eff.draws.app.csv" ))
# # model individual effects by application intensity
eff.draws.app.model <- eff.draws.app %> %
mutate(
reducewolves = case_when(str_detect(trt , " reducewolves" ) ~ 1 , TRUE ~ 0 ),
sterilizewolves = case_when(str_detect(trt , " sterilizewolves" ) ~ 1 , TRUE ~ 0 ),
reducemoose = case_when(str_detect(trt , " reducemoose" ) ~ 1 , TRUE ~ 0 ),
pen = case_when(str_detect(trt , " pen" ) ~ 1 , TRUE ~ 0 ),
feed = case_when(str_detect(trt , " feed" ) ~ 1 , TRUE ~ 0 ),
transplant = case_when(str_detect(trt , " transplant" ) ~ 1 , TRUE ~ 0 )
) %> %
filter(
name == " r" ,
application == " standard"
)
ind.eff.app <- eff.draws.app.model %> %
filter(name == " r" ) %> %
group_by(.draw ) %> %
do(tidy(lm(delta.r ~ reducewolves + sterilizewolves + reducemoose + pen + feed , data = . )))
ind.eff.app <- ind.eff.app %> %
filter(! term %in% c(" (Intercept)" )) %> %
left_join(
ind.eff.app %> %
filter(term == " (Intercept)" ) %> %
select(.draw , intercept = estimate ),
by = " .draw"
) %> %
mutate(eff = intercept + estimate )
ind.eff.app %> %
group_by(.draw ) %> %
group_by(term ) %> %
summarise(eff = median(eff ))
ind.eff.app %> %
group_by(term ) %> %
summarise(
delta.l = median(eff , na.rm = TRUE ) %> % round(2 ),
lower = quantile(eff , 0.05 , na.rm = TRUE ) %> % round(2 ),
upper = quantile(eff , 0.95 , na.rm = TRUE ) %> % round(2 )
) %> %
arrange(- delta.l ) %> %
mutate(delta.lambda = paste0(delta.l , " (" , lower , " -" , upper , " )" )) %> %
dplyr :: select(Treatment = term , delta.lambda )
eff.draws.app.model %> % write_csv(here :: here(" tables" , " draws" , " eff.draws.app.model.csv" ))
# # do again but with all data included
eff.draws <- eff.draws %> %
mutate(
reducewolves = case_when(str_detect(trt , " reducewolves" ) ~ 1 , TRUE ~ 0 ),
sterilizewolves = case_when(str_detect(trt , " sterilizewolves" ) ~ 1 , TRUE ~ 0 ),
reducemoose = case_when(str_detect(trt , " reducemoose" ) ~ 1 , TRUE ~ 0 ),
pen = case_when(str_detect(trt , " pen" ) ~ 1 , TRUE ~ 0 ),
feed = case_when(str_detect(trt , " feed" ) ~ 1 , TRUE ~ 0 ),
transplant = case_when(str_detect(trt , " transplant" ) ~ 1 , TRUE ~ 0 )
)
ind.eff <- eff.draws %> %
filter(name == " Rate of increase (r)" ) %> %
group_by(.draw ) %> %
do(tidy(lm(delta.r ~ reducewolves + sterilizewolves + reducemoose + pen + feed , data = . )))
ind.eff <- ind.eff %> %
filter(! term %in% c(" (Intercept)" )) %> %
left_join(
ind.eff %> %
filter(term == " (Intercept)" ) %> %
select(.draw , intercept = estimate ),
by = " .draw"
) %> %
mutate(eff = intercept + estimate )
ind.eff %> %
group_by(term ) %> %
summarise(eff = median(estimate ))
eff.draws %> % write_csv(here :: here(" tables" , " draws" , " eff.draws.csv" ))
Individual Treatment Effects
ind.eff.plot <- ggplot(ind.eff.app %> % left_join(label.lookup %> % rename(term = trt ), by = " term" ), aes(x = eff , y = fct_relevel(new , " wolf sterlization" , " moose reduction" , " feeding" , " penning" , " wolf reduction" ), fill = new )) +
geom_density_ridges(
scale = .9 ,
rel_min_height = .01 ,
size = 0.25 ,
alpha = 0.5
) +
theme_ipsum() +
theme(
axis.title.x = element_text(size = 15 ),
axis.title.y = element_text(size = 15 ),
strip.text.x = element_text(size = 15 ),
strip.text.y = element_text(size = 15 ),
legend.text = element_text(size = 13 ),
legend.title = element_text(size = 15 ),
legend.position = " none"
) +
geom_vline(xintercept = 0 , linetype = " dashed" ) +
labs(x = " Change in rate of increase" , y = " Recovery action(s)" , title = " a) Individual Treatment Effects" , subtitle = " Partitioned using regression analysis, assuming effects are additive" ) +
scale_fill_manual(values = cols [c(1 : 6 )]) +
xlim(- 0.2 , 0.25 )
ind.eff.plot
# ggsave(here::here("plots","ind_effects.png"), width=5, height=6, bg="white")
ind.eff.table <- ind.eff.app %> %
group_by(term ) %> %
summarise(
delta.l = median(eff , na.rm = TRUE ) %> % round(2 ),
lower = quantile(eff , 0.05 , na.rm = TRUE ) %> % round(2 ),
upper = quantile(eff , 0.95 , na.rm = TRUE ) %> % round(2 )
) %> %
arrange(- delta.l ) %> %
mutate(delta.lambda = paste0(delta.l , " (" , lower , " -" , upper , " )" )) %> %
dplyr :: select(Treatment = term , delta.lambda )
ind.eff.table %> %
gt() %> %
gtsave(here :: here(" tables" , " ind_trt_eff_ba.rtf" ))
kable(ind.eff.table )
Treatment
delta.lambda
feed
0.11 (-0.13-0.31)
reducewolves
0.1 (0.03-0.17)
pen
0.08 (0-0.17)
reducemoose
0.03 (-0.03-0.08)
sterilizewolves
-0.01 (-0.1-0.07)
Simulate Conservation Intervention
n.sims <- 1000
start.pop <- 100
sim.ref <- demog.draws %> %
filter(trt == " Reference" & totNMF < 150 ) %> %
group_by(.draw , trt ) %> %
summarise(r = median(r )) %> % # # median lambda across herds
ungroup() %> %
sample_n(n.sims ) %> %
pull(r )
median(sim.ref )
sim.trt <- ind.eff.app %> %
group_by(term ) %> %
ungroup() %> %
dplyr :: select(.draw , term , eff ) %> %
pivot_wider(names_from = " term" , values_from = " eff" ) %> %
drop_na() %> %
sample_n(n.sims )
median(sim.ref )
year.end <- 9
sim.df <- list ()
for (i in 1 : n.sims ) {
# # effects
wolf.sim.i <- exp(sim.ref [i ] + sim.trt $ reducewolves [i ])
feed.sim.i <- exp((sim.ref [i ] + sim.trt $ feed [i ]))
pen.sim.i <- exp((sim.ref [i ] + sim.trt $ pen [i ]))
moose.sim.i <- exp((sim.ref [i ] + sim.trt $ reducemoose [i ]))
steril.sim.i <- exp((sim.ref [i ] + sim.trt $ sterilizewolves [i ]))
wolffeed.sim.i <- exp((sim.ref [i ] + sim.trt $ feed [i ] + sim.trt $ reducewolves [i ]))
wolfpen.sim.i <- exp((sim.ref [i ] + sim.trt $ pen [i ] + sim.trt $ reducewolves [i ]))
# # sub out values that exceed the maximal sustained growth rate observed for caribou is r=0.26 (Heard and Oullet 1994)
max.l <- exp(0.26 )
wolf.sim.i <- ifelse(wolf.sim.i > max.l , max.l , wolf.sim.i )
feed.sim.i <- ifelse(feed.sim.i > max.l , max.l , feed.sim.i )
pen.sim.i <- ifelse(pen.sim.i > max.l , max.l , pen.sim.i )
moose.sim.i <- ifelse(moose.sim.i > max.l , max.l , moose.sim.i )
steril.sim.i <- ifelse(steril.sim.i > max.l , max.l , steril.sim.i )
wolffeed.sim.i <- ifelse(wolffeed.sim.i > max.l , max.l , wolffeed.sim.i )
wolfpen.sim.i <- ifelse(wolfpen.sim.i > max.l , max.l , wolfpen.sim.i )
# # project population change
cons.sim.i <- tibble(yr = 1 : (11 + year.end )) %> %
dplyr :: mutate(
reference = c(start.pop * exp(sim.ref [i ])^ yr ),
reducewolves = case_when(
yr %in% 1 : 10 ~ reference ,
yr %in% 11 : 30 ~ c(reference [10 ] * wolf.sim.i ^ (yr - 10 ))
),
feed = case_when(
yr %in% 1 : 10 ~ reference ,
yr %in% 11 : 30 ~ c(reference [10 ] * feed.sim.i ^ (yr - 10 ))
),
pen = case_when(
yr %in% 1 : 10 ~ reference ,
yr %in% 11 : 30 ~ c(reference [10 ] * pen.sim.i ^ (yr - 10 ))
),
reducemoose = case_when(
yr %in% 1 : 10 ~ reference ,
yr %in% 11 : 30 ~ c(reference [10 ] * moose.sim.i ^ (yr - 10 ))
),
sterilizewolves = case_when(
yr %in% 1 : 10 ~ reference ,
yr %in% 11 : 30 ~ c(reference [10 ] * steril.sim.i ^ (yr - 10 ))
),
`reducewolves+feed` = case_when(
yr %in% 1 : 10 ~ reference ,
yr %in% 11 : 30 ~ c(reference [10 ] * wolffeed.sim.i ^ (yr - 10 ))
),
`reducewolves+pen` = case_when(
yr %in% 1 : 10 ~ reference ,
yr %in% 11 : 30 ~ c(reference [10 ] * wolfpen.sim.i ^ (yr - 10 ))
),
sim = i
)
sim.df [[i ]] <- cons.sim.i
}
sim.df <- do.call(rbind , sim.df )
nudge <- 0.15
sim.df.plot <- sim.df %> %
pivot_longer(reference : `reducewolves+pen` ) %> %
group_by(name , sim ) %> %
mutate(
inc = sum(last(value ) > value [10 ]),
ext = sum(last(value ) < = 20 ),
abund = last(value )
) %> %
group_by(name , yr ) %> %
summarise(
median = median(value ),
se = sd(value ),
upper = quantile(abund , 0.95 ),
lower = quantile(abund , 0.05 ),
inc = (mean(inc ) * 100 ) %> % round(0 ),
ext = (mean(ext ) * 100 ) %> % round(0 )
) %> %
filter(
! (yr < 10 & name != " reference" ),
yr < = (11 + year.end )
) %> %
left_join(label.lookup %> % rename(name = trt ), by = " name" ) %> %
mutate(
trt = paste0(new , " (" , inc , " , " , ext , " , " , lower %> % round(0 ), " -" , upper %> % round(0 ), " )" ),
yr = yr - 10
) %> %
mutate(yr.shift = case_when(
new %in% " sterilizewolves" & yr == year.end ~ yr + (2.5 * nudge ),
new %in% " reducemoose" & yr == year.end ~ yr + (3.5 * nudge ),
new %in% " reference" & yr == year.end ~ yr - nudge ,
new %in% " pen" & yr == year.end ~ yr ,
new %in% " feed" & yr == year.end ~ yr + nudge ,
new %in% " reducewolves" & yr == year.end ~ yr + (2 * nudge ),
new %in% " reducewolves+pen" & yr == year.end ~ yr + (3 * nudge ),
new %in% " reducewolves+feed" & yr == year.end ~ yr + (4 * nudge ),
TRUE ~ yr
)) %> %
mutate(trt = case_when(
str_detect(trt , " \\ + wolf reduction" ) ~ str_wrap(trt , width = 26 ),
TRUE ~ trt
))
# a <-sim.df.plot%>%
# filter(yr == last(yr))%>%pull()
recov.cols <- c(cols [1 : 3 ], " black" , cols [5 : 8 ])
recov.sims.plot <- ggplot() +
annotate(" rect" ,
xmin = - 10 , xmax = year.end + 1 , ymin = 0 , ymax = 20 ,
alpha = .1 , fill = " black"
) +
annotate(" text" , x = - 4 , y = 10 , label = " Functionally extirpated" ) +
geom_line(data = sim.df.plot %> % filter(name != " reference" ), aes(x = yr , y = median , color = trt )) +
geom_line(data = sim.df.plot %> % filter(name == " reference" ), aes(x = yr , y = median , color = trt ), size = 1.5 , linetype = " dashed" ) +
# geom_linerange(data=sim.df.plot%>%
# group_by(name)%>%
# filter(yr==max(yr)),aes(x=yr.shift,y=median,color=trt, ymin=median-se,ymax=median+se), alpha=0.7)+
theme_ipsum() +
theme(
axis.title.x = element_text(size = 15 ),
axis.title.y = element_text(size = 15 ),
strip.text.x = element_text(size = 15 ),
strip.text.y = element_text(size = 15 ),
legend.text = element_text(size = 13 ),
legend.title = element_text(size = 15 ),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
legend.position = " none"
) +
labs(x = " Years since intervention" , y = " Abundance" , title = " b) Simulated Options to Avert Caribou Extirpation" , subtitle = " Labels = treatment (% samples increased, % samples extirpated, 90% end abundance interval)" ) +
# geom_hline(yintercept = 10, linetype="dashed")+
geom_text_repel(
data = sim.df.plot %> %
filter(
yr == last(yr ),
name == " feed"
),
aes(color = trt , label = trt , x = yr , y = median ),
size = 4 ,
direction = " y" ,
xlim = c(year.end + 2 , 35 ),
vjust = 2.5 ,
segment.size = .7 ,
segment.alpha = .5 ,
segment.linetype = " dotted" ,
box.padding = .8 ,
seed = 999
) +
geom_text_repel(
data = sim.df.plot %> %
filter(
yr == last(yr ),
name != " feed"
),
aes(color = trt , label = trt , x = yr , y = median ),
size = 4 ,
direction = " y" ,
xlim = c(year.end + 2 , 35 ),
hjust = 0 ,
segment.size = .7 ,
segment.alpha = .5 ,
segment.linetype = " dotted" ,
box.padding = .8 ,
seed = 999
) +
coord_cartesian(
clip = " off"
) +
scale_x_continuous(
expand = c(0 , 0 ),
limits = c(- 10 , year.end + 1 ),
breaks = seq(- 10 , year.end + 1 , by = 5 )
) +
theme(plot.margin = margin(1 , 7 , 1 , 1.2 , " cm" )) +
scale_color_manual(values = recov.cols ) +
geom_text(data = tibble(lab = " Status quo" , x = - 3 , y = 90 ), aes(x = x , y = y , label = " Status quo" ), hjust = " left" , size = 5 ) +
geom_curve(
data = tibble(x = - 2 , y = 80 , xend = - 3 , yend = 60 ),
aes(x = x , y = y , yend = yend , xend = xend ), inherit.aes = FALSE , curvature = - .3 , arrow = arrow(length = unit(2 , " mm" ))
)
recov.sims.plot
# # plot individual treatments together
recov.together <- ind.eff.plot + recov.sims.plot + plot_layout(widths = c(1.3 , 1.6 ))
ggsave(plot = recov.together , here :: here(" plots/recov.together.png" ), width = 13 , height = 6 , bg = " white" , dpi = 600 )
# # Prep Herd Bounds
herd.bounds <- st_read(here :: here(" data/Spatial/herds/u_bc_herds_2021_CL.shp" )) %> %
st_transform(3005 ) %> %
dplyr :: select(herd = HERD_NAME ) %> %
mutate(herd = case_when(
herd %in% " Narraway" ~ " Bearhole Redwillow" ,
herd %in% " Moberly" ~ " Klinse-Za" ,
herd %in% " Scott" ~ " Scott West" ,
herd %in% " Frisby Boulder" ~ " Frisby-Boulder" ,
herd %in% " Purcell Central" ~ " Purcells Central" ,
TRUE ~ herd
)) %> %
rbind(st_read(here :: here(" data/Spatial/herds/Caribou_Range.shp" )) %> %
st_transform(3005 ) %> %
dplyr :: select(herd = SUBUNIT ) %> %
mutate(herd = case_when(
herd %in% " Narraway" ~ " Narraway AB" ,
herd %in% " Redrock-Prairie Creek" ~ " Redrock/Prairie Creek" ,
TRUE ~ herd
))) %> %
rbind(st_read(here :: here(" data/Spatial/herds/rrpc/BC_RRPC.shp" )) %> %
st_transform(3005 ) %> %
mutate(herd = " Redrock/Prairie Creek" ) %> %
dplyr :: select(herd )) %> %
st_simplify(
preserveTopology = FALSE ,
dTolerance = 1000
) %> %
group_by(herd ) %> %
summarise() %> %
ungroup() %> %
filter(herd %in% c(herds , " Scott West" ))
## Reading layer `u_bc_herds_2021_CL' from data source
## `/Users/claytonlamb/Dropbox/Documents/University/Work/WSC/CaribouIPM_BCAB/data/Spatial/herds/u_bc_herds_2021_CL.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 57 features and 19 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -165343.7 ymin: 5422045 xmax: 1031821 ymax: 6709569
## Projected CRS: NAD83 / UTM zone 10N
## Reading layer `Caribou_Range' from data source
## `/Users/claytonlamb/Dropbox/Documents/University/Work/WSC/CaribouIPM_BCAB/data/Spatial/herds/Caribou_Range.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 25 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 170844.4 ymin: 5689840 xmax: 819119.1 ymax: 6659319
## Projected CRS: NAD83 / Alberta 10-TM (Forest)
## Reading layer `BC_RRPC' from data source
## `/Users/claytonlamb/Dropbox/Documents/University/Work/WSC/CaribouIPM_BCAB/data/Spatial/herds/rrpc/BC_RRPC.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 17 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 1345869 ymin: 959823.3 xmax: 1416126 ymax: 1036210
## Projected CRS: NAD83 / BC Albers
library(units )
disturb <- st_read(here :: here(" data/Spatial/disturbance/from_Emily/2022-01-19/anthrodisturbance_75to15incl0/anthrodisturbance_75to15incl0.shp" )) %> %
st_intersection(herd.bounds ) %> %
mutate(dist = st_area(. ) %> % set_units(" km^2" ) %> % as.numeric()) %> %
tibble() %> %
dplyr :: select(herd , dist )
## Reading layer `anthrodisturbance_75to15incl0' from data source
## `/Users/claytonlamb/Dropbox/Documents/University/Work/WSC/CaribouIPM_BCAB/data/Spatial/disturbance/from_Emily/2022-01-19/anthrodisturbance_75to15incl0/anthrodisturbance_75to15incl0.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 1 field
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 818361.6 ymin: 474487.5 xmax: 1806688 ymax: 1392210
## Projected CRS: NAD83 / BC Albers
herd.bounds <- herd.bounds %> %
mutate(herd.area = st_area(. ) %> % set_units(" km^2" ) %> % as.numeric()) %> %
left_join(disturb , by = " herd" ) %> %
mutate(human = (dist / herd.area )) %> %
dplyr :: select(herd , human ) %> %
left_join(
demog %> %
filter(trt %in% c(" Reference" , " transplant" )) %> %
group_by(herd ) %> %
filter(yrs %in% (max(yrs ) - 9 ): max(yrs )) %> % # # filter to 10 years before intervention started
summarise(r = mean(log(lambda ), na.rm = TRUE )), # # geo mean per herd
by = " herd"
) %> %
left_join(ext.yr %> % mutate(ext = 1 ) %> % ungroup() %> % dplyr :: select(herd , ext ) %> % rbind(tibble(herd = " Scott West" , ext = 1 )),
by = " herd"
) %> %
left_join(ecotype ,
by = " herd"
) %> %
mutate(
r = case_when(herd %in% " Scott West" ~ - 0.05 , TRUE ~ r ),
ECCC = case_when(herd %in% " Scott West" ~ " Central Group" , TRUE ~ ECCC )
) %> % # # don't have Scott west. Extirpated
mutate(
human = round(human * 100 , 0 ) %> % as.integer(),
r.class = case_when(
r < = - 0.05 ~ " < -0.05" ,
r > - 0.05 & r < = - 0.01 ~ " -0.05--0.01" ,
r > - 0.01 & r < 0.01 ~ " -0.01-0.01" ,
r > = 0.01 ~ " >0.01"
),
r.class2 = case_when(
r < = - 0.01 ~ " declining" ,
r > - 0.01 & r < = 0.01 ~ " stable" ,
r > 0.01 ~ " increasing" ,
is.na(r ) & ext == 1 ~ " declining"
)
) %> %
st_as_sf() %> %
st_transform(4326 )
st_write(herd.bounds , here :: here(" data/Spatial/herds/ipm_herds.shp" ), delete_dsn = TRUE )
## Deleting source `/Users/claytonlamb/Dropbox/Documents/University/Work/WSC/CaribouIPM_BCAB/data/Spatial/herds/ipm_herds.shp' using driver `ESRI Shapefile'
## Writing layer `ipm_herds' to data source
## `/Users/claytonlamb/Dropbox/Documents/University/Work/WSC/CaribouIPM_BCAB/data/Spatial/herds/ipm_herds.shp' using driver `ESRI Shapefile'
## Writing 41 features with 9 fields and geometry type Polygon.
# mapview(herds,zcol="human")
# mapview(herds,zcol="lambda.class2")
# # prep herd # labels
# herd.bounds %>%
# cbind(st_centroid(.) %>% st_coordinates()) %>%
# tibble() %>%
# mutate(ECCC=fct_relevel(ECCC,"Northern Group","Central Group","Southern Group"))%>%
# arrange(ECCC,-Y) %>%
# mutate(number_label = 1:n()) %>%
# dplyr::select (herd, human, number_label) %>%
# write_csv(here::here("data", "clean", "labels.csv"))
herd.bounds <- herd.bounds %> %
left_join(labels %> % dplyr :: select(herd , number_label ), by = " herd" )
# # Prep inset map
# # Cities
cities <- st_read(here :: here(" data/Spatial/administrative/places.shp" )) %> %
filter(NAME %in% c(" C" , " VANCOUVER" , " Prince George" , " Fort St John" )) %> %
mutate(Name = str_to_title(NAME )) %> %
dplyr :: select(Name , geometry ) %> %
st_transform(4326 ) %> %
rbind(tibble(Name = " Banff" , Y = 51.18 , X = - 115.56 ) %> % st_as_sf(coords = c(" X" , " Y" ), crs = 4326 )) %> %
st_transform(3005 )
## Reading layer `places' from data source
## `/Users/claytonlamb/Dropbox/Documents/University/Work/WSC/CaribouIPM_BCAB/data/Spatial/administrative/places.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 787 features and 3 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: -134.9996 ymin: 48.37586 xmax: -114.6224 ymax: 59.92801
## Geodetic CRS: NAD27
# # Pacific northwest for inset
pnw <- st_read(here :: here(" data/Spatial/administrative/North_America.shp" )) %> %
filter(FID_usa %in% c(1 , 2 , 8 , 11 ) | FID_canada %in% c(8 , 9 )) %> %
mutate(
prov = c(" WA" , " MT" , " ID" , " OR" , " AB" , " BC" , " BC" ),
country = c(rep(" USA" , times = 4 ), rep(" CAN" , times = 3 ))
) %> %
st_make_valid() %> %
group_by(prov , country ) %> %
summarise(id = mean(FID_canada )) %> %
ungroup() %> %
st_transform(3005 )
## Reading layer `North_America' from data source
## `/Users/claytonlamb/Dropbox/Documents/University/Work/WSC/CaribouIPM_BCAB/data/Spatial/administrative/North_America.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 70 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -178.2176 ymin: 18.92179 xmax: -52.62783 ymax: 83.11506
## Geodetic CRS: WGS 84
library(ggspatial )
# # inset
# # custom crs to keep things straight
cust.crs <- " +proj=aea +lat_0=50 +lon_0=-114.9 +lat_1=49 +lat_2=50.5 +x_0=1000000 +y_0=0 +datum=NAD83 +units=m +no_defs"
inset <- ggplot() +
geom_sf(data = pnw %> % st_transform(cust.crs ), fill = " grey80" , color = NA ) +
geom_sf(data = pnw %> % st_transform(cust.crs ), size = 0.5 , fill = NA , color = " grey30" ) +
layer_spatial(sf :: st_bbox(herd.bounds %> % st_buffer(100000 ) %> % st_transform(cust.crs )), fill = NA , linetype = " dashed" , color = " grey99" , linewidth = 1 ) +
geom_sf_text(data = pnw %> % st_transform(cust.crs ), aes(label = prov ), inherit.aes = FALSE , size = 3 ) +
theme(
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.ticks = element_blank(),
panel.background = element_rect(fill = " transparent" , colour = " transparent" ),
panel.border = element_rect(fill = NA , color = NA ),
axis.text = element_blank(),
axis.title = element_blank(),
plot.margin = unit(c(0 , 0 , 0 , 0 ), " mm" ),
legend.position = c(0.65 , 0.075 ),
plot.background = element_rect(fill = " transparent" , colour = NA )
)
# # get basemap
#
# register_google("Add your token here")
# bmap.big <- basemaps::basemap(
# #ext = herd.bounds %>% st_buffer(200000) %>% group_by%>%summarise%>%st_transform(3857)%>%st_bbox,
# ext=st_bbox(c(xmin = -15443769, xmax = -12714182, ymin = 6085017, ymax = 7962966), crs = st_crs(3857)),
# map_res = 1, map_type = "terrain_bg", class="raster"
# ) %>% projectRaster(crs = cust.crs)
#
# writeRaster(bmap.big, here::here("data","Spatial","basemap.tif"))
bmap.big <- rast(here :: here(" data" , " Spatial" , " basemap.tif" ))
bmap.big <- bmap.big %> % as.data.frame(xy = TRUE )
map <- ggplot() +
geom_raster(
data = bmap.big , aes(x = x , y = y ),
fill = rgb(
red = bmap.big $ basemap_1 ,
green = bmap.big $ basemap_2 ,
blue = bmap.big $ basemap_3 ,
maxColorValue = 255
),
show.legend = FALSE
) +
theme_bw() +
geom_sf(data = pnw %> %
st_transform(cust.crs ), size = 1 , fill = NA , linetype = " dashed" ) +
geom_sf(data = herd.bounds , aes(fill = r.class2 ), inherit.aes = FALSE , alpha = 0.7 ) +
geom_sf(data = herd.bounds %> %
filter(ext %in% 1 ), aes(color = " fnl extirpation" ), fill = NA , inherit.aes = FALSE , alpha = 0.7 , linewidth = 0.75 ) +
geom_sf_text(data = st_centroid(herd.bounds ), aes(label = number_label ), inherit.aes = FALSE , size = 3 , color = " white" ) +
geom_sf_text(data = st_centroid(herd.bounds %> % filter(r.class2 == " stable" )), aes(label = number_label ), inherit.aes = FALSE , size = 2.5 , color = " black" ) +
geom_sf(data = cities %> % st_transform(cust.crs ), inherit.aes = FALSE , size = 3 , pch = 21 , fill = " white" , color = " black" ) +
geom_sf_text(data = cities %> % filter(! Name %in% c(" Fort St John" , " Prince George" )) %> % st_transform(cust.crs ), aes(label = Name ), inherit.aes = FALSE , size = 3 , hjust = - 0.1 , vjust = - 1 , color = " white" ) +
geom_sf_text(data = cities %> % filter(Name %in% c(" Fort St John" , " Prince George" )) %> % st_transform(cust.crs ), aes(label = Name ), inherit.aes = FALSE , size = 3 , hjust = 0.6 , vjust = - 1 , color = " white" ) +
theme_ipsum() +
theme(
axis.title.y = element_blank(),
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
strip.text.x = element_text(size = 15 ),
strip.text.y = element_text(size = 15 ),
axis.text = element_text(size = 10 ),
legend.text = element_text(size = 15 , color = " black" ),
legend.title = element_text(size = 15 , color = " black" ),
legend.spacing.y = unit(0.05 , " cm" ),
legend.margin = margin(0 , 0 , 0 , 0 ),
legend.box.margin = margin(0 , 0 , 0 , 0 ),
legend.position = " top"
) +
ggsn :: scalebar(x.min = 10E4 , x.max = 105E4 , y.min = - 19E4 , y.max = 85E4 , dist = 150 , height = 0.03 , dist_unit = " km" , transform = FALSE , location = " bottomleft" , st.color = " white" , st.bottom = FALSE ) +
annotation_custom(ggplotGrob(inset ), xmin = 65E4 , xmax = 108E4 , ymin = 52E4 , ymax = 85E4 ) +
scale_y_continuous(expand = c(0 , 0 ), limits = c(- 20E4 , 85E4 )) +
scale_x_continuous(expand = c(0 , 0 ), limits = c(5E4 , 105E4 )) +
labs(fill = " Population growth\n without intervention" , title = " a) Southern Mountain Caribou" , color = " " ) +
scale_fill_viridis_d() +
scale_color_manual(values = c(" fnl extirpation" = " red" )) +
guides(fill = guide_legend(nrow = 2 , byrow = TRUE ))
# # plot together
map_combo <- map + abundance.all.plot + plot_layout(widths = c(1.7 , 1.3 ))
map_combo
ggsave(plot = map_combo , here :: here(" plots/map.together.png" ), width = 12 , height = 8 , bg = " white" , dpi = 600 )