Cousteau Consultant Group
¿Para qué nos sirven los modelos de evaluación?
Stockholm University Baltic Sea Centre
Diferencias claves en enfoques para estudiar poblaciones:
Haddon (2011)
Combina diferentes tipos de datos en un único análisis. El ajuste a los datos se realiza por medio de una rutina de minimización de alguna función objetivo (D. Fournier and Archibald 1982).
Tipos de datos más comunes:
Haddon (2011)
En un modelo de evaluación estructurado por edades tenemos los siguientes componentes principalmente:
Software o librería orientado a la implementación de modelos de evaluación de stocks (en general).
Ventajas
Desventajas
Ejemplos:
Definición
Podemos tener dos series temporales:
Los procesos cambian en el tiempo estocásticamente, lo que se conoce como variaciones en procesos (process variation).
Auger-Méthé et al. (2021)
Normalmente se asume un proceso Markov (de primer orden) para modelar los estados:
\[z_t = \beta z_{t-1}+\epsilon_t\]
\[\epsilon_t \sim N(0,\sigma_p^2)\]
\(z_0\) puede ser tratado como un parámetro adicional.
Para el caso de las observaciones, se asumen que estas son independientes, y se relacionan con los estados:
\[y_t = \alpha z_{t}+\eta_t\]
\[\eta_t \sim N(0,\sigma_o^2)\]
Podemos caracterizar este modelo en términos de distribuciones de probabilidad:
\[g(y_t \mid z_{t}, \boldsymbol{\theta}_o)\]
\[f(z_t \mid z_{t-1}, \boldsymbol{\theta}_p)\]
para \(t=1,...,T\), donde \(f\) y \(g\) son dos funciones de densidad de probabilidad normales, \(\boldsymbol{\theta}_p\) y \(\boldsymbol{\theta}_o\) son vectores de parámetros asociados con cada ecuación:
\[\boldsymbol{\theta}_p = (\beta, \sigma_p^2), \boldsymbol{\theta}_o = (\alpha,\sigma_o^2)\]
Los efectos fijos vienen a ser:
\[\boldsymbol{\theta} = (\boldsymbol{\theta}_p, \boldsymbol{\theta}_o, z_0)\]
Y los estados \(z_t\) son tratados como variables aleatorias.
Por lo tanto, los SSM se consideran estos modelos jerárquicos:
Enfoque presentado por Sullivan (1992) y Gudmundsson (1994).
Usualmente los estados \(z_t\) vienen a ser variables como (Aeberhard, Flemming, and Nielsen 2018):
En modelos de evaluación tradicionales se emplea el enfoque de máxima verosimilitud penalizada (PML) para modelar variaciones temporales en algún estado.
Ejemplo
Para modelar mortalidad por pesca, se separa la mortalidad por pesca anual y la selectividad a la edad:
\[F_{a,t} = f_t S_a \exp(\delta_{a,t})\]
Asumiendo que \(\delta_{a,t} \sim N(0,\sigma_\delta^2)\). El enfoque PML fija \(\sigma_\delta^2\) (penalty term) en el modelo a un valor subjetivo.
Principal ventaja de SSM: estimación de \(\sigma_\delta^2\).
En la actualidad, TMB (Kristensen et al. 2016) es la principal plataforma para implementar SSM debido a su eficiencia para modelar efectos aleatorios.
Instalar TMB
:
Para instalar WHAM, utilizaremos la versión que permite incluir datos de tallas:
También les sugiero explorar la versión base de WHAM.
Objetivo: Conocer los pasos para implementar un modelo en TMB
Ejemplo obtenido de Sean Anderson (Gompertz SSM).
\[u_t = a + b u_{t-1} + \epsilon_t\] \[y_t = ln(u_t)\]
\[\epsilon_t \sim N(0,\sigma_p^2)\] \[y_t \sim N(ln(u_t),\sigma_o^2)\]
Donde \(u_t\) es el estado (abundancia) en la población.
Ejercicio_1.cpp
)// Header
#include <TMB.hpp>
template<class Type>
Type objective_function<Type>::operator() () {
// Input data:
DATA_VECTOR(y);
// Parameters (fixed and random variables):
PARAMETER(a);
PARAMETER(b);
PARAMETER(log_sigma_proc);
PARAMETER(log_sigma_obs);
PARAMETER_VECTOR(u);
// Transformed parameters if required
Type sigma_proc = exp(log_sigma_proc);
Type sigma_obs = exp(log_sigma_obs);
// Reports on transformed parameters:
ADREPORT(sigma_proc)
ADREPORT(sigma_obs)
int n = y.size(); // get time series length
Type nll = 0.0; // initialize negative log likelihood
// process model:
for(int i = 1; i < n; i++){
Type m = a + b * u[i - 1]; // Gompertz
nll -= dnorm(u[i], m, sigma_proc, true); // nll function
}
// observation model:
for(int i = 0; i < n; i++){
nll -= dnorm(y[i], u[i], sigma_obs, true); // nll function
}
return nll;
}
Ejercicio_1.cpp
)// Header
#include <TMB.hpp>
template<class Type>
Type objective_function<Type>::operator() () {
// Input data:
DATA_VECTOR(y);
// Parameters (fixed and random variables):
PARAMETER(a);
PARAMETER(b);
PARAMETER(log_sigma_proc);
PARAMETER(log_sigma_obs);
PARAMETER_VECTOR(u);
// Transformed parameters if required
Type sigma_proc = exp(log_sigma_proc);
Type sigma_obs = exp(log_sigma_obs);
// Reports on transformed parameters:
ADREPORT(sigma_proc)
ADREPORT(sigma_obs)
int n = y.size(); // get time series length
Type nll = 0.0; // initialize negative log likelihood
// process model:
for(int i = 1; i < n; i++){
Type m = a + b * u[i - 1]; // Gompertz
nll -= dnorm(u[i], m, sigma_proc, true); // nll function
}
// observation model:
for(int i = 0; i < n; i++){
nll -= dnorm(y[i], u[i], sigma_obs, true); // nll function
}
return nll;
}
Ejercicio_1.cpp
)// Header
#include <TMB.hpp>
template<class Type>
Type objective_function<Type>::operator() () {
// Input data:
DATA_VECTOR(y);
// Parameters (fixed and random variables):
PARAMETER(a);
PARAMETER(b);
PARAMETER(log_sigma_proc);
PARAMETER(log_sigma_obs);
PARAMETER_VECTOR(u);
// Transformed parameters if required
Type sigma_proc = exp(log_sigma_proc);
Type sigma_obs = exp(log_sigma_obs);
// Reports on transformed parameters:
ADREPORT(sigma_proc)
ADREPORT(sigma_obs)
int n = y.size(); // get time series length
Type nll = 0.0; // initialize negative log likelihood
// process model:
for(int i = 1; i < n; i++){
Type m = a + b * u[i - 1]; // Gompertz
nll -= dnorm(u[i], m, sigma_proc, true); // nll function
}
// observation model:
for(int i = 0; i < n; i++){
nll -= dnorm(y[i], u[i], sigma_obs, true); // nll function
}
return nll;
}
y
son tus observaciones: [1] 3.857919 4.139282 4.166160 4.593082 4.487591 4.691392 4.876311 4.681899
[9] 4.581784 4.706909 4.361975 4.900340 4.493509 4.841002 4.922498 4.722094
[17] 5.041822 4.885910 4.346571 4.497004 4.620252 4.214646 4.341192 4.251093
[25] 4.634612 4.130690 4.092495 4.414942 4.317848 4.315265 4.970341 4.852596
[33] 4.682839 4.766740 4.560845 5.270630 4.776654 5.206920 5.310690 4.500237
[41] 4.816574 4.481971 4.218075 4.016740 4.537255 4.935705 4.412348 4.750295
[49] 4.955589 4.473484 4.852497 4.890937 4.776721 4.486947 4.931865 4.767796
[57] 5.192605 4.571766 4.964695 4.688365 4.988027 4.610332 4.421622 5.253123
[65] 4.336354 4.339095 4.583634 4.512310 4.740320 4.904109 5.148162 4.948719
[73] 4.386315 5.102028 4.383329 4.215316 4.716833 4.701634 4.490838 4.427061
[81] 4.322670 4.828525 4.610247 4.428890 4.703014 4.641656 4.965105 4.956500
[89] 5.095534 4.696261 5.029934 5.024695 5.091339 4.819369 4.511168 5.412903
[97] 4.909512 4.939771 5.217307 4.853442
# Data input (list)
data <- list(y = y)
# fixed effects and random variables (list):
parameters <- list(a = 1, b = 0.5, log_sigma_proc = -1,
log_sigma_obs = -1, u = rep(mean(y), 100))
# Construct objective function (define random variable):
obj <- MakeADFun(data, parameters, random = "u", DLL = "Ejercicio_1")
obj$hessian <- FALSE # no calculate hessian
# Optimization:
opt <- nlminb(start = obj$par, obj = obj$fn, gr = obj$gr)
# Calculate SD of model parameters
est_pars <- sdreport(obj)
Abrir archivo Ejercicio_2.xlsx