四万五千户英国用水客户,被随机分到对照组或六封劝导信中的一封,有邮箱的再加一封提醒邮件;一年后看多少人真的去做了在线家庭用水审计。这份复现包把整条链摊开:四份去标识原始数据、五步构建脚本、40 个分析脚本、39 个逐项核对脚本,以及八封信件与提醒邮件的原件。
论文是 Akesson、Kochhar、Hahn、Metcalfe 四人的《Do Water Audits Work?》,已被 The Economic Journal 接收、即将刊出,稿件号 MS 20250685,预注册号 AEARCTR-0009486。复现包 2026 年 9 月 20 日发布在 Zenodo,记录号 22862790,许可 CC BY 4.0。通讯作者是芝加哥大学的 Rajat Kochhar。
包里有什么
目录结构是刻意做平的,脚本靠一个空标记文件 .replication_root 向上找到包根,所以在任何工作目录、按依赖允许的任何顺序都能跑。
顶层五个文件:README.md、LICENSE.txt(CC BY 4.0 与再分发声明)、PORTING_NOTES.md(记录数据清洗里那些从代码看不出来的决定)、.replication_root、以及代码目录 code/R。
code/R 里,00_run.R 是总控;01 到 05 是构建链,把原始文件变成分析数据集;analysis/ 下每个表图一个脚本,另有两个帮手:welfare_00_parameters.R 负责组装福利计算的参数表,build_propensity_weights.R 负责估倾向得分权重。
数据分四层:data/raw 放四份原始输入,raw/csv 放每份输入的 CSV 副本(多工作表的工作簿按表拆分,共 19 个);data/ 下另有三个溯源交叉表;temp 放中间产物,可安全删除;processed 放构建出的分析数据集与预先算好的倾向权重。
输出在 output/tables 与 output/figures,表是 .tex 与 .txt,图是 .png。verification/ 放 39 个 verify_*.R 与 3 个 derive_*.R,exhibits/ 放实验材料。整包 209 个文件、17 个目录,最占地方的是那份 9.98 MB 的问卷工作簿。
四份原始输入与一条匿名化红线
treatment_assignment.dta 一人一行,记录实验组与提醒邮件的分配、是否装表、城乡标记、NWG 是否留有邮箱、以及匿名邮编编号;转成 CSV 后是 44,757 行数据、21 列。treatment_groups_oct28.xlsx 是处理组的定义与标签。consumption_data_for_analysis.xlsx 每个装表家庭最多四条抄表记录,含抄表日期与累计用水量,用来构造处理前后用水。nwl_diagnostic_survey.xlsx 放诊断工具的完成记录(含审计完成时长参数)与 2019 年 3 月的回访问卷回答。
数据能公开,靠的是一份有条件的批准。许可文件写得很明确:西北水务集团(Northumbrian Water Group)的数据保护团队同意把这批去标识数据以开放许可存入期刊的公共仓库,条件是数据彻底匿名、记录无法关回到具体客户。数据里没有姓名、地址、真实邮编、邮箱或电话,地理信息只以匿名整数编号出现;内部参考键是假名且不可关联,映射表在项目结束后已销毁。
更严的一步是:做了一遍逐列的再识别风险审查之后,六个从未用于分析的问卷开放题字段与问卷的响应/链接列都被抹掉。抹完之后,包里 39 项核对仍然全部通过。
跑起来要什么
R 4.3.2(2023-10-31)产出结果,代码在 R 4.
5.x 上也能原样跑。需要 11 个包:haven 读 .dta、readxl 读 .xlsx、dplyr 与 tidyr 做数据操作、sandwich 提供 HC1 稳健方差、lmtest 的 coeftest、car 的线性假设联合检验、lfe 的 felm 做平衡表固定效应、multcomp 的 glht 做线性组合、ivreg 做两阶段最小二乘估 LATE、texreg 出 LaTeX 回归表、ggplot2 出图。
有一句很少见但很关键的话:这里没有受控随机性,没有任何脚本设种子或依赖种子;所有标准误都是 HC1 稳健的,所有估计量都是确定性的,所以结果可以精确复现。那个带约 2,900 个邮编固定效应的 logit 同样是确定性的,重估一遍得到的是逐字节相同的权重。
时间与空间:完整复现(打开核对开关、用随包附带的倾向权重)约 2 分钟;要从头重估倾向权重再加约 75 分钟;占用不到 100 MB,主要是原始 xlsx。
三段式主脚本与 39 项核对
00_run.R 把整包跑成三段。第一段构建:依次跑 01_data_cleaning.R 到 05_merge.R,把 data/raw 变成 data/processed/response_consumption.Rdata,中间产物里有 post_consumption.Rdata,附录表 F.2 会回头用它。第二段分析:跑 analysis/ 下的 40 个脚本,把每张表写进 output/tables 的主文或附录目录,每张图写进 output/figures。第三段核对:跑 39 个 verify 脚本,每个独立重算一张表图并与发表值比对,最后报通过数,完整跑完报 39/39 PASS。
每个脚本都在自己的 R 子进程里执行,只加载自己需要的包,步骤之间只通过磁盘文件衔接。这个设计的好处是包与包之间的函数名冲突不会串场。
用法就三行:
- # 1 出全部表图,用随包附带的倾向权重,约 2 分钟
- source("code/R/00_run.R")
- # 2 出表图之外逐项核对
- Sys.setenv(RUN_VERIFY = "TRUE")
- source("code/R/00_run.R")
- # 3 连倾向权重一起从头重估,再加约 75 分钟
- Sys.setenv(RUN_PROPENSITY = "TRUE", RUN_VERIFY = "TRUE")
- source("code/R/00_run.R")
两个开关是环境变量,在 macOS/Linux 下可以写成 RUN_VERIFY=TRUE Rscript code/R/00_run.R 这种前缀形式;Windows 的 PowerShell 与命令提示符要先设变量再起进程,README 第 6 节把三种写法都列了。
表图与脚本一一对应
README 第 7 节给了全表,主文部分是这样:表 1(完成率与用水量)对应 table1_letters_diagComp_consumption.R;表 2 面板 A(未加权 LATE)对应 table2_panelA_late_unweighted.R;面板 B(重加权 LATE)对应 table2_panelB_reweighted.R,会读那个预先算好的倾向权重;表 3(成本效果)对应 welfare_table3_cost_effectiveness_nfe.R;表 4(成本收益)对应 welfare_table4_benefit_cost.R;图 1(持续性)对应 persistence_figures.R。
附录分六组:A 是平衡表与描述统计(9 张表),B 是异质性,C 是数据局限与稳健性,D 是补充结果,E 是福利计算,F 是数据格式。
有三张表没有对应脚本,README 直接说明了原因:表 E.1 列的是福利计算用的参数值,值本身写在 welfare_00_parameters.R 里;表 E.6 是把表 E.5 第 4 列与它所引研究里的数字拼起来的对比表;表 F.1 是用水数据布局的示例,用的是虚构数值。
还有两张福利表不是用本次实验的数据算的:E.4 复述 Ansink、Ornaghi 与 Tonin(2021)的成本效果,数字取自他们附录表 A 的系数;E.5 把另外五项研究报告的成本效果换算成 2020 年美元/立方米,用的是 CPI-U 序列与美制加仑换算。两个脚本的头部都标了每个输入的来源、章节与页码。
实验材料与伦理说明
exhibits/mailers 下是八份信件 PDF(基准版、利他版、简化版、10 英镑与 15 英镑激励版、高/低道德成本版、无表道德成本版)与一张提醒邮件截图,对应论文附录 H;follow_up_survey.pdf 是完整的 22 题回访问卷。信件在 2018 年 12 月 8 日一次寄出,对照组没有收到信;提醒邮件 2019 年 2 月 6 日发出,只发给留了邮箱且尚未完成审计的客户。全部以英文原始语言实施,没有翻译问题。
实验设计、样本选择与合格性、处理、随机化与时间线单独做了一份 experimental_design.pdf,带 .tex 源文件。
伦理这一段值得单独读:这场田野实验是 2018 年由 The Behaviouralist 与西北水务集团合作设计与执行的运营性评估,当时学术合作者还没参与,所以没有走大学的伦理审查委员会;它经过了负责干预的两家机构的伦理与风险审查,审查函作为 ethics_review_letter.pdf 放在包里。这段说明放在正文里,而不是藏在脚注里。
三条时间线别搞混
实验发生在 2018 年 12 月到 2019 年 3 月,回访问卷在 2019 年 3 月;2026 年 9 月 20 日是这份复现材料的发布日,不是数据采集时间。把它写成 2026 年新做的调查就错了。
另外,实验处理是六封信加一封提醒,但 mailers 目录里存了八份信件 PDF:道德成本那一封按消费中位数与是否装表分成三个版本。文件数不等于实验组数,按 README 的分组定义去数才对。
许可写 CC BY 4.0,但还有一层条件
Zenodo 记录与包内 LICENSE.txt 都写 CC BY 4.0,覆盖代码与去标识数据。但那份许可不是无条件的:NWG 的批准限定在学术复现这一用途上,并要求保持匿名、不可关回客户。引用时把这两层一起说清楚,比只写 CC BY 4.0 准确。
CC BY 4.0 本身要求署名。包内许可文件把署名方式写死了:引用这篇论文和这个复现包,就是它的署名方式。转发或改写时把作者、标题、期刊状态与来源一起带上,别只贴一个压缩包。
────────────────
需要记录页、打包下载与许可原文的直达地址,四份输入与 19 个 CSV 副本的对照,40 个分析脚本与表图的完整映射,以及包内逐项核对过的数字,回帖后可见。
把经管之家装进你常用的 AI 智能体中 一键快捷安装经管之家 MCP/技能,让 AI 帮你查教程、找数据、读论坛帖子。 检索、阅读公开帖子不收费,安装可申请领取:3 通用积分+100 论坛币+3 元论坛资金 说明: AI 算力按所用平台规则计算;附件按原帖条件获取;福利领取条件以活动页面为准。 |


雷达卡


京公网安备 11010802022788号







