Skip to content

Commit c374ce0

Browse files
committed
Amendments to MCMC prior calculations
1 parent 5ce537e commit c374ce0

File tree

2 files changed

+33
-21
lines changed

2 files changed

+33
-21
lines changed

R/mcmc.R

+27-16
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,15 @@
3535
#' If mode_start = 3, shift some non-vaccinated individuals into recovered to give herd immunity (stratified by age)
3636
#' @param prior_settings List containing settings for priors: must contain text named "type":
3737
#' 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
4242
#' norm_params_mean and norm_params_sd (vectors of mean and standard deviation values applied to log FOI/R0
4343
#' parameters and to actual values of additional parameters) \cr
4444
#' + FOI_mean + FOI_sd (mean + standard deviation of computed FOI, single values) \cr
4545
#' + 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)
4647
#' @param dt time increment in days (must be 1 or 5)
4748
#' @param n_reps Number of times to repeat calculations to get average likelihood at each iteration
4849
#' @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
9293

9394
#Run checks on inputs
9495
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}
9697

9798
#MCMC setup
9899
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
203204
#Check values for flat prior
204205
prior_like = 0
205206
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}
207209
}
208210

209-
#Get additional values, calculate normal-distribution prior if relevant
211+
#Get additional values, calculate associated normal-distribution prior values if relevant
210212
if(is.finite(prior_like)){
211213
vaccine_efficacy = p_rep_severe = p_rep_death = m_FOI_Brazil = 1.0
212214
for(var_name in names(consts$add_values)){
@@ -215,16 +217,25 @@ single_posterior_calc <- function(log_params_prop = c(), input_data = list(), ob
215217
value = exp(as.numeric(log_params_prop[i]))
216218
assign(var_name, value)
217219
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]))
220224
}
221225
} else {assign(var_name, consts$add_values[[var_name]])}
222226
}
227+
}
223228

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]))
228239
}
229240
}
230241

@@ -307,9 +318,9 @@ mcmc_checks <- function(log_params_ini = c(), n_regions = 1, prior_settings = li
307318
n_params = length(log_params_ini)
308319
assert_that(is.null(param_names) == FALSE, msg = "Parameters should be named using create_param_labels")
309320
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")
313324
}
314325
if(prior_settings$type == "norm"){
315326
assert_that(length(prior_settings$norm_params_mean) == n_params, msg = "Check prior_settings$norm_params_mean")

man/MCMC.Rd

+6-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)