Compute all relevant test statistics, parameter estimates, detection rates, and so on.
This is the computational heavy lifting portion of the Monte Carlo simulation. Users
may define a single Analysis function to perform all the analyses in the same function environment,
or may define a list of named functions to runSimulation to allow for a more
modularized approach to performing the analyses in independent blocks (but that share the same generated
data). Note that if a suitable Generate function was not supplied then this function
can be used to be generate and analyse the Monte Carlo data (though in general this
setup is not recommended for larger simulations).
Analyse(condition, dat, fixed_objects)a single row from the design input (as a data.frame), indicating the
simulation conditions
the dat object returned from the Generate function
(usually a data.frame, matrix, vector, or list)
object passed down from runSimulation
returns a named numeric vector or data.frame with the values of interest
(e.g., p-values, effects sizes, etc), or a list containing values of interest
(e.g., separate matrix and vector of parameter estimates corresponding to elements in
parameters). If a data.frame is returned with more than 1 row then these
objects will be wrapped into suitable list objects
In some cases, it may be easier to change the output to a named list containing
different parameter configurations (e.g., when
determining RMSE values for a large set of population parameters).
The use of try functions is generally not required in this function because Analyse
is internally wrapped in a try call. Therefore, if a function stops early
then this will cause the function to halt internally, the message which triggered the stop
will be recorded, and Generate will be called again to obtain a different dataset.
That said, it may be useful for users to throw their own stop commands if the data
should be re-drawn for other reasons (e.g., an estimated model terminated correctly
but the maximum number of iterations were reached).
Chalmers, R. P., & Adkins, M. C. (2020). Writing Effective and Reliable Monte Carlo Simulations
with the SimDesign Package. The Quantitative Methods for Psychology, 16(4), 248-280.
doi:10.20982/tqmp.16.4.p248
Sigal, M. J., & Chalmers, R. P. (2016). Play it again: Teaching statistics with Monte
Carlo simulation. Journal of Statistics Education, 24(3), 136-156.
doi:10.1080/10691898.2016.1246953
if (FALSE) { # \dontrun{
analyse <- function(condition, dat, fixed_objects) {
# require packages/define functions if needed, or better yet index with the :: operator
require(stats)
mygreatfunction <- function(x) print('Do some stuff')
#wrap computational statistics in try() statements to control estimation problems
welch <- t.test(DV ~ group, dat)
ind <- stats::t.test(DV ~ group, dat, var.equal=TRUE)
# In this function the p values for the t-tests are returned,
# and make sure to name each element, for future reference
ret <- c(welch = welch$p.value,
independent = ind$p.value)
return(ret)
}
# A more modularized example approach
analysis_welch <- function(condition, dat, fixed_objects) {
welch <- t.test(DV ~ group, dat)
ret <- c(p=welch$p.value)
ret
}
analysis_ind <- function(condition, dat, fixed_objects) {
ind <- t.test(DV ~ group, dat, var.equal=TRUE)
ret <- c(p=ind$p.value)
ret
}
# pass functions as a named list
# runSimulation(..., analyse=list(welch=analyse_welch, independent=analysis_ind))
} # }