回放分析
agri_sandbox/analyze.py 直接读取各次实验的回放 SQLite,按"基线阶段 / 政策阶段"拆分并计算宏观指标与 处理效应,无需重跑仿真。
命令
bash
python -m agri_sandbox.analyze [选项]| 选项 | 默认值 | 说明 |
|---|---|---|
--results-dir PATH | ./results | 结果根目录(递归查找 **/run_meta.json) |
--baseline-steps N | 取 run_meta.json | 覆盖基线阶段步数(用于与运行配置不一致时对齐) |
--out PATH | 同 --results-dir | 摘要输出目录 |
它做什么
- 递归扫描
results/**/run_meta.json,定位每个(情景, 重复)的sqlite.db; - 对
agri_policy_env_state表按step <= baseline_steps/step > baseline_steps拆成 基线期与政策期,分别求各宏观指标均值; - 对
agri_policy_agent_state表,按农户计算"政策期均值 − 基线期均值"的农户级净收入处理效应; - 按情景聚合多个重复,给出基线/政策均值、处理效应(绝对差 Δ 与相对变化 %)。
输出
summary.json—— 结构化结果(每个情景的指标对象);summary.csv—— 表格化结果,便于进一步绘图 / 统计;- 终端打印的 Markdown 摘要表,示例列:
| 指标 | 基线 | 政策 | 处理效应(Δ) | 相对变化 |
|---|---|---|---|---|
| 平均家庭净收入(元/季) | … | … | … | … |
| 平均补贴收入(元/季) | … | … | … | … |
| 保险覆盖率 | … | … | … | … |
| 平均种植面积(亩) | … | … | … | … |
| 全村补贴支出(元/季) | … | … | … | … |
并附农户级净收入处理效应:均值 ± 标准差(n = 有前后两阶段数据的农户数)。
升级分析 analyze_full(bootstrap CI / 异质性 / 机制 / 稳健性 / 成本效益)
agri_sandbox/analyze_full.py 在基础分析之上提供统计升级(对应完整实验计划 §8):
bash
python -m agri_sandbox.analyze_full --results-dir results --bootstrap 2000| 输出 | 说明 |
|---|---|
summary_full.json / summary_full.csv | 完整结果(主效应 + CI + 异质性 + 机制 + 稳健性 + Pareto) |
| 主效应 | Δ净收入 + 农户级 bootstrap 95% CI(b 可调) |
| 异质性 | 按经营规模分组(小农户/中农户/规模经营户,读自 core_agent_profile.profile.scale) |
| 机制编码 | 扫描决策日志/工作区文本,统计"风险预期"与"收益比较"关键词频次(无日志时提示跳过) |
| 稳健性 | 多重复(r>2)时剔除偏离中位数的极端重复后重算效应 |
| 成本效益 | 单位补贴净收入增益 = 全村 Δ净收入 / 政策期补贴支出;粮食安全—增收 Pareto 点 |
回放审计 audit_replay(数据完整性检查)
agri_sandbox/audit_replay.py 检查回放数据的完整性与异常占比(完整实验计划 §7.3):
bash
python -m agri_sandbox.audit_replay --results-dir results # 有异常退出码 1,可接入脚本门控检查项:agent_state 行数 = 农户数 × 总季数、env_state 行数 = 总季数、 净收入 ≤ 0 占比、planted_area=0 占比、投保面积 > 种植面积占比、n_planting_farmers=0 季度数。
指标口径
- 结果指标:粮食播种面积占比、农户人均纯收入、务农劳动力占比、土地流转率、保险参与率。
- 分配指标:收入基尼系数(按规模分组)。
- 成本指标:单位增收的财政成本(补贴总额 / 增收额)。
- 权衡:粮食安全指数对增收指数的 Pareto 前沿。
详见 研究方法 · 数据采集与分析方法。