Repository navigation
dynamite: Bayesian Modeling and Causal Inference for Multivariate Longitudinal Data #554
Description
Date accepted: 2022-12-13
Submitting Author Name: Santtu Tikka
Submitting Author Github Handle: @santikka
Other Package Authors Github handles: @helske
Repository: https://github.com/santikka/dynamite
Version submitted: 0.0.1
Submission type: Stats
Badge grade: gold
Editor: @noamross
Reviewers: @nicholasjclark, @LucyMcGowan
Due date for @LucyMcGowan: 2022-10-20
Archive: TBD
Version accepted: TBD
Language: en
- Paste the full DESCRIPTION file inside a code block below:
Package: dynamite
Title: Bayesian Modeling and Causal Inference for Multivariate
Longitudinal Data
Version: 0.0.1
Authors@R: c(
person("Santtu", "Tikka", , "santtuth@gmail.com", role = c("aut", "cre"),
comment = c(ORCID = "0000-0003-4039-4342")),
person("Jouni", "Helske", , "jouni.helske@iki.fi", role = "aut",
comment = c(ORCID = "0000-0001-7130-793X"))
)
Description: Easy-to-use and efficient interface for
Bayesian inference of complex panel (time series) data. The package supports
joint modeling of multiple measurements per individual, time-varying and
time-invariant effects, and a wide range of discrete and
continuous distributions. Estimation of the models is carried out via 'Stan'.
License: GPL (>= 3)
URL: https://github.com/santikka/dynamite
BugReports: https://github.com/santikka/dynamite/issues
Depends:
R (>= 4.1.0)
Imports:
bayesplot,
checkmate,
cli,
data.table (>= 1.14.3),
dplyr,
glue,
ggplot2,
MASS,
posterior,
rlang,
rstan (>= 2.26.11),
stats,
tidyr,
utils
Suggests:
covr,
knitr,
plm,
rmarkdown,
testthat (>= 3.0.0)
VignetteBuilder:
knitr
Config/testthat/edition: 3
Encoding: UTF-8
Roxygen: list(markdown = TRUE, roclets = c ("namespace", "rd",
"srr::srr_stats_roclet"))
RoxygenNote: 7.2.1
LazyData: true
LazyDataCompression: xz
Pre-submission Inquiry
- A pre-submission inquiry has been approved in issue #552
General Information
- Who is the target audience and what are scientific applications of this package?
The package is mainly intended for applied researchers working with complex panel data.
Panel data is common in many scientific fields, especially in sociology and econometrics. For example, analysing individual-level life-course data is valuable for assessing the effects of policy reforms and other interventions.
- Paste your responses to our General Standard G1.1 here, describing whether your software is:
The dynamite R package provides easy-to-use interface for Bayesian inference of complex panel (time series) data comprising of multiple measurements per multiple individuals measured in time. The main features distinguishing the package and the underlying methodology from many other approaches are:
- Support for both time-invariant and time-varying effects modeled via B-splines.
- Joint modeling of multiple measurements per individual (multiple channels) based directly on the assumed data generating process.
- Support for non-Gaussian observations: Currently Gaussian, Categorical, Poisson, Bernoulli, Binomial, Negative Binomial, Gamma, Exponential, and Beta distributions are available and these can be mixed arbitrarily in multichannel models.
- Allows evaluating realistic long-term counterfactual predictions which take into account the dynamic structure of the model by posterior predictive distribution simulation.
- Transparent quantification of parameter and predictive uncertainty due to a fully Bayesian approach.
- User-friendly and efficient R interface with state-of-the-art estimation via Stan.
There are several R packages in CRAN focusing on panel data analysis including but not limited to:
plmfor linear panel data models.fixestfor fixed effects and different distributions of response variables (based onstats::family).panelrfor "within-between" models which combine fixed effect and random effect models.lavaanfor general structural equation modelling, and thus can be used to estimate various panel data models such as cross-lagged panel models with fixed or random intercepts.
However, to the best of our knowledge, there are no other R packages (or software in general) that support all features of dynamite simultaneously. Thus The first implementation of a novel algorithm seems most applicable.
- (If applicable) Does your package comply with our guidance around Ethics, Data Privacy and Human Subjects Research?
Not applicable.
Badging
- What grade of badge are you aiming for? (bronze, silver, gold)
Gold.
- If aiming for silver or gold, describe which of the four aspects listed in the Guide for Authors chapter the package fulfils (at least one aspect for silver; three for gold)
We designed dynamite from the ground up with the standards in mind and thus we think the package fulfills all four aspects. We have been able to comply with 129 standards with only 42 N/A standards across the "Bayesian and Monte Carlo" and "Regression and Supervised Learning" categories. The package is very general and capable of supporting a wide range of data and model structures as demonstrated by the examples and the package tests. In our opinion, the internal structure of the package is also well motivated and compartmentalized. We have also tried to carefully select the package dependencies and keep them to a minimum.
Technical checks
Confirm each of the following by checking the box.
- I have read the rOpenSci packaging guide.
- I have read the author guide and I expect to maintain this package for at least 2 years or have another maintainer identified.
- I/we have read the Statistical Software Peer Review Guide for Authors.
- I/we have run
autotestchecks on the package, and ensured no tests fail.
autotestreports failures for the following tests:The first six of these report that thetype test_name fn_name parameter parameter_type operation content <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 diagnostic single_char_case get_code time single character upper-case character parameter is case dependent 2 diagnostic single_char_case get_code group single character upper-case character parameter is case dependent 3 diagnostic single_char_case get_data time single character upper-case character parameter is case dependent 4 diagnostic single_char_case get_data group single character upper-case character parameter is case dependent 5 diagnostic single_char_case get_priors time single character upper-case character parameter is case dependent 6 diagnostic single_char_case get_priors group single character upper-case character parameter is case dependent 7 message NA mcmc_diagnostics NA NA normal function call 0 of 400 iterati… 8 message NA mcmc_diagnostics NA NA normal function call 0 of 400 iterati… 9 message NA mcmc_diagnostics NA NA normal function call E-BFMI indicated… 10 message NA mcmc_diagnostics NA NA NA 0 of 400 iterati… 11 message NA mcmc_diagnostics NA NA NA 0 of 400 iterati… 12 message NA mcmc_diagnostics NA NA NA E-BFMI indicated…
timeandgroupparameters of several functions are case dependent. This is by design, as both of these parameters correspond to column names of the input data. While not entirely sure, we believe the remaining failures occur because the functionmcmc_diagnosticproduces messages while not being a print or a summary method, but this is also by design as the function outputs diagnostic messages related to the MCMC runs. The output ofautotestis not very clear on this matter, as all columns are just filled withNAvalues. - The
srr_stats_pre_submit()function confirms this package may be submitted. - The
pkgcheck()function confirms this package may be submitted - alternatively, please explain reasons for any checks which your package is unable to pass.
This package:
- does not violate the Terms of Service of any service it interacts with.
- has a CRAN and OSI accepted license.
- contains a README with instructions for installing the development version.
Publication options
- Do you intend for this package to go on CRAN?
- Do you intend for this package to go on Bioconductor?
Code of conduct
- I agree to abide by rOpenSci's Code of Conduct during the review process and in maintaining my package should it be accepted.
Activity
ropensci-review-bot commentedon Aug 18, 2022
Thanks for submitting to rOpenSci, our editors and @ropensci-review-bot will reply soon. Type
@ropensci-review-bot helpfor help.ropensci-review-bot commentedon Aug 18, 2022
🚀
Editor check started
👋
ropensci-review-bot commentedon Aug 18, 2022
Oops, something went wrong with our automatic package checks. Our developers have been notified and package checks will appear here as soon as we've resolved the issue. Sorry for any inconvenience.
mpadge commentedon Aug 23, 2022
@ropensci-review-bot check package
ropensci-review-bot commentedon Aug 23, 2022
Thanks, about to send the query.
ropensci-review-bot commentedon Aug 23, 2022
🚀
Editor check started
👋
ropensci-review-bot commentedon Aug 23, 2022
Checks for dynamite (v0.0.1)
git hash: a8d932ca
Important: All failing checks above must be addressed prior to proceeding
Package License: GPL (>= 3)
1. rOpenSci Statistical Standards (
srrpackage)This package is in the following category:
✔️ All applicable standards [v0.1.0] have been documented in this package (129 complied with; 42 N/A standards)
Click to see the report of author-reported standards compliance of the package with links to associated lines of code, which can be re-generated locally by running the
srr_report()function from within a local clone of the repository.2. Package Dependencies
Details of Package Dependency Usage (click to open)
The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.
Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.
base
c (108), list (96), length (69), paste0 (66), args (53), for (47), attr (44), data.frame (39), as.list (32), match.call (32), rep (31), seq_len (25), unique (25), do.call (22), character (19), which (18), vapply (17), is.na (16), names (16), logical (15), seq_along (15), drop (13), by (12), deparse1 (11), is.null (10), mean (10), nzchar (10), all (9), apply (9), debug (9), lapply (9), parent.frame (9), as.integer (7), integer (7), rank (7), seq.int (7), sort (6), unlist (6), array (5), assign (5), colnames (5), dim (5), log (5), message (5), mode (5), nrow (5), try (5), vector (5), as.numeric (4), call (4), diff (4), eval (4), gsub (4), as.data.frame (3), cbind (3), I (3), identical (3), setdiff (3), sub (3), sum (3), any (2), aperm (2), expand.grid (2), levels (2), max (2), ncol (2), seq (2), structure (2), suppressWarnings (2), t (2), beta (1), class (1), det (1), diag (1), duplicated (1), get (1), gl (1), gregexec (1), ifelse (1), intersect (1), is.factor (1), is.finite (1), match (1), min (1), new.env (1), numeric (1), parse (1), paste (1), prod (1), range (1), regmatches (1), replace (1), replicate (1), row.names (1), sample (1), sample.int (1), signif (1), strsplit (1), substitute (1), typeof (1), union (1), warning (1), which.max (1), which.min (1), with (1)
dynamite
ifelse_ (84), paste_rows (41), get_responses (17), data_lines_default (10), get_predictors (10), onlyif (10), model_lines_default (9), warning_ (9), prepare_channel_default (8), formula_rhs (6), get_quoted (5), as.data.frame.dynamitefit (4), get_families (4), has_past (4), coef.dynamitefit (3), evaluate_specials (3), get_formulas (3), assign_deterministic (2), complete_lags (2), create_blocks (2), cs (2), default_priors (2), default_priors_categorical (2), deterministic_response (2), extract_lags (2), extract_nonlags (2), find_lags (2), formula_lhs (2), formula_past (2), formula_terms (2), full_model.matrix (2), full_model.matrix_predict (2), get_originals (2), get_terms (2), indenter_ (2), join_dynamiteformulas (2), lag_ (2), parse_global_lags (2), parse_lags (2), parse_new_lags (2), parse_singleton_lags (2), prepare_eval_envs (2), prepare_lagged_response (2), stop_ (2), which_deterministic (2), which_stochastic (2), abort_factor (1), abort_negative (1), abort_nonunit (1), add_dynamiteformula (1), as_data_frame_alpha (1), as_data_frame_beta (1), as_data_frame_corr_nu (1), as_data_frame_default (1), as_data_frame_delta (1), as_data_frame_lambda (1), as_data_frame_nu (1), as_data_frame_omega (1), as_data_frame_omega_alpha (1), as_data_frame_phi (1), as_data_frame_sigma (1), as_data_frame_sigma_nu (1), as_data_frame_tau (1), as_data_frame_tau_alpha (1), as_draws_df.dynamitefit (1), as_draws.dynamitefit (1), assign_initial_values (1), assign_lags (1), assign_lags_init (1), aux (1), check_ndraws (1), check_newdata (1), check_priors (1), clear_nonfixed (1), confint.dynamitefit (1), create_blocks.default (1), create_data (1), create_functions (1), create_generated_quantities (1), create_model (1), create_parameters (1), create_transformed_data (1), create_transformed_parameters (1), data_lines_bernoulli (1), data_lines_beta (1), data_lines_binomial (1), data_lines_categorical (1), data_lines_exponential (1), data_lines_gamma (1), data_lines_gaussian (1), data_lines_negbin (1), data_lines_poisson (1), drop_terms (1), drop_unused (1), dynamite (1), dynamitechannel (1), dynamitefamily (1), dynamiteformula (1), dynamiteformula_ (1), evaluate_deterministic (1), fill_time (1), fill_time_predict (1), fitted.dynamitefit (1), formula_specials (1), formula.dynamitefit (1), generate_random_intercept (1), generate_sim_call (1), get_code (1), get_code.dynamitefit (1), get_code.dynamiteformula (1), get_data (1), get_data.dynamitefit (1), get_data.dynamiteformula (1), get_priors (1), get_priors.dynamitefit (1), get_priors.dynamiteformula (1), get_special_term_indices (1), impute_newdata (1), increment_formula (1), initialize_deterministic (1), is_supported (1), is.dynamitefamily (1), is.dynamitefit (1), is.dynamiteformula (1), lags (1), lines_wrap (1), locf (1), mcmc_diagnostics (1), mcmc_diagnostics.dynamitefit (1), message_ (1), model_lines_bernoulli (1), model_lines_beta (1), model_lines_binomial (1), model_lines_categorical (1), model_lines_exponential (1), model_lines_gamma (1), model_lines_gaussian (1), model_lines_negbin (1), model_lines_poisson (1), ndraws.dynamitefit (1), nobs.dynamitefit (1), parameters_lines_bernoulli (1), parameters_lines_beta (1), parameters_lines_binomial (1), parameters_lines_categorical (1), parameters_lines_default (1), parameters_lines_exponential (1), parameters_lines_gamma (1), parameters_lines_gaussian (1), parameters_lines_negbin (1), parameters_lines_poisson (1), parse_data (1), parse_newdata (1), parse_past (1), parse_present_lags (1), plot_betas (1), plot_deltas (1), plot_nus (1), plot.dynamitefit (1), predict_dynamitefit (1), predict.dynamitefit (1), prepare_channel_bernoulli (1), prepare_channel_beta (1), prepare_channel_binomial (1), prepare_channel_categorical (1), prepare_channel_exponential (1), prepare_channel_gamma (1), prepare_channel_gaussian (1), prepare_channel_negbin (1), prepare_channel_poisson (1), prepare_common_priors (1), prepare_prior (1), prepare_splines (1), prepare_stan_input (1), values (1), verify_lag (1)
utils
data (79), capture.output (1), combn (1)
stats
formula (21), var (7), df (5), sd (4), D (3), model.matrix.lm (3), na.action (3), na.pass (3), offset (3), complete.cases (2), setNames (2), terms (2), sigma (1)
dplyr
bind_rows (12), filter (7), mutate (3), summarise (3), left_join (2), matches (1), n (1)
graphics
mtext (10), title (9), pairs (2)
rlang
caller_env (16)
checkmate
test_character (3), test_flag (3), test_string (3), test_int (2)
glue
glue (11)
cli
cli_abort (2), qty (2), cli_inform (1), cli_warn (1)
ggplot2
labs (3), position_dodge (1)
posterior
summarise_draws (2), as_draws (1), ndraws (1)
tidyr
expand_grid (2), full_seq (1), unnest (1)
methods
is (2), new (1)
rstan
extract (2), check_hmc_diagnostics (1)
data.table
setDT (1), setkeyv (1)
bayesplot
mcmc_combo (1)
NOTE: Some imported packages appear to have no associated function calls; please ensure with author that these 'Imports' are listed appropriately.
3. Statistical Properties
This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.
Details of statistical properties (click to open)
The package has:
Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:
loc= "Lines of Code"fn= "function"exp/not_exp= exported / not exportedAll parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the
checks_to_markdown()functionThe final measure (
fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.3a. Network visualisation
Click to see the interactive network visualisation of calls between objects in package
4.
goodpracticeand other checksDetails of goodpractice checks (click to open)
3a. Continuous Integration Badges
GitHub Workflow Results
3b.
goodpracticeresultsR CMD checkwith rcmdcheckR CMD check generated the following note:
installed size is 11.1Mb
sub-directories of 1Mb or more:
data 7.2Mb
doc 1.0Mb
R 2.5Mb
R CMD check generated the following check_fail:
Test coverage with covr
Package coverage: 97.82
Cyclocomplexity with cyclocomp
No functions have cyclocomplexity >= 15
Static code analyses with lintr
lintr found the following 6 potential issues:
5. Other Checks
Details of other checks (click to open)
✖️ The following 10 function names are duplicated in other packages:
auxfrom seewaveget_codefrom norgeo, rmonad, xposeget_datafrom canvasXpress.data, cbsodataR, cimir, completejourney, CVXR, danstat, deckgl, ecb, finnishgrid, ggPMX, ggvis, hydroscoper, insight, jtools, mapbayr, metacoder, missCompare, optimall, qrmtools, r4googleads, radiant.data, radous, rbedrock, rchallenge, rsimsum, SWIM, swissparl, tidyLPA, tidySEM, trending, tsmp, ugatsdb, xposeget_priorsfrom CausalQueries, insightlagsfrom smooth, tis, TTRmcmc_diagnosticsfrom bpr, rater, rnmamodobsfrom metacoder, observerplot_deltasfrom sprucerandomfrom CoOL, decisionSupport, distributions3, gam, gamlss, ggdmc, lidR, messydates, simr, sodiumsplinesfrom rpatrecPackage Versions
Editor-in-Chief Instructions:
Processing may not proceed until the items marked with ✖️ have been resolved.
mpadge commentedon Aug 23, 2022
@santikka Thank you for your help debugging and improving our check system. Sorry the checks took so long to appear here.
@adamhsparks Please ignore the failing checks. The duplicated names check will soon be downgraded from a fail to a note. The other check is brand new. @santikka Feel free to modify your repo to describe return values, but do so at your own leisure, and consider all checks as passing for now. Thanks for all the help!
santikka commentedon Aug 23, 2022
@mpadge No worries, glad to help! I will add the missing return values soon.
santikka commentedon Aug 24, 2022
@mpadge About the return values: the system does not seem to recognize function aliases. For example in the above,
obsandauxare aliases ofdynamiteformulaand thus have the same return value implicitly. If I explicitly add the return tag to these aliases as well, the resulting documentation looks rather silly with regards to the output value:adamhsparks commentedon Aug 25, 2022
@ropensci-review-bot assign @noamross as editor
ropensci-review-bot commentedon Aug 25, 2022
Assigned! @noamross is now the editor
31 remaining items
noamross commentedon Dec 9, 2022
Thank you all for bearing with us and following up! @LucyMcGowan and @nicholasjclark, you seem to have indicated in your follow-ups, but to be unambiguous, do the updates resolve any outstanding issues for acceptance at gold level?
LucyMcGowan commentedon Dec 9, 2022
Yes, I approve acceptance at the gold level. Thanks @noamross!
nicholasjclark commentedon Dec 13, 2022
Yes I approve acceptance as well. Thanks very much
noamross commentedon Dec 13, 2022
@ropensci-review-bot approve dynamite
ropensci-review-bot commentedon Dec 13, 2022
Approved! Thanks @santikka for submitting and @nicholasjclark, @LucyMcGowan for your reviews! 😁
To-dos:
This invitation will expire after one week. If it happens write a comment
@ropensci-review-bot invite me to ropensci/<package-name>which will re-send an invitation.@ropensci-review-bot finalize transfer of <package-name>where<package-name>is the repo/package name. This will give you admin access back.pkgdownwebsite and are ok relying only on rOpenSci central docs building and branding,pkgdownwebsite with a redirecting pagehttps://docs.ropensci.org/package_nameURLfield alongside the link to the GitHub repository, e.g.:URL: https://docs.ropensci.org/foobar, https://github.com/ropensci/foobarcodemetar::write_codemeta()in the root of your package.install.packages("<package-name>", repos = "https://ropensci.r-universe.dev")thanks to R-universe.Should you want to acknowledge your reviewers in your package DESCRIPTION, you can do so by making them
"rev"-type contributors in theAuthors@Rfield (with their consent).Welcome aboard! We'd love to host a post about your package - either a short introduction to it with an example for a technical audience or a longer post with some narrative about its development or something you learned, and an example of its use for a broader readership. If you are interested, consult the blog guide, and tag @ropensci/blog-editors in your reply. They will get in touch about timing and can answer any questions.
We maintain an online book with our best practice and tips, this chapter starts the 3d section that's about guidance for after onboarding (with advice on releases, package marketing, GitHub grooming); the guide also feature CRAN gotchas. Please tell us what could be improved.
Last but not least, you can volunteer as a reviewer via filling a short form.
santikka commentedon Dec 14, 2022
@ropensci-review-bot finalize transfer of dynamite
ropensci-review-bot commentedon Dec 14, 2022
Transfer completed.
The
dynamiteteam is now owner of the repository and the author has been invited to the team