28 int nbins_blk,
int nblk,
int yng,
int old)
31 if (old < 1 || old > nbins_blk) old = nbins_blk;
32 if (yng > old) yng = old;
33 if (!(yng > 1 || old < nbins_blk))
return;
35 int nkeep = old - yng + 1;
36 vector<Type> obs_acc(nblk * nkeep); obs_acc.setZero();
37 vector<Type> hat_acc(nblk * nkeep); hat_acc.setZero();
38 for (
int b = 0; b < nblk; b++) {
39 for (
int j = 0; j < nbins_blk; j++) {
41 if (j < yng - 1) tgt = yng - 1;
42 if (j > old - 1) tgt = old - 1;
43 obs_acc(b * nkeep + tgt - (yng - 1)) += obs(b * nbins_blk + j);
44 hat_acc(b * nkeep + tgt - (yng - 1)) += hat(b * nbins_blk + j);
49 n_comp = nblk * nkeep;
81 vector<Type> obs_prop, vector<Type> hat_prop,
82 Type offset, Type n_samp, Type weight, Type dm_theta,
83 vector<Type>& obsvec, data_indicator<vector<Type>, Type>& keep,
84 int osa_start,
const char* type_name,
85 Type& nll, Type& unweighted_nll)
87 int n_comp = obs_prop.size();
90 vector<Type> obs_n = obs_prop;
91 vector<Type> hat_p = hat_prop;
98 vector<Type> alphas = obs_n.sum() * hat_p * dm_theta;
99 vector<Type> unweighted_alphas = obs_n.sum() * hat_p;
104 for (
int bin = 0; bin < n_comp; bin++) {
105 nll -= weight * n_samp * (obs_prop(bin) + offset) *
106 log((hat_prop(bin) + offset) / (obs_prop(bin) + offset));
107 unweighted_nll -= n_samp * (obs_prop(bin) + offset) *
108 log((hat_prop(bin) + offset) / (obs_prop(bin) + offset));
113 data_indicator<vector<Type>, Type> keep_ones(obs_n,
true);
114 nll -= weight *
dmultinom_osa(obs_n, hat_p, keep_ones, 1, 1);
115 unweighted_nll -=
dmultinom_osa(obs_n, hat_p, keep_ones, 1, 1);
121 unweighted_nll -=
ddirmultinom(obs_n, unweighted_alphas,
true);
125 error(
"Invalid '%s'", type_name);
127 }
else if (osa_start >= 0) {
131 vector<Type> osa_x = obsvec.segment(osa_start, n_comp);
133 nll -=
ddirmultinom_osa(osa_x, alphas, keep.segment(osa_start, n_comp), 1, 1);
135 nll -=
dmultinom_osa(osa_x, hat_p, keep.segment(osa_start, n_comp), 1, 1, osa_mode == 2);
157 Type p1, Type p2, Type bias_adjust_proc)
159 Type x = value_is_log ? exp(value) : value;
162 return dnorm(x, p1, p2,
true);
165 Type log_x = value_is_log ? value : log(x);
166 return dnorm(log_x, p1 - bias_adjust_proc *
square(p2) / 2.0, p2,
true);
169 return dgamma(x, p1, Type(1.0) / p2,
true);
171 return dbeta(x, p1, p2,
true);
Type ddirmultinom_osa(vector< Type > obs, vector< Type > alpha, data_indicator< vector< Type >, Type > keep, int do_osa, int give_log)
Keep-aware Dirichlet-multinomial log-density via conditional beta-binomials.
Type dmultinom_osa(vector< Type > x, vector< Type > p, data_indicator< vector< Type >, Type > keep, int do_osa, int give_log, int do_cdf=0)
Keep-aware multinomial log-density via conditional binomials.
Type linkage_log_prior(int family, Type value, bool value_is_log, Type p1, Type p2, Type bias_adjust_proc)
Log density of a linkage prior on the natural scale.
void fold_comp_tails(vector< Type > &obs, vector< Type > &hat, int &n_comp, int nbins_blk, int nblk, int yng, int old)
Composition tail accumulation (AFSC ac_yng / ac_old).
void comp_row_nll(int ll_type, int osa_mode, vector< Type > obs_prop, vector< Type > hat_prop, Type offset, Type n_samp, Type weight, Type dm_theta, vector< Type > &obsvec, data_indicator< vector< Type >, Type > &keep, int osa_start, const char *type_name, Type &nll, Type &unweighted_nll)
Negative log-likelihood of one composition row: an age or length composition, or one length bin of co...