Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
2e91c99
feat(p4): adjust manuscript to v4.5 per md guidance
claude May 1, 2026
4d6db95
feat(p4): add 10-step Stata replication blueprint for Vietnam rerun
claude May 1, 2026
7f54c98
docs(p4): complete manuscript v4.5.1 with full submission sections
claude May 1, 2026
3210988
docs(p4): expand manuscript v4.5.2 with detailed content
claude May 1, 2026
cfc6118
docs(p4): finalise manuscript v4.5.3 to submission-ready front matter
claude May 1, 2026
4153682
feat(p4): re-estimate Vietnam evidence on raw .dta and rewrite manusc…
claude May 1, 2026
4fbc102
docs(p4): v4.7 — fill authors, embed Table 1, rewrite robustness with…
claude May 2, 2026
9a10f95
docs(p4): v4.8 — close blockers 2 and 5 (Figures + reference list)
claude May 2, 2026
6157e2c
chore: gitignore pycache and remove accidentally-committed .pyc
claude May 2, 2026
62eb468
docs(p4): v4.9 — implement Heckman + Paternoster, no more deferred ro…
claude May 2, 2026
67634a5
docs(p4): v5.0 — IJoEM submission draft
claude May 2, 2026
10e5ee0
docs(p4): v5.1 — reference audit + Emerald Harvard formatting
claude May 2, 2026
9a6164c
docs(p4): v5.2 — Phan Anh Tu corresponding; refreshed back-matter
claude May 2, 2026
049da1d
docs(p4): v5.3 — submission bundle (blinded + cover letter + checklist)
claude May 2, 2026
40fee80
docs(p4): add submission/ folder — single GitHub-friendly upload bundle
claude May 2, 2026
4742759
docs(p4): v5.4 — add §4.5 Panel G manufacturing vs non-manufacturing …
claude May 2, 2026
39955be
docs(p4): v5.5 — split Figure 2, embed Table 3 + Table LM, add WBES s…
claude May 2, 2026
2a06dc7
docs(p4): v5.6 — reference audit + 6 recent IB-literature additions
claude May 2, 2026
41b9f53
docs(p4): v5.7 — reviewer-driven revision (DAI/TCI relabel, exporter-…
claude May 2, 2026
2fc646c
build(p4): bundle v5.7 submission as single zip for download
claude May 2, 2026
bf5a885
docs(p4): v5.7 — add point-by-point response letter for reviewer
claude May 2, 2026
5e1f2a1
build(p4): add Excel workbooks per figure (data + native chart + PNG …
claude May 2, 2026
fdfd92a
docs(p4): v5.8 — round-2 revision (dual-mechanism H1 + PSM Panel J + …
claude May 2, 2026
c16908b
fix(p4-v5.8): post-revision patches — 7 fixes applied to both blinded…
huongctu May 6, 2026
47e06b5
fix(p4-v5.9): apply 20 reviewer-driven clean-copy edits — qualified-s…
huongctu May 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,4 @@ coverage/
# Temporary files
tmp/
temp/
scripts/__pycache__/
88 changes: 88 additions & 0 deletions SUBMISSION_CHECKLIST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# P4 — Submission checklist (IJoEM)

Last refresh: 2026-05-02 (manuscript v5.3).
Target journal: International Journal of Emerging Markets (Emerald).
Corresponding author: Phan Anh Tu (patu@ctu.edu.vn).

## Deliverable files

| # | File | Purpose | Upload role on Editorial Manager |
|---|------|---------|-----------------------------------|
| 1 | `manuscript_v4_5.docx` | Full version with title page, authors, ORCID, back matter | Title page (or "manuscript with author info" if journal asks for one combined file) |
| 2 | `manuscript_blinded.docx` | Anonymous review copy: title, abstract, keywords, body, figures, tables, references; no author names, no ORCID, no Author contributions section | Main document (blinded) |
| 3 | `cover_letter_ijoem.docx` | Editor cover letter | Cover letter |
| 4 | `p4_vietnam/output/figures/figure_1_conceptual_model.{pdf,png}` | Figure 1 source files | Figure 1 |
| 5 | `p4_vietnam/output/figures/figure_2_main_results.{pdf,png}` | Figure 2 source files | Figure 2 |
| 6 | `p4_vietnam/output/tables/*.csv` | Replication outputs | Supplementary file (optional) |
| 7 | `p4_vietnam/` directory | Stata + Python replication package | Supplementary materials (zip if needed) |

## Pre-submission checks

- [x] Title page has both authors with full ORCID and verified e-mail
- [x] Phan Anh Tu flagged as corresponding author
- [x] Abstract is structured (Purpose / Design / Findings / Originality)
- [x] Keywords (six terms) and JEL codes (five codes) present
- [x] In-text citations follow Emerald Harvard (`Author and Author, Year`)
- [x] References list in Emerald Harvard (`(YYYY), "Title", Journal, Vol. X No. Y, pp. Z–Z.`)
- [x] Every reference is cited at least once in the body
- [x] Every in-text citation has a matching reference entry
- [x] No "submission to Journal of World Business" wording remains
- [x] No "this submission" wording (replaced with "this manuscript")
- [x] No JWB editorial-team / reviewer thanks in Acknowledgements
- [x] Sample sizes (989 / 956 / 1,013 / 2,958) consistent across abstract, §3, tables, figures
- [x] Turning points (46.2 / 39.3 / 41.6 / 39.7 %) consistent across §4 prose and figures
- [x] DAI primary spec is c22b only; no e6 sharing with TCI
- [x] Data Availability Statement spells out the WBES Data Access Protocol
- [x] Conflict of interest declared (none)
- [x] Funding declared (none specific)
- [x] Use-of-AI disclosure included

## Pre-upload Word checks

Open `manuscript_blinded.docx` and confirm:

- No author surname appears anywhere
- No e-mail address appears anywhere
- No ORCID ID appears anywhere
- "Author contributions" heading is removed
- Acknowledgements section retains only the World Bank attribution and the no-funding sentence
- Figures render as PNG embedded inline (Figure 1 and Figure 2)
- Table 1 (descriptives) and Table 2 (main empirical pattern) render as Word tables

Open `manuscript_v4_5.docx` (the title-page version) and confirm:

- Title, both author lines, both affiliations and the corresponding-author tag are present
- The 6 Heading-1 back-matter sections appear in this order: Author contributions, Conflict of interest, Funding, Data availability statement, Use of generative AI in the writing process, Acknowledgements

## Submission note (for "Comments to the editor")

> This manuscript is original, has not been published previously, and is not under consideration elsewhere. All authors have approved the submitted version and agree to its submission. The study uses World Bank Enterprise Surveys data under the applicable data-access protocol; accordingly, the raw .dta files are not redistributed, although replication materials and computational documentation can be shared to the extent permitted by the data-access terms.

## Reproducibility

Anyone can rebuild the entire submission from the repository root:

```bash
# 1. Re-estimate everything on the three Vietnam WBES waves
python3 scripts/p4_vietnam_analysis.py

# 2. Render Figure 1 (B&W conceptual model) and Figure 2 (predicted I–P curves)
PYTHONPATH=scripts python3 scripts/p4_render_figures.py

# 3. Build the full manuscript (with title page + back matter)
python3 scripts/build_p4_v4_5.py

# 4. Build the blinded manuscript (no author identity)
BLINDED=1 python3 scripts/build_p4_v4_5.py

# 5. Build the cover letter
python3 scripts/build_cover_letter.py
```

Outputs:

- `manuscript_v4_5.docx` (full)
- `manuscript_blinded.docx` (review copy)
- `cover_letter_ijoem.docx`
- `p4_vietnam/output/tables/*.csv` (Table 1, Table 2, Table 3 robustness, Table LM, Heckman, Paternoster)
- `p4_vietnam/output/figures/figure_{1,2}_*.{pdf,png}`
Binary file added cover_letter_ijoem.docx
Binary file not shown.
Binary file added manuscript_blinded.docx
Binary file not shown.
Binary file added manuscript_v4_5.docx
Binary file not shown.
81 changes: 81 additions & 0 deletions p4_vietnam/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# P4 Vietnam — replication blueprint

End-to-end Stata pipeline that rebuilds the three Vietnam WBES waves (2009, 2015, 2023), runs the M0–M8 model sequence per wave and pooled, and emits every table / figure the manuscript references.

## Layout

```
p4_vietnam/
├── do/ # 10-step pipeline + master + helper library
│ ├── 00_master.do
│ ├── _lib_build.do
│ ├── 01_build_2009.do
│ ├── 02_build_2015.do
│ ├── 03_build_2023.do
│ ├── 04_append_pooled.do
│ ├── 05_main_models.do
│ ├── 06_lind_mehlum.do
│ ├── 07_selection_checks.do
│ ├── 08_crosswave_tests.do
│ ├── 09_robustness.do
│ └── 10_export_tables_figures.do
├── raw/ # drop the WBES releases here (see below)
├── work/ # intermediate per-wave + pooled clean files
└── output/
├── tables/ # CSV outputs consumed by the manuscript
├── figures/ # PDF + PNG figures
└── logs/ # Stata logs
```

## Required raw inputs

Place the three WBES releases into `raw/` with these exact filenames:

| Filename | Source release |
|----------------------|-------------------------------------------------|
| `vietnam_2009.dta` | World Bank Enterprise Survey — Vietnam 2009 |
| `vietnam_2015.dta` | World Bank Enterprise Survey — Vietnam 2015 |
| `vietnam_2023.dta` | World Bank Enterprise Survey — Vietnam 2023 |

Variable presence has been pre-verified against the uploaded `.dta` files:

- 2009 ships `d2 l1 d3c b8 e6 c22b b2b b5 a2 a4a a4b` (no `h1 h8 k33 k38`).
- 2015 ships the 2009 set plus `h1 h8` (still no `k33 k38`).
- 2023 ships everything except `a4b`; sector FE falls back to `a4a`.

So `TCI_full` is constructed only for 2015 and 2023, and `DAI_rich` (continuous and binary) only for 2023, in line with the manuscript.

## Running the pipeline

```stata
cd p4_vietnam
do do/00_master.do
```

`00_master.do` derives every other path from its working directory, installs the user-written commands it depends on (`estout`, `utest`, `parmest`, `ftools`, `reghdfe`) on a fresh machine, and runs the full sequence into `output/logs/00_master.log`.

## What each step writes

| Step | Output | Used by manuscript section |
|------|-----------------------------------------------------------|----------------------------|
| 01–03| `work/vnm{2009,2015,2023}_clean.dta` | §3.1 sample sizes |
| 04 | `work/vnm_pooled_clean.dta` | §3.1 pooled spec |
| 05 | `tables/coefs_main_models.csv`, `tables/joint_tests_main_models.csv` | §4.2–4.5 |
| 06 | `tables/table_lind_mehlum.csv` (also copied to `table_LM.csv`) | §4.2 (H1) |
| 07 | `tables/selection_checks.csv` | §4.6 (Heckman / CF) |
| 08 | `tables/table_paternoster.csv` | §4.6 (cross-wave z-test) |
| 09 | `tables/robustness_TCI_full.csv`, `robustness_DAI_rich.csv`, `robustness_sector2digit.csv`, `robustness_microfirm.csv`, `robustness_commonN_2023.csv` | §4.6 panels |
| 10 | `tables/table_1_descriptives.csv`, `table_2_baseline.csv`, `table_3_robustness.csv`, `table_LM.csv`, `figure_2_predictions.csv`, `figs/figure_2_main_results.{pdf,png}` | Tables 1–3, Figure 2 |

## Spec invariants (do not change without manuscript update)

- OLS with `vce(robust)` (HC1) throughout.
- `FSTSc` is **wave-mean-centred** before squaring; in `04_append_pooled.do` the centring is recomputed within wave on the pooled file.
- `TCI_z` and `DAI_z` are **z-standardised within wave** (so the pooled coefficients are interpretable as one-SD effects net of wave).
- WBES `-9` codes are converted to missing **before** any composite is built; listwise deletion runs on `lnLP lnEmp FirmAge ForeignOwned FSTS TCI_thin DAI_thin sector1`.
- Wave fixed effects appear only in pooled specifications (`$pooled_controls`).
- Sector FE uses the first digit of `a4b` where available, falling back to `a4a` for 2023.

## Reconciliation rule

If a coefficient or p-value reported in the manuscript drifts from what the rerun produces, **the manuscript text is what changes** — never the do-file output. The four canonical tables (`table_1_descriptives`, `table_2_baseline`, `table_3_robustness`, `table_LM`) are the source of truth.
64 changes: 64 additions & 0 deletions p4_vietnam/do/00_master.do
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
*! 00_master.do — P4 Vietnam: master orchestrator
*! Drives the full P4 rerun pipeline end-to-end. Set $root once below; every
*! downstream do-file resolves all paths from the globals defined here so no
*! manual edits should be needed inside the per-step scripts.
*!
*! Expected raw inputs in $raw:
*! vietnam_2009.dta (WBES Vietnam 2009 full release)
*! vietnam_2015.dta (WBES Vietnam 2015 full release)
*! vietnam_2023.dta (WBES Vietnam 2023 full release)
*! Drop the World Bank releases here unrenamed, then this master script
*! applies a thin rename layer at build time (01–03_build_*.do).

clear all
set more off
set varabbrev off
version 17

* ---------------------------------------------------------------------------
* Edit only this line to point at your local working copy of the project.
* All other paths are derived.
* ---------------------------------------------------------------------------
global root "`c(pwd)'"

global do "$root/do"
global raw "$root/raw"
global work "$root/work"
global out "$root/output"
global tables "$out/tables"
global figs "$out/figures"
global logs "$out/logs"

cap mkdir "$work"
cap mkdir "$out"
cap mkdir "$tables"
cap mkdir "$figs"
cap mkdir "$logs"

* ---------------------------------------------------------------------------
* Required user-written commands. Install once on a fresh machine.
* ---------------------------------------------------------------------------
foreach pkg in estout utest parmest ftools reghdfe {
cap which `pkg'
if _rc ssc install `pkg', replace
}

cap log close _all
log using "$logs/00_master.log", replace text

di as txt "==> P4 Vietnam pipeline starting at $S_DATE $S_TIME"
di as txt " root = $root"

do "$do/01_build_2009.do"
do "$do/02_build_2015.do"
do "$do/03_build_2023.do"
do "$do/04_append_pooled.do"
do "$do/05_main_models.do"
do "$do/06_lind_mehlum.do"
do "$do/07_selection_checks.do"
do "$do/08_crosswave_tests.do"
do "$do/09_robustness.do"
do "$do/10_export_tables_figures.do"

di as txt "==> P4 Vietnam pipeline finished at $S_DATE $S_TIME"
log close
65 changes: 65 additions & 0 deletions p4_vietnam/do/01_build_2009.do
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
*! 01_build_2009.do — Vietnam WBES 2009 analytic file
*! Variables present in the 2009 release (verified):
*! d2 l1 d3c b8 e6 c22b b2b b5 a2 a4a a4b
*! Variables not present (must remain undefined for this wave):
*! h1 h8 k33 k38 (so TCI_full and DAI_rich do not exist for 2009)

clear all
do "$do/_lib_build.do"

use "$raw/vietnam_2009.dta", clear
gen wave = 2009

p4_clean_missing d2 l1 d3c b8 e6 c22b b2b b5 a2 a4b a4a

* Outcome and controls --------------------------------------------------------
gen lnLP = ln(d2 / l1)
gen lnEmp = ln(l1)
gen FirmAge = wave - b5
gen ForeignOwned = (b2b > 0) if !missing(b2b)

* Internationalisation --------------------------------------------------------
gen FSTS = d3c / 100
gen export_any = (FSTS > 0) if !missing(FSTS)

* Capability composites -------------------------------------------------------
p4_recode01 b8 e6 c22b
egen TCI_thin = rowmean(b8_r e6_r)
egen DAI_thin = rowmean(c22b_r e6_r)

* (TCI_full and DAI_rich are not constructed for 2009 — items missing.)

* Sector fixed effects --------------------------------------------------------
gen sector1 = real(substr(a4b, 1, 1)) if !missing(a4b)
replace sector1 = real(substr(a4a, 1, 1)) if missing(sector1) & !missing(a4a)

* Listwise on the focal set ---------------------------------------------------
egen miss_focal = rowmiss(lnLP lnEmp FirmAge ForeignOwned FSTS TCI_thin DAI_thin sector1)
keep if miss_focal == 0
drop miss_focal

* Within-wave centering and standardisation -----------------------------------
qui sum FSTS
gen FSTSc = FSTS - r(mean)
gen FSTSc2 = FSTSc^2

p4_zwithin TCI_thin, gen(TCI_z)
p4_zwithin DAI_thin, gen(DAI_z)

label var lnLP "log labour productivity"
label var FSTS "direct-export intensity (share)"
label var FSTSc "FSTS, mean-centred within wave"
label var FSTSc2 "FSTSc squared"
label var TCI_z "TCI_thin (z within wave)"
label var DAI_z "DAI_thin (z within wave)"
label var lnEmp "log permanent employees"
label var FirmAge "firm age (years)"
label var ForeignOwned "foreign ownership > 0 (0/1)"
label var sector1 "broad ISIC sector (first digit)"

keep wave lnLP lnEmp FirmAge ForeignOwned FSTS FSTSc FSTSc2 export_any ///
TCI_thin DAI_thin TCI_z DAI_z sector1 a2

compress
save "$work/vnm2009_clean.dta", replace
di as txt "[01] vnm2009_clean.dta saved with N = " _N
61 changes: 61 additions & 0 deletions p4_vietnam/do/02_build_2015.do
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
*! 02_build_2015.do — Vietnam WBES 2015 analytic file
*! Variables present in the 2015 release (verified):
*! d2 l1 d3c b8 e6 c22b b2b b5 a2 a4a a4b h1 h8
*! Variables not present:
*! k33 k38 (so DAI_rich is still 2023-only)

clear all
do "$do/_lib_build.do"

use "$raw/vietnam_2015.dta", clear
gen wave = 2015

p4_clean_missing d2 l1 d3c b8 e6 c22b b2b b5 a2 a4b a4a h1 h8

gen lnLP = ln(d2 / l1)
gen lnEmp = ln(l1)
gen FirmAge = wave - b5
gen ForeignOwned = (b2b > 0) if !missing(b2b)

gen FSTS = d3c / 100
gen export_any = (FSTS > 0) if !missing(FSTS)

p4_recode01 b8 e6 c22b h1 h8

egen TCI_thin = rowmean(b8_r e6_r)
egen DAI_thin = rowmean(c22b_r e6_r)
egen TCI_full = rowmean(b8_r e6_r h1_r h8_r)

gen sector1 = real(substr(a4b, 1, 1)) if !missing(a4b)
replace sector1 = real(substr(a4a, 1, 1)) if missing(sector1) & !missing(a4a)

egen miss_focal = rowmiss(lnLP lnEmp FirmAge ForeignOwned FSTS TCI_thin DAI_thin sector1)
keep if miss_focal == 0
drop miss_focal

qui sum FSTS
gen FSTSc = FSTS - r(mean)
gen FSTSc2 = FSTSc^2

p4_zwithin TCI_thin, gen(TCI_z)
p4_zwithin DAI_thin, gen(DAI_z)
p4_zwithin TCI_full, gen(TCI_full_z)

label var lnLP "log labour productivity"
label var FSTS "direct-export intensity (share)"
label var FSTSc "FSTS, mean-centred within wave"
label var FSTSc2 "FSTSc squared"
label var TCI_z "TCI_thin (z within wave)"
label var DAI_z "DAI_thin (z within wave)"
label var TCI_full_z "TCI_full (z within wave, 2015/2023)"
label var lnEmp "log permanent employees"
label var FirmAge "firm age (years)"
label var ForeignOwned "foreign ownership > 0 (0/1)"
label var sector1 "broad ISIC sector (first digit)"

keep wave lnLP lnEmp FirmAge ForeignOwned FSTS FSTSc FSTSc2 export_any ///
TCI_thin DAI_thin TCI_z DAI_z TCI_full TCI_full_z sector1 a2

compress
save "$work/vnm2015_clean.dta", replace
di as txt "[02] vnm2015_clean.dta saved with N = " _N
Loading