Reproducible research workflows

talk
r
python
Slides from a talk at AMS Institute on research workflows: project organization, version control, dependency management, and literate programming
Author
Talk given

January 29, 2026

I gave my talk at the AMS Institute to research fellows at our all-hands meeting.

My old workflow went like this. I wrote in Word, copied summary stats out of Excel, and made regressions and figures in Stata or QGIS, then pasted them in by hand. Then, say, I want to change one threshold, and I have to answer: How did I clean the data? How did I make that figure? How many things do I need to update? Meanwhile, the folder has analysis_v3_FINAL.do next to final_final_draft.docx.

Sound familiar?

My objective was to show colleagues that there is a better workflow, and how to adopt it slowly and make it a habit. I also wanted to undeerscore literate programming. The code and the prose live in one source of truth, so you don’t hardcode stats or copy-paste results.

I organized the talk around four pillars.

  1. Project organization: A self-contained repo per project, with data, code, and outputs together. Raw data vs processed data separation, and writing docs (e.g., a README.md). For a cumulative dissertation, each chapter can be a git submodule, but I used separate repos.
  2. Version control with Git & GitHub: Use Git to track your work (code, prose, or docs), even as a single author, with GitHub or locally.
  3. Dependency management: Our analysis depends on specific package versions, and package updates can break our code. It does not work on my machine! uv (Python) and renv (R) record package versions so the code runs on another machine.
  4. Literate programming: Code, results, and narrative in one document (kept tightly together). No copy-paste errors, changes (of data, threshold, vars etc.) cascade and results update automatically.

I spent most of the talk on literate programming with Quarto, because it entails the other three.

Note

The reproducibility crisis is real. See the Data Colada posts on the Gino case. It may take you down, from earning $1M+ a year to a pleb! :D Journals and reviewers increasingly ask for code and data.

One source but several output formats:

flowchart LR
  project["project/
  ├── data/
  │   ├── raw/
  │   └── processed/
  └── code/
  #nbsp;   ├── download_data.py
  #nbsp;   └── clean_data.R"]

  project --> article["article.qmd"]
  project --> seminar["internal-seminar-2026.qmd"]

  article -->|render| html["HTML"]
  article -->|render| pdf["PDF"]
  article -->|render| docx["Word"]

  seminar -->|render| revealjs["reveal.js slides (HTML)"]
  seminar -->|render| beamer["Beamer slides (PDF)"]
  seminar -->|render| pptx["PowerPoint slides"]

  %% mermaid trims leading spaces in a label, so the code/ children start with #nbsp;
  classDef tree text-align:left,font-family:monospace,white-space:pre
  class project tree
Figure 1: Write in Markdown, embed R or Python, render to HTML, PDF, Word, or slides.

The demo analyzes trends in WOZ property values across Dutch municipalities. It loads a CSV, makes exploratory plots, runs a regression with the results inline, adds cross-references and citations, and renders to HTML and PDF.

Slides, with the WOZ demo and the talk repo.
Dissertation chapters: housing supply elasticity, the German donut effect, and Addis Ababa gradients:

—— Thank you for stopping by! 💚💛❤️ ——