Skip to content

Commit 8a641ac

Browse files
Standardize code for updating proposal sd.
Simplify recoding for "Collapse" condition.
1 parent 271b1ca commit 8a641ac

File tree

3 files changed

+36
-36
lines changed

3 files changed

+36
-36
lines changed

R/utility_functions.R

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -828,22 +828,13 @@ compare_reformat_data = function(x,
828828
zx = x[, node]
829829
zy = y[, node]
830830

831-
cntr = 0
831+
cntr = -1
832832
for(value in unq_vls) {
833833
#Collapse categories for one group when not observed in the other.
834-
if(!any(zx == value) | !any(zy == value)) {
835-
check = FALSE
836-
if(cntr > 0) {
837-
cntr = cntr - 1
838-
}
839-
} else {
840-
check = TRUE
841-
}
842-
x[zx == value, node] = cntr
843-
y[zy == value, node] = cntr
844-
845-
if(!(check == FALSE & cntr == 0))
834+
if(any(zx == value) & any(zy == value))
846835
cntr = cntr + 1
836+
x[zx == value, node] = max(0, cntr)
837+
y[zy == value, node] = max(0, cntr)
847838
}
848839
} else {
849840
z = x[, node]

src/gibbs_functions.cpp

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -284,14 +284,16 @@ void metropolis_thresholds_blumecapel(NumericMatrix thresholds,
284284
log_prob = std::exp(log_prob);
285285
}
286286

287-
proposal_sd_blumecapel(variable, 0) = proposal_sd_blumecapel(variable, 0) +
287+
double update_proposal_sd = proposal_sd_blumecapel(variable, 0) +
288288
(log_prob - target_ar) * std::exp(-log(t) * phi);
289-
if(proposal_sd_blumecapel(variable, 0) < epsilon_lo) {
290-
proposal_sd_blumecapel(variable, 0) = epsilon_lo;
291-
} else if (proposal_sd_blumecapel(variable, 0) > epsilon_hi) {
292-
proposal_sd_blumecapel(variable, 0) = epsilon_hi;
289+
290+
if(std::isnan(update_proposal_sd) == true) {
291+
update_proposal_sd = 1.0;
293292
}
294293

294+
update_proposal_sd = std::clamp(update_proposal_sd, epsilon_lo, epsilon_hi);
295+
proposal_sd_blumecapel(variable, 0) = update_proposal_sd;
296+
295297
//----------------------------------------------------------------------------
296298
//Adaptive Metropolis for the quadratic Blume-Capel parameter
297299
//----------------------------------------------------------------------------
@@ -363,13 +365,16 @@ void metropolis_thresholds_blumecapel(NumericMatrix thresholds,
363365
log_prob = std::exp(log_prob);
364366
}
365367

366-
proposal_sd_blumecapel(variable, 1) = proposal_sd_blumecapel(variable, 1) +
368+
double update_proposal_sd = proposal_sd_blumecapel(variable, 1) +
367369
(log_prob - target_ar) * std::exp(-log(t) * phi);
368-
if(proposal_sd_blumecapel(variable, 1) < epsilon_lo) {
369-
proposal_sd_blumecapel(variable, 1) = epsilon_lo;
370-
} else if (proposal_sd_blumecapel(variable, 1) > epsilon_hi) {
371-
proposal_sd_blumecapel(variable, 1) = epsilon_hi;
370+
371+
if(std::isnan(update_proposal_sd) == true) {
372+
update_proposal_sd = 1.0;
372373
}
374+
375+
update_proposal_sd = std::clamp(update_proposal_sd, epsilon_lo, epsilon_hi);
376+
proposal_sd_blumecapel(variable, 1) = update_proposal_sd;
377+
373378
}
374379

375380
// ----------------------------------------------------------------------------|
@@ -556,13 +561,17 @@ void metropolis_interactions(NumericMatrix interactions,
556561
} else {
557562
log_prob = std::exp(log_prob);
558563
}
559-
proposal_sd(variable1, variable2) = proposal_sd(variable1, variable2) +
564+
565+
double update_proposal_sd = proposal_sd(variable1, variable2) +
560566
(log_prob - target_ar) * std::exp(-log(t) * phi);
561-
if(proposal_sd(variable1, variable2) < epsilon_lo) {
562-
proposal_sd(variable1, variable2) = epsilon_lo;
563-
} else if (proposal_sd(variable1, variable2) > epsilon_hi) {
564-
proposal_sd(variable1, variable2) = epsilon_hi;
567+
568+
if(std::isnan(update_proposal_sd) == true) {
569+
update_proposal_sd = 1.0;
565570
}
571+
572+
update_proposal_sd = std::clamp(update_proposal_sd, epsilon_lo, epsilon_hi);
573+
proposal_sd(variable1, variable2) = update_proposal_sd;
574+
566575
}
567576
}
568577
}
@@ -809,10 +818,10 @@ List gibbs_sampler(IntegerMatrix observations,
809818
IntegerMatrix index(no_interactions, 3);
810819

811820
//Parameters of adaptive proposals -------------------------------------------
812-
double phi = 0.750;
821+
double phi = 0.75;
813822
double target_ar = 0.234;
814-
double epsilon_lo = 1.0 / no_persons;
815-
double epsilon_hi = 2.000;
823+
double epsilon_lo = 1.0 / static_cast<double>(no_persons);
824+
double epsilon_hi = 2.0;
816825

817826
//The resizing based on ``save'' could probably be prettier ------------------
818827
int nrow = no_variables;

src/gibbs_functions_compare.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2595,13 +2595,13 @@ List compare_gibbs_sampler(IntegerMatrix observations_gr1,
25952595
std::fill(proposal_sd_blumecapel_gr2.begin(), proposal_sd_blumecapel_gr2.end(), 1.0);
25962596

25972597
//Parameters for the Robbins-Monro approach for adaptive Metropolis ----------
2598-
double phi = 0.750;
2599-
double target_ar = 0.234;
2600-
double epsilon_lo = 1.0 / no_persons_gr1;
2598+
double phi = 0.75;
2599+
double target_ar = 0.234;
2600+
double epsilon_lo = 1.0 / static_cast<double>(no_persons_gr1);
26012601
if(no_persons_gr1 > no_persons_gr2) {
2602-
epsilon_lo = 1.0 / no_persons_gr2;
2602+
epsilon_lo = 1.0 / static_cast<double>(no_persons_gr2);
26032603
}
2604-
double epsilon_hi = 2.000;
2604+
double epsilon_hi = 2.0;
26052605

26062606
//Randomized index for the pairwise updates ----------------------------------
26072607
IntegerVector v = seq(0, no_interactions - 1);

0 commit comments

Comments
 (0)