课程目录 · 已完成 0 / 7 个模块
亲手完成一次
农业机械化服务结构估计
从教学数据生成到 MLE、拟合、补贴反事实和适用边界。浏览器先帮助理解,下载代码再完成可复现版本。
研究设定
问题:随机发放服务代金券后,农户的净服务价格下降。我们估计价格敏感度与经营规模收益,并模拟普惠补贴下的采纳率和财政成本。
样本:700 个模拟农户。代金券随机分配;服务标价、经营规模、距离和质量均可观测。
选择:是否购买机械化服务。
估计:二元 logit MLE。浏览器版只让你调价格与规模两个参数,截距、距离和质量系数固定;下载代码会同时估计全部系数。
P(购买ᵢ=1) = Λ[β₀ + α·净价格ᵢ + β·log(1+规模ᵢ) + γ·距离ᵢ + δ·质量ᵢ]
教学数据不等于实证证据。这里的“真参数”和外生代金券由程序设定,只用于检查估计逻辑。真实服务价格通常可能与未观测质量、需求和供给能力相关,不能直接照搬外生价格假设。
先在浏览器里摸到似然与反事实
步骤 1 · 参数估计
让模型解释农户的购买选择
手动拖动参数观察对数似然,再让坐标搜索自动寻找更优值。有限样本下估计值应接近但不会等于程序设定的真值。
-0.45
0.15
步骤 2 · 政策反事实
改变补贴率,重新计算购买概率
补贴按实际购买支付,财政成本是每户预期成本。图中只改变农户净价格,服务供给和标价保持不变。
20%
把网页实验变成研究代码
| 阶段 | 要做什么 | 通过标准 |
|---|---|---|
| 1. 生成/读入数据 | 固定 seed;明确变量单位、选择时点与政策随机化 | 重新运行得到相同教学数据 |
| 2. 估计 | 最大化 logit 对数似然;报告估计值、标准误和收敛 | 模拟样本中能在抽样误差内回收真值 |
| 3. 拟合 | 比较观测和预测采纳率,并按净价格分组 | 不只报告总体平均 |
| 4. 反事实 | 改变净价格,计算采纳率与财政成本 | 使用同一估计参数,并传播不确定性 |
| 5. 边界 | 列明价格内生性、供给容量、进入与外推范围 | 结论不超过模型能回答的问题 |
Stata 路线:从熟悉的 logit 看见结构含义
Stata 脚本使用 logit,因为该命令正是在最大化二元选择模型的对数似然。重点不是另写一个复杂优化器,而是把系数映射回效用,并用估计参数执行政策模拟。
set seed 20260804
logit adopt net_price ln_land distance quality, vce(robust)
* 给定补贴率 s,重新计算净价格与预测概率
gen phat_cf = invlogit(_b[_cons] + _b[net_price] * listed_price * (1-s) ///
+ _b[ln_land] * ln_land + _b[distance] * distance ///
+ _b[quality] * quality)完整脚本还会输出按价格四分位的拟合表和 0–50% 补贴率的反事实 CSV/图形。
Python 路线:亲自写目标函数与 Newton 更新
Python 脚本只用标准库,显式计算 score 和信息矩阵,再用 Newton–Raphson 更新参数;无需安装依赖即可运行。模型复杂后可把相同目标函数接口交给 SciPy 等成熟优化库。
score, information = score_and_information(theta, farmers)
step = solve_linear_system(information, score)
theta = [value + change for value, change in zip(theta, step)]
if max(abs(change) for change in step) < tolerance:
break这个模型现在不能回答什么?
- 服务商进入:补贴提高需求后是否有新服务商进入?静态需求模型没有供给方。
- 容量与拥堵:旺季服务供给有限时,补贴可能抬价或延迟作业。
- 价格内生性:真实标价可能随未观测需求和质量变化,需要工具变量、实验价格或联合供需模型。
- 动态学习:农户可能先试用再更新质量认知,需要动态学习模型。
- 福利:采纳率不是福利。完整福利分析还需服务收益、成本、财政机会成本和供给者剩余。
合理升级顺序:先把静态外生价格模型跑通并验证;再分别加入价格内生、未观测异质性、动态学习或服务商进入。不要一次把四个扩展全塞进第一个项目。对应概念和计算路线已拆到进阶模型地图。