A Roadmap to (Computational) Reproducibility
Once data are collected…
| Do not use a GUI, use a script. |
A script can be rerun. |
| Use an IDE that supports projects, ensuring that
references are relative to the root working directory. |
The script can be ported to another machine. |
| Do not overwrite variables, generate a new, derived
variable. |
Allows you to trace errors. |
| Use version control. |
Track changes over time for workflow transparency. |
| Maintain Documentation. |
Keep a record of tacit knowledge. |
| Use a language and approach that supports literate
programming.1 |
Make your code intelligible to others. |
| Manage your code to: a) separate exploratory and
confirmatory analyses (use notebooks, like RMarkdown); b) maximize reuse
(use scripts for frequently reused code); and c) limit accidentally
overwriting objects (functional programming). |
Maintain clear delineations between instructions and
outputs (functional programming), minimize mistakes / errors (code
reuse), separate hypothesis generation from hypothesis testing
(notebookes). |
| Use open file formats and when possible ones that have
formal standards. |
Maximize persistence in time and portability across
software and hardware. |
| Document your: a) Operating System and version; b)
Program and version; c) External packages and version. |
Provide a replicable computational framework. |
| Find a way to account for dependencies - these may be
language specific, operating specific, hardware
specific.2 |
Provide a “package” that is a replicable
framework. |
1
“Instead of imagining that our main task is to instruct a computer what
to do, let us concentrate rather on explaining to human beings what we
want a computer to do.”
2
How to Account for Dependencies:
- renv() for language specific
- containers for OS
- emulators for hardware
LS0tDQp0aXRsZTogIlJvYWRtYXAgdG8gUmVwcm9kdWNpYmlsaXR5Ig0KcGFnZXRpdGxlOiAiUm9hZG1hcCB0byBSZXByb2R1Y2liaWxpdHkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBzaG93ICMgYWxsb3dzIHRvZ2dsaW5nIG9mIHNob3dpbmcgYW5kIGhpZGluZyBjb2RlLiBSZW1vdmUgaWYgbm90IHVzaW5nIGNvZGUuDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAjIGFsbG93cyB0aGUgdXNlciB0byBkb3dubG9hZCB0aGUgc291cmNlIC5SbWQgZmlsZS4gUmVtb3ZlIGlmIG5vdCB1c2luZyBjb2RlLg0KICAgIGluY2x1ZGVzOg0KICAgICAgYWZ0ZXJfYm9keTogZm9vdGVyLmh0bWwgIyBpbmNsdWRlIGEgY3VzdG9tIGZvb3Rlci4NCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KLS0tDQoNCiMjIEEgUm9hZG1hcCB0byAoQ29tcHV0YXRpb25hbCkgUmVwcm9kdWNpYmlsaXR5DQoNCk9uY2UgZGF0YSBhcmUgY29sbGVjdGVkLi4uDQoNCjo6Om1kLXRhYmxlDQp8IENvbmNlcHQgfCBSZWFzb24gfA0KfCA6LS0tIHwgOi0tLSB8DQp8IERvIG5vdCB1c2UgYSBHVUksIHVzZSBhIHNjcmlwdC4gfCBBIHNjcmlwdCBjYW4gYmUgcmVydW4uIHwNCnwgVXNlIGFuIElERSB0aGF0IHN1cHBvcnRzIHByb2plY3RzLCBlbnN1cmluZyB0aGF0IHJlZmVyZW5jZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IHdvcmtpbmcgZGlyZWN0b3J5LiB8IFRoZSBzY3JpcHQgY2FuIGJlIHBvcnRlZCB0byBhbm90aGVyIG1hY2hpbmUuIHwNCnwgRG8gbm90IG92ZXJ3cml0ZSB2YXJpYWJsZXMsIGdlbmVyYXRlIGEgbmV3LCBkZXJpdmVkIHZhcmlhYmxlLiB8IEFsbG93cyB5b3UgdG8gdHJhY2UgZXJyb3JzLiB8DQp8IFVzZSB2ZXJzaW9uIGNvbnRyb2wuIHwgVHJhY2sgY2hhbmdlcyBvdmVyIHRpbWUgZm9yIHdvcmtmbG93IHRyYW5zcGFyZW5jeS4gfA0KfCBNYWludGFpbiBEb2N1bWVudGF0aW9uLiB8IEtlZXAgYSByZWNvcmQgb2YgdGFjaXQga25vd2xlZGdlLiB8DQp8IFVzZSBhIGxhbmd1YWdlIGFuZCBhcHByb2FjaCB0aGF0IHN1cHBvcnRzIGxpdGVyYXRlIHByb2dyYW1taW5nLjxzdXA+MTwvc3VwPiB8IE1ha2UgeW91ciBjb2RlIGludGVsbGlnaWJsZSB0byBvdGhlcnMuIHwNCnwgTWFuYWdlIHlvdXIgY29kZSB0bzogYSkgc2VwYXJhdGUgZXhwbG9yYXRvcnkgYW5kIGNvbmZpcm1hdG9yeSBhbmFseXNlcyAodXNlIG5vdGVib29rcywgbGlrZSBSTWFya2Rvd24pOyBiKSBtYXhpbWl6ZSByZXVzZSAodXNlIHNjcmlwdHMgZm9yIGZyZXF1ZW50bHkgcmV1c2VkIGNvZGUpOyBhbmQgYykgbGltaXQgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIG9iamVjdHMgKGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcpLiB8IE1haW50YWluIGNsZWFyIGRlbGluZWF0aW9ucyBiZXR3ZWVuIGluc3RydWN0aW9ucyBhbmQgb3V0cHV0cyAoZnVuY3Rpb25hbCBwcm9ncmFtbWluZyksIG1pbmltaXplIG1pc3Rha2VzIC8gZXJyb3JzIChjb2RlIHJldXNlKSwgc2VwYXJhdGUgaHlwb3RoZXNpcyBnZW5lcmF0aW9uIGZyb20gaHlwb3RoZXNpcyB0ZXN0aW5nIChub3RlYm9va2VzKS4gfA0KfCBVc2Ugb3BlbiBmaWxlIGZvcm1hdHMgYW5kIHdoZW4gcG9zc2libGUgb25lcyB0aGF0IGhhdmUgZm9ybWFsIHN0YW5kYXJkcy4gfCBNYXhpbWl6ZSBwZXJzaXN0ZW5jZSBpbiB0aW1lIGFuZCBwb3J0YWJpbGl0eSBhY3Jvc3Mgc29mdHdhcmUgYW5kIGhhcmR3YXJlLiB8DQp8IERvY3VtZW50IHlvdXI6IGEpIE9wZXJhdGluZyBTeXN0ZW0gYW5kIHZlcnNpb247IGIpIFByb2dyYW0gYW5kIHZlcnNpb247IGMpIEV4dGVybmFsIHBhY2thZ2VzIGFuZCB2ZXJzaW9uLiB8IFByb3ZpZGUgYSByZXBsaWNhYmxlIGNvbXB1dGF0aW9uYWwgZnJhbWV3b3JrLiB8DQp8IEZpbmQgYSB3YXkgdG8gYWNjb3VudCBmb3IgZGVwZW5kZW5jaWVzIC0gdGhlc2UgbWF5IGJlIGxhbmd1YWdlIHNwZWNpZmljLCBvcGVyYXRpbmcgc3BlY2lmaWMsIGhhcmR3YXJlIHNwZWNpZmljLjxzdXA+Mjwvc3VwPiB8IFByb3ZpZGUgYSAicGFja2FnZSIgdGhhdCBpcyBhIHJlcGxpY2FibGUgZnJhbWV3b3JrLiB8DQo6OjoNCg0KPGJyIC8+DQo8aHIgLz4NCjxiciAvPg0KDQo8c3VwPjE8L3N1cD4gIA0KIkluc3RlYWQgb2YgaW1hZ2luaW5nIHRoYXQgb3VyIG1haW4gdGFzayBpcyB0byBpbnN0cnVjdCBhIGNvbXB1dGVyIHdoYXQgdG8gZG8sIGxldCB1cyBjb25jZW50cmF0ZSByYXRoZXIgb24gZXhwbGFpbmluZyB0byBodW1hbiBiZWluZ3Mgd2hhdCB3ZSB3YW50IGEgY29tcHV0ZXIgdG8gZG8uIg0KDQo8c3VwPjI8L3N1cD4gIA0KSG93IHRvIEFjY291bnQgZm9yIERlcGVuZGVuY2llczoNCg0KKiByZW52KCkgZm9yIGxhbmd1YWdlIHNwZWNpZmljDQoqIGNvbnRhaW5lcnMgZm9yIE9TDQoqIGVtdWxhdG9ycyBmb3IgaGFyZHdhcmUNCg0KDQo=