Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c11b515
docs(papers): add P3 Singapore manuscript revision package
claude May 2, 2026
9394912
docs(papers): add citations for 16 previously-uncited references
claude May 2, 2026
97d9c7c
docs(papers): replicate locked spec, sync §4 text + Table 2 + Table 4
claude May 2, 2026
04f6aa8
docs(papers): prepare P3 submission package for MIR
claude May 2, 2026
792b86a
fix(p3): Phase 0 — audit & fix D1 (Table 3 transcription errors)
claude May 2, 2026
dba1cee
feat(p3): Phase 1 — extensive–intensive split design
claude May 2, 2026
d92f3b2
feat(p3): Phase 2 — right-tail leverage diagnostics
claude May 2, 2026
599bc3f
feat(p3): Phase 3 — indicator sensitivity (formative-construct logic)
claude May 2, 2026
234b36f
feat(p3): Phase 4 + Phase 8 — rewrite framing/hypotheses + final QC
claude May 2, 2026
0fb1529
fix(p3): cover letter grammar + framing tightening
claude May 2, 2026
d43965f
docs(p3): fill author info into Title Page and Cover Letter
claude May 2, 2026
7fa556b
docs(p3): add R3 Master Revision Memo (1-page internal summary)
claude May 2, 2026
1b39881
docs(p3): confirm 3 of 4 pending items (corresponding, funding, ackno…
claude May 2, 2026
0e1b45e
docs(p3): confirm postal address — all 4 pending items closed
claude May 2, 2026
3278b14
feat(p3): regenerate Figures 1-3 to match canonical data + embed in m…
claude May 2, 2026
760db7d
feat(p3): redesign Figure 1 to standard IB framework (IV/DV/Moderator…
claude May 2, 2026
cb897ae
docs(p3): add complete submission package (PDF + DOCX + figures)
claude May 2, 2026
f7eb2bb
edit(p3): final wording pass — siết claim register across 11 sections
claude May 2, 2026
515e806
edit(p3): Pass 2 — rewrite Discussion/Conclusion + Section 7 limitati…
claude May 2, 2026
0ec63b6
edit(p3): Pass 3 — six precision fixes per co-author review
claude May 2, 2026
57cfec5
edit(p3): Pass 4 — Section 7 cleanup + tone normalization + editor ve…
claude May 2, 2026
2bae671
edit(p3): Pass 5 — three substantive enhancements per NotebookLM review
claude May 2, 2026
ec92325
chore(p3): add zipped submission package for download
claude May 2, 2026
b1cd667
docs(p3): add R2 vs R3 comparison report
claude May 2, 2026
6f5e5cf
fix(p3-r3): post-revision patches — Avenyo DOI (verified Crossref) + …
huongctu May 6, 2026
3c228b9
docs(p3-r3): add post-revision audit report — 11 cosmetic patches app…
huongctu May 6, 2026
4b9fa56
fix(p3-r3): regenerate Figure 1 with corrected hypothesis numbering —…
huongctu May 6, 2026
3129464
docs(p3-r3): update audit report — Figure 1 regenerated with correcte…
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
Binary file added data/raw/Singapore2023fulldata.dta
Binary file not shown.
134 changes: 134 additions & 0 deletions outputs/r3/audit/D1_diagnosis.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
{
"target": {
"TCI": 0.187,
"fsts_c2_DAI": 2.972,
"adj_rsq": 0.192
},
"candidates": {
"C0_canonical (Table 2 M8)": {
"n": 617,
"TCI": 0.15282307108044393,
"DAI": 0.01876816338509209,
"fsts_c": 2.408923999224807,
"fsts_c2": -2.5426209374013347,
"fsts_c_DAI": -1.1666305870701332,
"fsts_c2_DAI": 3.118509354618096,
"rsq": 0.21060011168872506,
"adj_rsq": 0.19624738644670192
},
"C1a_DAI_thin_drop_k38": {
"n": 617,
"TCI": 0.15861554170001224,
"DAI": 0.008479481907202824,
"fsts_c": 2.5975854723773915,
"fsts_c2": -2.7531245984435566,
"fsts_c_DAI": -1.28498819624694,
"fsts_c2_DAI": 3.0922643284141547,
"rsq": 0.20950753766039276,
"adj_rsq": 0.19513494743603632
},
"C1b_DAI_thin_drop_k33": {
"n": 617,
"TCI": 0.1645477490187506,
"DAI": -0.013059716011683726,
"fsts_c": 2.231405718780488,
"fsts_c2": -1.5707464704683172,
"fsts_c_DAI": -0.7340104392100292,
"fsts_c2_DAI": 1.6191483683450174,
"rsq": 0.2008414357858288,
"adj_rsq": 0.18631128007284392
},
"C1c_DAI_thin_drop_c22b": {
"n": 617,
"TCI": 0.15373599136284502,
"DAI": 0.07010918490892645,
"fsts_c": 2.16139417274263,
"fsts_c2": -1.684150616632968,
"fsts_c_DAI": -0.6318527981029047,
"fsts_c2_DAI": 1.6562886210137013,
"rsq": 0.21016108503120345,
"adj_rsq": 0.1958003774863163
},
"C2a_TCI_thin_drop_h8": {
"n": 617,
"TCI": 0.1422183914950359,
"DAI": 0.02445551244246606,
"fsts_c": 2.4776853929272105,
"fsts_c2": -2.58671910902815,
"fsts_c_DAI": -1.1246997216921406,
"fsts_c2_DAI": 3.0147641864048897,
"rsq": 0.20902024523838514,
"adj_rsq": 0.19463879515181037
},
"C2b_TCI_thin_drop_h1": {
"n": 617,
"TCI": 0.16981767965791494,
"DAI": 0.019533892146092555,
"fsts_c": 2.2913682645292943,
"fsts_c2": -2.43244987819773,
"fsts_c_DAI": -1.1124207429032902,
"fsts_c2_DAI": 3.0793424970607717,
"rsq": 0.2147293679377481,
"adj_rsq": 0.2004517200820709
},
"C2c_TCI_thin_drop_e6": {
"n": 617,
"TCI": 0.14741399333234664,
"DAI": 0.01635189443854478,
"fsts_c": 2.5867681625242747,
"fsts_c2": -2.821870711641307,
"fsts_c_DAI": -1.2685230743042986,
"fsts_c2_DAI": 3.3250968361991293,
"rsq": 0.2096788042460085,
"adj_rsq": 0.19530932795957234
},
"C2d_TCI_thin_drop_b8": {
"n": 617,
"TCI": 0.0828870585521267,
"DAI": 0.03455671681008279,
"fsts_c": 2.5675529267842103,
"fsts_c2": -2.6942803193003795,
"fsts_c_DAI": -1.146727198099981,
"fsts_c2_DAI": 3.07065655794518,
"rsq": 0.1984443520258241,
"adj_rsq": 0.18387061297174823
},
"C4_HC3_SE": {
"n": 617,
"TCI": 0.15282307108044393,
"DAI": 0.01876816338509209,
"fsts_c": 2.408923999224807,
"fsts_c2": -2.5426209374013347,
"fsts_c_DAI": -1.1666305870701332,
"fsts_c2_DAI": 3.118509354618096,
"rsq": 0.21060011168872506,
"adj_rsq": 0.19624738644670192
},
"C5_HC0_SE": {
"n": 617,
"TCI": 0.15282307108044393,
"DAI": 0.01876816338509209,
"fsts_c": 2.408923999224807,
"fsts_c2": -2.5426209374013347,
"fsts_c_DAI": -1.1666305870701332,
"fsts_c2_DAI": 3.118509354618096,
"rsq": 0.21060011168872506,
"adj_rsq": 0.19624738644670192
}
},
"best": {
"name": "C2a_TCI_thin_drop_h8",
"result": {
"n": 617,
"TCI": 0.1422183914950359,
"DAI": 0.02445551244246606,
"fsts_c": 2.4776853929272105,
"fsts_c2": -2.58671910902815,
"fsts_c_DAI": -1.1246997216921406,
"fsts_c2_DAI": 3.0147641864048897,
"rsq": 0.20902024523838514,
"adj_rsq": 0.19463879515181037
},
"l1": 0.09018459006166424
}
}
140 changes: 140 additions & 0 deletions outputs/r3/audit/D1_root_cause.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
# D1 Root-Cause Diagnosis — Table 3 Mismatch

**Date:** 2026-05-02
**Reviewer issue:** Manuscript Table 3 baseline row reports values that do
not match Manuscript Table 2 Model M8 despite both being labeled as the
same specification on the same N=617 sample.

---

## What the reviewer flagged

Manuscript Table 3, baseline row:
- TCI β_z = **0.187***
- FSTS² × DAI = **2.972***
- Adj. R² = **0.192**

Manuscript Table 2, Model M8:
- TCI β_z = **0.153***
- FSTS² × DAI = **3.119***
- Adj. R² = **0.196**

Both rows claim N = 617 and the same TCI_full + DAI_rich specification.

---

## Audit findings

### 1. Canonical M8 (locked spec) reproduces Table 2 M8 exactly.

`tools/r3/00_canonical_m8.py` re-estimates M8 from the raw `.dta` using
the locked specification (4-component TCI, 3-component DAI with k33/k38
single-missing imputation, HC1 robust SE, broad-sector NACE buckets,
1/99 winsorized ln-labor-productivity). Result:

| Term | Coefficient | SE | p |
|---|---|---|---|
| TCI | 0.1528 | 0.0412 | <0.001 |
| DAI | 0.0188 | 0.0454 | 0.679 |
| FSTS² × DAI | 3.1185 | 1.1236 | 0.006 |
| **N** | **617** | | |
| **Adj. R²** | **0.196** | | |

→ Matches Table 2 M8 exactly. Canonical M8 is therefore the single source
of truth for all subsequent R3 work.

### 2. No alternative specification reproduces the Table 3 baseline row.

`tools/r3/01_diagnose_table3_baseline.py` and
`tools/r3/03_diagnose_tci_spec.py` test ten plausible alternative specs:

- DAI variants (drop k33, drop k38, drop c22b)
- TCI variants (drop one of b8/e6/h1/h8)
- TCI standardization variants (z-then-avg-then-z; simple avg then z;
z-then-avg only; sum-of-z then z)
- Robust-SE variants (HC0, HC1, HC3)

Closest match (V2_simple_avg_then_z) yields TCI=0.159 and FSTS²×DAI=3.110,
which still disagrees with Table 3 baseline (0.187 / 2.972). No spec
reproduces the joint triple (0.187, 2.972, 0.192).

### 3. All six rows of Table 3 contain transcription errors.

`tools/r3/02_audit_table3.py` re-estimates each Table 3 row from raw data:

| Row | Spec | N (rep/man) | TCI (rep/man) | FSTS²×DAI (rep/man) | AdjR² (rep/man) |
|---|---|---|---|---|---|
| Baseline | TCI_full + DAI_rich | 617/617 ✓ | 0.153/0.187 ✗ | 3.119/2.972 ✗ | 0.196/0.192 ✓ |
| R1 | DAI_thin (c22b only) | 623/623 ✓ | 0.180/0.211 ✗ | 1.552/1.563 ✓ | 0.188/0.184 ✓ |
| R2 | TCI_thin (e6 + b8) | 617/617 ✓ | 0.159/0.171 ✗ | 2.930/2.749 ✗ | 0.199/0.188 ✗ |
| R3 | Excl micro-firms (<10 empl) | 464/464 ✓ | 0.170/0.218 ✗ | 3.521/3.535 ✓ | 0.219/0.226 ✗ |
| R4 | SMEs only (≤200 empl) | 595/595 ✓ | 0.156/0.180 ✗ | 3.505/3.483 ✓ | 0.199/0.197 ✓ |
| R5 | Exporters only (FSTS > 0) | 84/84 ✓ | 0.130/0.143 ✗ | **2.821**/1.308 ✗ | 0.165/0.140 ✗ |

Ns are correct in all six rows. Coefficients deviate systematically:
- TCI is consistently **higher** in the manuscript than canonical (0.012 to 0.048).
- The R5 (exporters-only) FSTS²×DAI is off by **+1.513** (manuscript reports 1.308 but canonical is 2.821) — this is the single largest deviation.

### 4. Most plausible explanation

The Table 3 numbers appear to be a **stale snapshot from an earlier
manuscript draft** that used a slightly different TCI or sample-build
pipeline. The subsequent revision updated Table 2 M8 to the locked spec
but did not propagate the change to Table 3, leaving Table 3 with stale
coefficients across all rows.

This matches the reviewer's observation that "the baseline row in Table
3 appears intended to represent the same full specification as Model
M8" yet does not match.

---

## Recommended fix

**Replace the entire Table 3 with the canonical re-estimation
(corrected six-row block produced by `02_audit_table3.py`).**

Corrected Table 3:

| Specification | N | TCI β_z | FSTS² × DAI | Joint F (p) | Adj. R² |
|---|---|---|---|---|---|
| Baseline (TCI_full + DAI_rich) | 617 | +0.153*** | +3.119** | 4.56 (.011) | 0.196 |
| R1: DAI_thin (website c22b only) | 623 | +0.180*** | +1.552 | 4.01 (.019) | 0.188 |
| R2: TCI_thin (e6 + b8) | 617 | +0.159*** | +2.930** | 4.27 (.014) | 0.199 |
| R3: Excl micro-firms (<10 empl) | 464 | +0.170*** | +3.521** | 4.61 (.010) | 0.219 |
| R4: SMEs only (≤200 empl) | 595 | +0.156*** | +3.505** | 5.30 (.005) | 0.199 |
| R5: Exporters only (FSTS > 0) | 84 | +0.130 | +2.821 | 6.32 (.003) | 0.165 |

Significance stars: † p<.10, * p<.05, ** p<.01, *** p<.001.

### Implication for narrative (R5 exporters-only row in particular)

The corrected R5 row (FSTS²×DAI = +2.821, joint F = 6.32, p = .003)
**strengthens** rather than weakens the moderation finding within the
exporter subsample. The previously reported R5 (FSTS²×DAI = +1.308,
joint F = 3.18, p = .048) suggested the result was attenuated when
restricting to exporters. The canonical re-estimation shows the
opposite: the moderation pattern is stronger and more significant
within the exporter subsample.

This affects how Section 7 caveats should be worded. The reviewer's
warning that R5 "illustrates how the dynamics change when non-exporters
are excluded" relied on the (incorrect) attenuation. With the corrected
numbers, the dynamic is **reinforcement, not attenuation**.

This finding will also be central to Phase 1's extensive–intensive
split design: the intensive-margin (exporter-only) test now has a
stronger basis.

---

## Provenance

- Raw data: `data/raw/Singapore2023fulldata.dta` (WBES Singapore 2023, 623 firms)
- Locked spec: `tools/r3/00_canonical_m8.py`
- Diagnosis: `tools/r3/01_diagnose_table3_baseline.py`,
`tools/r3/03_diagnose_tci_spec.py`
- Full audit: `tools/r3/02_audit_table3.py`
- Audit JSON: `outputs/r3/audit/m8_canonical.json`,
`outputs/r3/audit/D1_diagnosis.json`,
`outputs/r3/audit/table3_audit.json`
17 changes: 17 additions & 0 deletions outputs/r3/audit/bootstrap_tp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"n_reps": 5000,
"n_valid": 5000,
"n_after_clip": 4833,
"full_sample_tp_pct": 82.42734943255799,
"boot_ci_95": [
52.783447184437435,
252.88850840165713
],
"boot_iqr": [
68.34763515648574,
101.48642800926018
],
"boot_median": 79.98398279880973,
"pct_inverted_U_shape": 96.26,
"pct_TP_in_0_100_range": 72.3980964204428
}
60 changes: 60 additions & 0 deletions outputs/r3/audit/extensive_margin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"n": 617,
"n_exporters": 84,
"n_domestic": 533,
"pseudo_rsq": 0.18588284144786205,
"llf": -199.86874012076993,
"ll_null": -245.5036575770315,
"lr_chi2": 91.26983491252315,
"lr_p": 6.785563111143895e-17,
"params": {
"Intercept": -4.426522310624799,
"C(broad_sector)[T.manufacturing]": 2.060908687966435,
"C(broad_sector)[T.retail_services]": 1.8344999585877233,
"TCI": 0.498604602591217,
"DAI": 0.5823037154349072,
"ln_empl": -0.1532903849791616,
"firm_age": 0.03827272490857476,
"foreign": 0.9469228747992615
},
"bse": {
"Intercept": 0.7818548560166404,
"C(broad_sector)[T.manufacturing]": 0.6436399672390086,
"C(broad_sector)[T.retail_services]": 0.6283907155093299,
"TCI": 0.12395138741848782,
"DAI": 0.17713834216464655,
"ln_empl": 0.1293901370523867,
"firm_age": 0.010237936660509615,
"foreign": 0.281220425069438
},
"pvalues": {
"Intercept": 1.4999841915915947e-08,
"C(broad_sector)[T.manufacturing]": 0.0013649649617863816,
"C(broad_sector)[T.retail_services]": 0.0035074868430648473,
"TCI": 5.7563637646633504e-05,
"DAI": 0.0010115941350844339,
"ln_empl": 0.23613030632319265,
"firm_age": 0.00018525106840965825,
"foreign": 0.0007593808345014743
},
"odds_ratios": {
"Intercept": 0.011955996699375046,
"C(broad_sector)[T.manufacturing]": 7.853102588914332,
"C(broad_sector)[T.retail_services]": 6.262002102050488,
"TCI": 1.6464222537054076,
"DAI": 1.7901576980383642,
"ln_empl": 0.8578805700067292,
"firm_age": 1.039014559392361,
"foreign": 2.577765336068539
},
"ame": {
"C(broad_sector)[T.manufacturing]": 0.20329813750792605,
"C(broad_sector)[T.retail_services]": 0.1809640703719163,
"TCI": 0.04918480263174326,
"DAI": 0.05744129349499352,
"ln_empl": -0.015121315149040734,
"firm_age": 0.003775409234139334,
"foreign": 0.09340911508325701
},
"ame_weight_phi": 0.09864490294741146
}
21 changes: 21 additions & 0 deletions outputs/r3/audit/extensive_margin.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Logit Regression Results
==============================================================================
Dep. Variable: exporter No. Observations: 617
Model: Logit Df Residuals: 609
Method: MLE Df Model: 7
Date: Sat, 02 May 2026 Pseudo R-squ.: 0.1859
Time: 08:52:05 Log-Likelihood: -199.87
converged: True LL-Null: -245.50
Covariance Type: nonrobust LLR p-value: 6.786e-17
======================================================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------------------------
Intercept -4.4265 0.782 -5.662 0.000 -5.959 -2.894
C(broad_sector)[T.manufacturing] 2.0609 0.644 3.202 0.001 0.799 3.322
C(broad_sector)[T.retail_services] 1.8345 0.628 2.919 0.004 0.603 3.066
TCI 0.4986 0.124 4.023 0.000 0.256 0.742
DAI 0.5823 0.177 3.287 0.001 0.235 0.929
ln_empl -0.1533 0.129 -1.185 0.236 -0.407 0.100
firm_age 0.0383 0.010 3.738 0.000 0.018 0.058
foreign 0.9469 0.281 3.367 0.001 0.396 1.498
======================================================================================================
Loading