Dianthus-broteri-Competition / Functional_traits_analysis / script / stan_models / Waterstatus_model.stan
Waterstatus_model.stan
Raw
// Modelo de Trait-based competition model siguiendo a Kunstler et al 2016 
data {
  int<lower=0> N; // Número total de observaciones
  vector[N] Biomasa; // Biomasa observada
  vector[N] tf; // Rasgo del especie focal
  vector[N] tc; // Rasgos del especie competidor
  vector[N] Bc; // Biomasa del competidor
  int<lower=1> N_species; // Número de especies diferentes
  int<lower=1, upper=N_species> species[N]; // Índice de especie para cada observación
  int<lower=0, upper=1> C[N]; // Indicador de competencia intra (1) vs. interespecífica (0) para cada observación
  int<lower=0, upper=1> water_status[N]; // Estado hídrico para cada observación
}

parameters {
  // Parámetros para condiciones secas
  real m0_dry;
  real m1_dry;
  vector[N_species] epsilon_Bmax_f_dry;
  vector[N_species] epsilon_alpha0intra_dry;
  vector[N_species] epsilon_alpha0inter_dry;
  real alpha0intra_species_dry;
  real alpha0inter_species_dry;
  real alpha_t_dry; // Tolerancia a la competencia por el rasgo tf en condiciones secas
  real alpha_e_dry; // Efecto competitivo por el rasgo tc en condiciones secas
  real alpha_d_dry; // Efecto de la disimilitud de rasgos en condiciones secas

  // Parámetros para condiciones húmedas
  real m0_wet;
  real m1_wet;
  vector[N_species] epsilon_Bmax_f_wet;
  vector[N_species] epsilon_alpha0intra_wet;
  vector[N_species] epsilon_alpha0inter_wet;
  real alpha0intra_species_wet;
  real alpha0inter_species_wet;
  real alpha_t_wet; // Tolerancia a la competencia por el rasgo tf en condiciones húmedas
  real alpha_e_wet; // Efecto competitivo por el rasgo tc en condiciones húmedas
  real alpha_d_wet; // Efecto de la disimilitud de rasgos en condiciones húmedas

  // Parámetros generales (que no varían con el water_status)
  real<lower=0> sigma_species_Bmax;
  real<lower=0> sigma_alpha_intra;
  real<lower=0> sigma_alpha_inter;
  real<lower=0> sigma;
}


model {
  // Distribuciones previas para los parámetros
  m0_dry ~ normal(0, 1);
  m1_dry ~ normal(0, 1);
  m0_wet ~ normal(0, 1);
  m1_wet ~ normal(0, 1);
  sigma_species_Bmax ~ normal(0, 0.5);
  sigma_alpha_intra ~ normal(0, 0.5);
  sigma_alpha_inter ~ normal(0, 0.5);
  sigma ~ normal(0, 1);
  
  // Efectos aleatorios y parámetros específicos de condiciones secas y húmedas
  epsilon_Bmax_f_dry ~ normal(0, sigma_species_Bmax);
  epsilon_Bmax_f_wet ~ normal(0, sigma_species_Bmax);
  epsilon_alpha0intra_dry ~ normal(0, sigma_alpha_intra);
  epsilon_alpha0intra_wet ~ normal(0, sigma_alpha_intra);
  epsilon_alpha0inter_dry ~ normal(0, sigma_alpha_inter);
  epsilon_alpha0inter_wet ~ normal(0, sigma_alpha_inter);
  alpha0intra_species_dry ~ normal(0, 1); 
  alpha0inter_species_dry ~ normal(0, 1);
  alpha0intra_species_wet ~ normal(0, 1);
  alpha0inter_species_wet ~ normal(0, 1);
  alpha_t_dry ~ normal(0, 1);
  alpha_e_dry ~ normal(0, 1);
  alpha_d_dry ~ normal(0, 1);
  alpha_t_wet ~ normal(0, 1);
  alpha_e_wet ~ normal(0, 1);
  alpha_d_wet ~ normal(0, 1);

  // Modelo log-linear de Biomasa ajustado para cada observación
  for (i in 1:N) {
    // Selección de parámetros basados en water_status
    real m0 = water_status[i] == 1 ? m0_wet : m0_dry;
    real m1 = water_status[i] == 1 ? m1_wet : m1_dry;
    real alpha_t = water_status[i] == 1 ? alpha_t_wet : alpha_t_dry;
    real alpha_e = water_status[i] == 1 ? alpha_e_wet : alpha_e_dry;
    real alpha_d = water_status[i] == 1 ? alpha_d_wet : alpha_d_dry;
    vector[N_species] epsilon_Bmax_f = water_status[i] == 1 ? epsilon_Bmax_f_wet : epsilon_Bmax_f_dry;
    vector[N_species] epsilon_alpha0intra = water_status[i] == 1 ? epsilon_alpha0intra_wet : epsilon_alpha0intra_dry;
    vector[N_species] epsilon_alpha0inter = water_status[i] == 1 ? epsilon_alpha0inter_wet : epsilon_alpha0inter_dry;
    real alpha0intra_species = water_status[i] == 1 ? alpha0intra_species_wet : alpha0intra_species_dry;
    real alpha0inter_species = water_status[i] == 1 ? alpha0inter_species_wet : alpha0inter_species_dry;

    // Cálculo de Bmax_i y competition_effect
    real Bmax_i = exp(m0 + m1 * tf[i] + epsilon_Bmax_f[species[i]]);
    real competition_effect = 0;

    if (C[i] == 1) {
      competition_effect += alpha0intra_species + epsilon_alpha0intra[species[i]];
    } else {
      competition_effect += alpha0inter_species + epsilon_alpha0inter[species[i]];
    }

    competition_effect += -alpha_t * tf[i] + alpha_e * tc[i] + alpha_d * fabs(tc[i] - tf[i]);

    // Aplicación del modelo final para cada observación
    Biomasa[i] ~ normal(Bmax_i * exp(-competition_effect * Bc[i]), sigma);
  }
}