35
35
# ' If mode_start = 3, shift some non-vaccinated individuals into recovered to give herd immunity (stratified by age)
36
36
# ' @param prior_settings List containing settings for priors: must contain text named "type":
37
37
# ' If type = "zero", prior probability is always zero \cr
38
- # ' If type = "flat", prior probability is zero if log parameter values in designated ranges log_params_min and log_params_max ,
39
- # ' -Inf otherwise; log_params_min and log_params_max included in prior_settings as vectors of same length as log_params_ini \cr
40
- # ' If type = "norm", prior probability is given by dnorm calculation on parameter values with settings based on vectors of values
41
- # ' in prior_settings: \cr
38
+ # ' If type = "flat", prior probability is zero if log parameter values in designated ranges param_min_limits and param_max_limits ,
39
+ # ' -Inf otherwise; param_min_limits and param_max_limits included in prior_settings as vectors of same length as log_params_ini \cr
40
+ # ' If type = "norm", prior probability is given by truncated normal distribution calculation on parameter values with settings based
41
+ # ' on vectors of values in prior_settings: \cr
42
42
# ' norm_params_mean and norm_params_sd (vectors of mean and standard deviation values applied to log FOI/R0
43
43
# ' parameters and to actual values of additional parameters) \cr
44
44
# ' + FOI_mean + FOI_sd (mean + standard deviation of computed FOI, single values) \cr
45
45
# ' + R0_mean + R0_sd (mean + standard deviation of computed R0, single values) \cr
46
+ # ' + param_min_limits and param_max_limits (lower and upper limits applied to truncated normal distributions)
46
47
# ' @param dt time increment in days (must be 1 or 5)
47
48
# ' @param n_reps Number of times to repeat calculations to get average likelihood at each iteration
48
49
# ' @param enviro_data Data frame of values of environmental covariates (columns) by region (rows)
@@ -92,7 +93,7 @@ MCMC <- function(log_params_ini = c(), input_data = list(), obs_sero_data = NULL
92
93
93
94
# Run checks on inputs
94
95
checks <- mcmc_checks(log_params_ini , n_regions , prior_settings , enviro_data , add_values , extra_estimated_params )
95
- if (prior_settings $ type == " flat" ){names(prior_settings $ log_params_min ) = names(prior_settings $ log_params_max ) = param_names }
96
+ if (prior_settings $ type == " flat" ){names(prior_settings $ param_min_limits ) = names(prior_settings $ param_max_limits ) = param_names }
96
97
97
98
# MCMC setup
98
99
chain = chain_prop = posterior_current = posterior_prop = flag_accept = chain_cov_all = NULL
@@ -203,10 +204,11 @@ single_posterior_calc <- function(log_params_prop = c(), input_data = list(), ob
203
204
# Check values for flat prior
204
205
prior_like = 0
205
206
if (consts $ prior_settings $ type == " flat" ){
206
- if (any(log_params_prop < consts $ prior_settings $ log_params_min ) || any(log_params_prop > consts $ prior_settings $ log_params_max )){prior_like = - Inf }
207
+ if (any(log_params_prop < consts $ prior_settings $ param_min_limits ) || any(log_params_prop > consts $ prior_settings $ param_max_limits )){
208
+ prior_like = - Inf }
207
209
}
208
210
209
- # Get additional values, calculate normal-distribution prior if relevant
211
+ # Get additional values, calculate associated normal-distribution prior values if relevant
210
212
if (is.finite(prior_like )){
211
213
vaccine_efficacy = p_rep_severe = p_rep_death = m_FOI_Brazil = 1.0
212
214
for (var_name in names(consts $ add_values )){
@@ -215,16 +217,25 @@ single_posterior_calc <- function(log_params_prop = c(), input_data = list(), ob
215
217
value = exp(as.numeric(log_params_prop [i ]))
216
218
assign(var_name , value )
217
219
if (consts $ prior_settings $ type == " norm" ){
218
- prior_like = log(dtrunc(value , " norm" , a = 1.0e-3 , b = 1 , mean = consts $ prior_settings $ norm_params_mean [i ],
219
- sd = consts $ prior_settings $ norm_params_sd [i ]))
220
+ prior_like = prior_like + log(dtrunc(value , " norm" , a = consts $ prior_settings $ param_min_limits [i ],
221
+ b = consts $ prior_settings $ param_max_limits [i ],
222
+ mean = consts $ prior_settings $ norm_params_mean [i ],
223
+ sd = consts $ prior_settings $ norm_params_sd [i ]))
220
224
}
221
225
} else {assign(var_name , consts $ add_values [[var_name ]])}
222
226
}
227
+ }
223
228
224
- if (consts $ prior_settings $ type == " norm" ){
225
- values = c(1 : (2 * (ncol(consts $ enviro_data )- 1 )))
226
- prior_like = prior_like + sum(dnorm(log_params_prop [values ], mean = consts $ prior_settings $ norm_params_mean [values ],
227
- sd = consts $ prior_settings $ norm_params_sd [values ], log = TRUE ))
229
+ # If prior is finite so far, get normal-distribution prior values for environmental coefficients if relevant
230
+ if (is.finite(prior_like ) && consts $ prior_settings $ type == " norm" ){
231
+ # values=c(1:(2*(ncol(consts$enviro_data)-1)))
232
+ # prior_like = prior_like + sum(dnorm(log_params_prop[values], mean = consts$prior_settings$norm_params_mean[values],
233
+ # sd = consts$prior_settings$norm_params_sd[values], log = TRUE))
234
+ for (i in c(1 : (2 * (ncol(consts $ enviro_data )- 1 )))){
235
+ prior_like = prior_like + log(dtrunc(log_params_prop [i ], " norm" , a = consts $ prior_settings $ param_min_limits [i ],
236
+ b = consts $ prior_settings $ param_max_limits [i ],
237
+ mean = consts $ prior_settings $ norm_params_mean [i ],
238
+ sd = consts $ prior_settings $ norm_params_sd [i ]))
228
239
}
229
240
}
230
241
@@ -307,9 +318,9 @@ mcmc_checks <- function(log_params_ini = c(), n_regions = 1, prior_settings = li
307
318
n_params = length(log_params_ini )
308
319
assert_that(is.null(param_names ) == FALSE , msg = " Parameters should be named using create_param_labels" )
309
320
assert_that(prior_settings $ type %in% c(" zero" , " flat" , " norm" ), msg = " Prior settings type must be 'zero', 'flat' or 'norm'" )
310
- if (prior_settings $ type == " flat" ){
311
- assert_that(length(prior_settings $ log_params_min ) == n_params , msg = " Check prior_settings$log_params_min " )
312
- assert_that(length(prior_settings $ log_params_max ) == n_params , msg = " Check prior_settings$log_params_max " )
321
+ if (prior_settings $ type %in% c( " flat" , " norm " ) ){
322
+ assert_that(length(prior_settings $ param_min_limits ) == n_params , msg = " Check prior_settings$param_min_limits " )
323
+ assert_that(length(prior_settings $ param_max_limits ) == n_params , msg = " Check prior_settings$param_max_limits " )
313
324
}
314
325
if (prior_settings $ type == " norm" ){
315
326
assert_that(length(prior_settings $ norm_params_mean ) == n_params , msg = " Check prior_settings$norm_params_mean" )
0 commit comments