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
LS0tCnRpdGxlOiAiUm9hZG1hcCB0byBSZXByb2R1Y2liaWxpdHkiCnBhZ2V0aXRsZTogIlJvYWRtYXAgdG8gUmVwcm9kdWNpYmlsaXR5IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZm9sZGluZzogc2hvdyAjIGFsbG93cyB0b2dnbGluZyBvZiBzaG93aW5nIGFuZCBoaWRpbmcgY29kZS4gUmVtb3ZlIGlmIG5vdCB1c2luZyBjb2RlLgogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAjIGFsbG93cyB0aGUgdXNlciB0byBkb3dubG9hZCB0aGUgc291cmNlIC5SbWQgZmlsZS4gUmVtb3ZlIGlmIG5vdCB1c2luZyBjb2RlLgogICAgaW5jbHVkZXM6CiAgICAgIGFmdGVyX2JvZHk6IGZvb3Rlci5odG1sICMgaW5jbHVkZSBhIGN1c3RvbSBmb290ZXIuCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCmRhdGU6ICIyMDI1LTAyLTI4IgotLS0KCiMjIEEgUm9hZG1hcCB0byAoQ29tcHV0YXRpb25hbCkgUmVwcm9kdWNpYmlsaXR5CgpPbmNlIGRhdGEgYXJlIGNvbGxlY3RlZC4uLgoKOjo6bWQtdGFibGUKfCBDb25jZXB0IHwgUmVhc29uIHwKfCA6LS0tIHwgOi0tLSB8CnwgRG8gbm90IHVzZSBhIEdVSSwgdXNlIGEgc2NyaXB0LiB8IEEgc2NyaXB0IGNhbiBiZSByZXJ1bi4gfAp8IFVzZSBhbiBJREUgdGhhdCBzdXBwb3J0cyBwcm9qZWN0cywgZW5zdXJpbmcgdGhhdCByZWZlcmVuY2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCB3b3JraW5nIGRpcmVjdG9yeS4gfCBUaGUgc2NyaXB0IGNhbiBiZSBwb3J0ZWQgdG8gYW5vdGhlciBtYWNoaW5lLiB8CnwgRG8gbm90IG92ZXJ3cml0ZSB2YXJpYWJsZXMsIGdlbmVyYXRlIGEgbmV3LCBkZXJpdmVkIHZhcmlhYmxlLiB8IEFsbG93cyB5b3UgdG8gdHJhY2UgZXJyb3JzLiB8CnwgVXNlIHZlcnNpb24gY29udHJvbC4gfCBUcmFjayBjaGFuZ2VzIG92ZXIgdGltZSBmb3Igd29ya2Zsb3cgdHJhbnNwYXJlbmN5LiB8CnwgTWFpbnRhaW4gRG9jdW1lbnRhdGlvbi4gfCBLZWVwIGEgcmVjb3JkIG9mIHRhY2l0IGtub3dsZWRnZS4gfAp8IFVzZSBhIGxhbmd1YWdlIGFuZCBhcHByb2FjaCB0aGF0IHN1cHBvcnRzIGxpdGVyYXRlIHByb2dyYW1taW5nLjxzdXA+MTwvc3VwPiB8IE1ha2UgeW91ciBjb2RlIGludGVsbGlnaWJsZSB0byBvdGhlcnMuIHwKfCBNYW5hZ2UgeW91ciBjb2RlIHRvOiBhKSBzZXBhcmF0ZSBleHBsb3JhdG9yeSBhbmQgY29uZmlybWF0b3J5IGFuYWx5c2VzICh1c2Ugbm90ZWJvb2tzLCBsaWtlIFJNYXJrZG93bik7IGIpIG1heGltaXplIHJldXNlICh1c2Ugc2NyaXB0cyBmb3IgZnJlcXVlbnRseSByZXVzZWQgY29kZSk7IGFuZCBjKSBsaW1pdCBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgb2JqZWN0cyAoZnVuY3Rpb25hbCBwcm9ncmFtbWluZykuIHwgTWFpbnRhaW4gY2xlYXIgZGVsaW5lYXRpb25zIGJldHdlZW4gaW5zdHJ1Y3Rpb25zIGFuZCBvdXRwdXRzIChmdW5jdGlvbmFsIHByb2dyYW1taW5nKSwgbWluaW1pemUgbWlzdGFrZXMgLyBlcnJvcnMgKGNvZGUgcmV1c2UpLCBzZXBhcmF0ZSBoeXBvdGhlc2lzIGdlbmVyYXRpb24gZnJvbSBoeXBvdGhlc2lzIHRlc3RpbmcgKG5vdGVib29rZXMpLiB8CnwgVXNlIG9wZW4gZmlsZSBmb3JtYXRzIGFuZCB3aGVuIHBvc3NpYmxlIG9uZXMgdGhhdCBoYXZlIGZvcm1hbCBzdGFuZGFyZHMuIHwgTWF4aW1pemUgcGVyc2lzdGVuY2UgaW4gdGltZSBhbmQgcG9ydGFiaWxpdHkgYWNyb3NzIHNvZnR3YXJlIGFuZCBoYXJkd2FyZS4gfAp8IERvY3VtZW50IHlvdXI6IGEpIE9wZXJhdGluZyBTeXN0ZW0gYW5kIHZlcnNpb247IGIpIFByb2dyYW0gYW5kIHZlcnNpb247IGMpIEV4dGVybmFsIHBhY2thZ2VzIGFuZCB2ZXJzaW9uLiB8IFByb3ZpZGUgYSByZXBsaWNhYmxlIGNvbXB1dGF0aW9uYWwgZnJhbWV3b3JrLiB8CnwgRmluZCBhIHdheSB0byBhY2NvdW50IGZvciBkZXBlbmRlbmNpZXMgLSB0aGVzZSBtYXkgYmUgbGFuZ3VhZ2Ugc3BlY2lmaWMsIG9wZXJhdGluZyBzcGVjaWZpYywgaGFyZHdhcmUgc3BlY2lmaWMuPHN1cD4yPC9zdXA+IHwgUHJvdmlkZSBhICJwYWNrYWdlIiB0aGF0IGlzIGEgcmVwbGljYWJsZSBmcmFtZXdvcmsuIHwKOjo6Cgo8YnIgLz4KPGhyIC8+CjxiciAvPgoKPHN1cD4xPC9zdXA+ICAKIkluc3RlYWQgb2YgaW1hZ2luaW5nIHRoYXQgb3VyIG1haW4gdGFzayBpcyB0byBpbnN0cnVjdCBhIGNvbXB1dGVyIHdoYXQgdG8gZG8sIGxldCB1cyBjb25jZW50cmF0ZSByYXRoZXIgb24gZXhwbGFpbmluZyB0byBodW1hbiBiZWluZ3Mgd2hhdCB3ZSB3YW50IGEgY29tcHV0ZXIgdG8gZG8uIgoKPHN1cD4yPC9zdXA+ICAKSG93IHRvIEFjY291bnQgZm9yIERlcGVuZGVuY2llczoKCiogcmVudigpIGZvciBsYW5ndWFnZSBzcGVjaWZpYwoqIGNvbnRhaW5lcnMgZm9yIE9TCiogZW11bGF0b3JzIGZvciBoYXJkd2FyZQoKCg==