Integrate draws provided by the user into Apollo
Posted: 11 May 2022, 09:03
Dear Stephane and David,
I wondered if it is possible to provide Apollo with draws that the user created. I need a fully-antithetic draws (Andersen, 2014) for a project, and I have written an R function (see below) for that, but I am not sure if it is possible to provide Apollo with it. At the moment, I am using the R package mixl (Molloy, Becker, Schmid & Axhausen, 2021) which allows the user to provide a matrix with draws, but I would like to port my code into Apollo.
Additionally, I am aware of the "antithetic" option available in Apollo. However, as far as I understood the source code of the apollo_makeDraws function it is only one-dimensional antithetic, and not fully antithetic (meaning using all the possible 2^{n-1} combinations, where n is the number of dimensions of the integration.)
Here is the R function I mentioned earlier:
Thank you for your time!
References
I wondered if it is possible to provide Apollo with draws that the user created. I need a fully-antithetic draws (Andersen, 2014) for a project, and I have written an R function (see below) for that, but I am not sure if it is possible to provide Apollo with it. At the moment, I am using the R package mixl (Molloy, Becker, Schmid & Axhausen, 2021) which allows the user to provide a matrix with draws, but I would like to port my code into Apollo.
Additionally, I am aware of the "antithetic" option available in Apollo. However, as far as I understood the source code of the apollo_makeDraws function it is only one-dimensional antithetic, and not fully antithetic (meaning using all the possible 2^{n-1} combinations, where n is the number of dimensions of the integration.)
Here is the R function I mentioned earlier:
Code: Select all
create_antithetic_sobol_draws <- function(Nindividuals, nDraws, draw_dimensions,scrambling=3){
## Uniform scramble Sobol draws
uniform_sobol_draws <- as.matrix(randtoolbox::sobol(
n = Nindividuals * nDraws,
scrambling = scrambling, #3 = sobolowenfauretezuka scrambling
dim = draw_dimensions,
normal = FALSE))
## Antithetic expansion
anthi_draw <- do.call(
rbind,
apply(X = uniform_sobol_draws,
MARGIN = 1,
FUN = function(x) {
expand.grid(
data.frame(rbind(x, 1 - x)))})
)
## as matrix
anthi_draw_matrix <- as.matrix(anthi_draw)
## transform into standard normal distribution draws
normal_anthitetic_scramble_sobol_draws <- stats::qnorm(anthi_draw_matrix)
## drop useless colnames
colnames(normal_anthitetic_scramble_sobol_draws) <- NULL
# count the total number of draws
N_final_draws<- nrow(normal_anthitetic_scramble_sobol_draws)/Nindividuals
cat(N_final_draws, "antithetic draws generated from the original", "\n",
nDraws, "draws for",
Nindividuals," individuals expanded using",
draw_dimensions,"dimensions","\n" )
return(normal_anthitetic_scramble_sobol_draws)
}
References
- Andersen, L. M. (2014). Obtaining reliable likelihood ratio tests from simulated likelihood functions. PloS one, 9(10), e106136.
- Molloy, J., Becker, F., Schmid, B., & Axhausen, K. W. (2021). mixl: An open-source R package for estimating complex choice models on large datasets. Journal of choice modelling, 39, 100284.