π§ Monday Theme: βCode as Protocol, Folder as Ethicβ#
βDrop this .do file and your .dta into a folder. Click run. Itβll do the rest.β Thatβs what a non-Stata data guardian needs. It creates an ethical workspace, keeps outputs contained, and produces verifiable artifacts: logs, tables, plots.
ποΈ Folder Architecture (Scaffold for All Projects)#
project/
βββ code/ # .do files
β βββ lab5_template.do
βββ data/ # .dta files go here
βββ output/ # Graphs, logs, tables
βββ notes/ # README, variable dictionary, protocols
βββ master.do # Calls everything in code/
πΉ lab5_template.do
(for students β ready to fill in)#
************************************************************
* lab5.do - Self-organizing portable lab file (needs debugging)
************************************************************
clear all
set more off
* 1. Define root folder
local root = c(pwd)
* 2. Define folder paths
local data "`root'/data"
local output "`root'/output"
local code "`root'/code"
local notes "`root'/notes"
* 3. Create folders
capture mkdir "`data'"
capture mkdir "`output'"
capture mkdir "`code'"
capture mkdir "`notes'"
* 4. Move all .dta files into /data/
local dtafiles : dir "`root'" files "*.dta"
foreach f of local dtafiles {
local src "`root'/`f'"
local dest "`data'/`f'"
copy "`src'" "`dest'", replace
erase "`src'"
}
* 5. Change directory to /data
cd "`data'"
* 6. Start log
log using "`output'/lab5_output.log", replace
* 7. Load and merge data
use transplants.dta, clear
merge 1:1 fake_id using donors_recipients.dta
drop if _merge != 3
* 8. Create variables
gen over50 = age > 50
gen f_time = end_d - transplant_d
format transplant_d end_d %td
stset f_time, failure(died)
* 9. Graph
sts graph, by(over50)
graph export "`output'/survival_over50.png", replace
* 10. Close log
log close
v1.1
************************************************************
* lab5.do - Self-organizing portable lab file
************************************************************
clear all
set more off
* 1. Define root folder
local root = c(pwd)
* 2. Define folder paths
local data "`root'/data"
local output "`root'/output"
local code "`root'/code"
local notes "`root'/notes"
* 3. Create folders
capture mkdir "`data'"
capture mkdir "`output'"
capture mkdir "`code'"
capture mkdir "`notes'"
* 4. Move all .dta files into /data/
local dtafiles : dir "`root'" files "*.dta"
foreach f of local dtafiles {
local src "`root'/`f'"
local dest "`data'/`f'"
copy "`src'" "`dest'", replace
erase "`src'"
}
* 5. Change directory to /data
//cd "`data'"
* 6. Start log
capture drop _all
log using "`output'/lab5_output.log", replace
* 7. Load and merge data
use "`data'/transplants.dta", clear
merge 1:1 fake_id using data/donors_recipients.dta
drop if _merge != 3
* 8. Create variables
gen over50 = age > 50
gen f_time = end_d - transplant_d
format transplant_d end_d %td
stset f_time, failure(died)
* 9. Graph
sts graph, by(over50)
graph export "`output'/survival_over50.png", replace
* 10. Close log
log close
display "β
All done. No errors. Outputs created."
v1.2
* ************************************************************
* lab5_template.do - Self-organizing, reproducible lab file
* Designed for OS-agnostic use + graceful handoff to others
* ************************************************************
clear all
set more off
* π INIT: Declare root & core folders (relative to current location)
local root = c(pwd)
foreach folder in data output code notes {
local `folder' "`root'/`folder'"
capture mkdir ``folder''
}
* β€οΈ COMMIT: Move all .dta files into /data/ so it's clean + modular
local dtafiles : dir "`root'" files "*.dta"
foreach f of local dtafiles {
local src "`root'/`f'"
local dest "`data'/`f'"
copy "`src'" "`dest'", replace
erase "`src'"
}
* π FORK: Create structure for logging & error checking
capture drop _all
log using "`output'/lab5_output.log", replace
* π¬ BRANCH: Load and prepare data
use "`data'/transplants.dta", clear
merge 1:1 fake_id using "`data'/donors_recipients.dta"
drop if _merge != 3
* π MERGE: Create variables, apply formats, and set survival time
gen over50 = age > 50
gen f_time = end_d - transplant_d
format transplant_d end_d %td
stset f_time, failure(died)
* π OUTPUT: Graph and export results
sts graph, by(over50)
graph export "`output'/survival_over50.png", replace
* β
CLOSE: Log and finish
log close
display "β
All done. No errors. Outputs created."
v1.3
/**************************************************************************
π just-click.do β Self-organizing, reproducible lab file
βΈ OS-agnostic
βΈ Modular folder structure
βΈ Canonical symbolic stages: INIT β COMMIT β FORK β BRANCH β MERGE β OUTPUT
**************************************************************************/
clear all
set more off
* π Set global slash (optional β only needed for shell calls)
if c(os) == "Windows" {
global SL "\"
}
else {
global SL "/"
}
* π INIT: Define root + core folders (relative to current location)
global root = c(pwd)
foreach folder in data output code notes {
local fpath = "$root/${SL}`folder'"
capture mkdir "`fpath'"
global `folder' "`fpath'"
}
* β€οΈ COMMIT: Move all .dta files into /data for cleanliness
local dtafiles : dir "$root" files "*.dta"
foreach f of local dtafiles {
local src "$root/${SL}`f'"
local dest "$data/${SL}`f'"
copy "`src'" "`dest'", replace
erase "`src'"
}
* π FORK: Setup logging and clear memory
capture drop _all
log using "$output${SL}lab5_output.log", replace
* π¬ BRANCH: Load and prep data
use "$data${SL}transplants.dta", clear
merge 1:1 fake_id using "$data${SL}donors_recipients.dta"
drop if _merge != 3
* π MERGE: Generate variables, set time-to-event
gen over50 = age > 50
gen f_time = end_d - transplant_d
format transplant_d end_d %td
stset f_time, failure(died)
* π OUTPUT: Graph results
sts graph, by(over50)
graph export "$output${SL}survival_over50.png", replace
* β
CLOSE: Done
log close
noi di as result "β
All done. No errors. Outputs created."
πΈ master.do
(for non-Stata collaborator to run)#
************************************************************
* master.do - Safe and Reproducible Entry Point
* For: Non-Stata collaborators, remote collaborators
************************************************************
* Detect current directory
cd "`c(pwd)'"
* Create subfolders if needed
cap mkdir data
cap mkdir code
cap mkdir output
cap mkdir notes
* Reminder
di "β
Project folders ready. Now place .dta files in /data, .do files in /code"
* Run lab5 template if it exists
cap do code/lab5_template.do
π‘ Teaching Objectives for Monday#
Skill |
Why It Matters |
---|---|
Folder discipline |
Prevents sprawl and broken links |
|
Teaches controlled automation |
Logging |
Accountability and reproducibility |
|
Separates execution from authoring |
Relative paths |
Works across systems (Mac/PC/Linux) |
Clear entry point |
Makes your collaborator feel safe |
π‘οΈ Key Metaphor#
The folder is your lab bench. The
.do
file is your protocol. The log is your lab notebook. The graph is your publication. Donβt contaminate.