knitr::opts_chunk$set(echo = TRUE)
The vignette estimates the rate of fish migration between two areas from tag returns using a catch conditioned modification of @Hilborn1990movement.
The model simulated two areas 1 and 2, and followed an annual sequence of tag release with release mortality in area 1, then application of tag shedding, half of natural mortality and removal of recaptures by fishing in both areas, fish movement from area 1 to area 2, and finally application of the second half of natural mortality to the remaining numbers of tagged fish.
We assumed that tagged and released fish $relT_{1,y}$ in area 1 at the start of year $y$ were subject to tag-release mortality ($\phi$) such that available tags $T_{1,y}$:
$$T_{1,y}= relT_{1,y} * (1-\phi)$$
Each year, tag-shedding $s$ and half of annual natural mortality $M$ were applied first to all available tags in an area $r$:
$$T_{r,y} = T_{r,y} * (1-\lambda)*exp(-0.5M)$$
before fishing removed recaptures $Rec$ from the population of tagged fish:
$$T_{r,y} = T_{r,y} - Rec_{r,y} = T_{a,y}-\frac{T_{r,y}*C_{r,y}}{B_{r,y}}$$
where $C_{r,y}$ is the catch in numbers and $B_{r,y}$ is the vulnerable population size in numbers. After fishing, the number of tagged fish $T_move$ that moved from area 1 to area 2 was given by:
$$T_{move} = move*T_{1,y}$$
where $move$ is the annual movement rate. The number of tagged fish in area 1 and area 2 were then updated:
$$T_{1,y} = T_{1,y} - T_{move}$$
$$T_{2,y} = T_{2,y} - T_{move}$$
Finally, the second half of annual natural mortality $M$ was applied:
$$T_{r,y} = T_{r,y}*exp(-0.5M)$$
Since fishing occurred in the simulations before movement, no tagged fish were recaptured within-season in area 2 from tags released in area 1. Annual cohorts of tag-releases were treated separately in the simulation. Movement rate was estimated by minimising the negative multinomial log likelihood of observed and expected numbers of recaptures in either area 1, area 2, or both.
The model is demonstrated using simulated data
Load the migrate package
library(migrate)
Specify the parameters used in the model
yrs <- 2007:2015 relT <- rep( 1000, length(yrs)) # Annual Tag loss rate (for single-tag model) tagloss <- rep(0.006, length(yrs)) # Natural Mortality M <- 0.155 # Release mortality relM <- 0.1 # Proportion of fish that migrate true_move <- 0.01 # Catch C1 <- rep(10000, length(yrs)) C2 <- rep(10000, length(yrs)) # Abundance in the two areas B1 <- rep(1000000, length(yrs)) B2 <- rep(1000000, length(yrs))
Define some matrices to store the tags available and the recaptures
# T: Number of tags available in Areas 1 and 2 (after half of M) T1 <- T2 <- matrix(0,nrow=length(yrs),ncol=length(yrs),dimnames=list(yrs,yrs)) # Number of tags being recaptured R1 <- R2 <- T1 # Number of tags moving T_move <- T1
Test: Apply tag releases, release M, half of M, remove & store recaptures, estimate and do movement
for (x in 1:length(yrs)) { # Release tags T1[x,x] <- relT[x] # Apply release mortality T1[x,x] <- (1-relM) * T1[x,x] for (y in x:length(yrs)) { # Available Tags after applying 0.5 M T1[x,y] <- T1[x,y] * exp(-0.5*M) T2[x,y] <- T2[x,y] * exp(-0.5*M) # Tagloss rate T1[x,y] <- T1[x,y] * exp(-tagloss[y]) T2[x,y] <- T2[x,y] * exp(-tagloss[y]) # Recaptures (by Petersen) R1[x,y] <- rbinom(n=1,size=round(T1[x,y],0),prob=C1[y]/B1[y]) R2[x,y] <- rbinom(n=1,size=round(T2[x,y],0),prob=C2[y]/B2[y]) if((y+1) <= length(yrs)) { # Prevent error T_move[x,y+1] <- (T1[x,y] - R1[x,y])*true_move # Movement after removals [= T*move*(1-move)**(y-x-1)] T1[x,y+1] <- T1[x,y] - R1[x,y] - T_move[x,y+1] # = T*(1-move)**(y-x) T2[x,y+1] <- T2[x,y] - R2[x,y] + T_move[x,y+1] # = 1-T*(1-move)**(y-x) } T1[x,y] <- T1[x,y] * exp(-0.5*M) # Apply 0.5 M - do not apply so T1&T2 remains mid-season numbers T2[x,y] <- T2[x,y] * exp(-0.5*M) # } }
Examine the matrices of tags for the two areas
T1 T2
Examine the matrices of recaptures for the two areas
R1 R2
Define the parameters
obs <- list(yrs=yrs,relT=relT,R1=R1,R2=R2,prec1=C1/B1, prec2=C2/B2,M=M,relM=relM,tagloss=tagloss) para <- logitT(c(move=0.011694)) # move
Now fit to the simulated data using the least squares method
fit_ls <- move_sim(obs,para,rfit="R2",lltype="prop")
Print the results
cbind(Est=ilogitT(fit_ls$coef), Lwr=ilogitT(fit_ls$coef-2*fit_ls$coef.se), Upr=ilogitT(fit_ls$coef+2*fit_ls$coef.se))
Now fit to the simulated data using the maximum likelihood method
fit_ml <- move_sim(obs,para,rfit="R2",lltype="multinom")
Print the results
cbind(Est=ilogitT(fit_ml$coef), Lwr=ilogitT(fit_ml$coef-2*fit_ml$coef.se), Upr=ilogitT(fit_ml$coef+2*fit_ml$coef.se))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.