住房与区位选择结构模型:Epple-Sieg 排序与 Bayer 离散选择
家庭如何在社区间"用脚投票"?从 Tiebout 到 Epple-Sieg (1999) 的连续排序均衡,再到 Bayer-McMillan-Rueben (2004) 的离散选择 + 工具变量框架,推导收入分层、房价资本化与公共品支付意愿(WTP),并做设施改善与地铁建设的反事实福利分析。
numpy、scipy.stats.lognorm、scipy.optimize);理解向量化广播。../qsge/13-ahlfeldt.html。01 模型设定:两大流派
家庭在城市内部选择居住地(社区/街区/学区),本质是一个带异质性偏好与市场出清的离散选择问题。文献中有两条互补的主线:
- Epple-Sieg (1999) 连续排序模型(sorting model):社区沿一条"设施质量轴"连续分布,家庭因收入与偏好不同而排序到不同社区,房价由市场出清决定,内生地产生收入分层。
- Bayer-McMillan-Rueben (2004) 离散选择框架:把每个社区当作一个离散选项,用 RUM + 随机系数描述家庭选择,重点处理房价内生性与邻里效应(neighborhood effects)。
两者都回答同一个问题:家庭为社区设施(学校、绿地、治安、通勤便利)愿意付多少钱(WTP)?这一支付意愿正是公共品资本化、住房政策与城市规划福利分析的核心。
02 Epple-Sieg 排序模型:设定与推导
2.1 间接效用函数
社区 $j$ 提供公共设施 $a_j$(学校质量、环境、治安),住房价格 $p_j$。家庭 $i$ 的可支配收入为 $y_i - p_j$。Epple-Sieg 采用 Cobb-Douglas 型间接效用:
变量含义:$y_i$ 家庭收入;$p_j$ 房价;$a_j$ 社区设施质量;$\alpha$ 刻画家庭对"剩余收入"与"设施"的相对偏好。设定理由:幂函数保证对剩余收入的边际效用递减,且对设施 $a_j$ 是线性的——使 WTP 与收入成正比,从而产生"高收入追逐高设施"的排序。
2.2 边际效用与支付意愿 WTP(不跳步推导)
对 $V=(y-p)^\alpha a$ 分别求偏导。
家庭愿意为设施提高支付的边际房价(边际替代率)定义为:保持效用不变时,一单位设施增加所愿意放弃的房价,即 $-dp/da$。由全微分 $dV=(\partial V/\partial p)dp+(\partial V/\partial a)da=0$:
经济直觉:WTP 与可支配收入 $y_i-p_j$ 成正比、与偏好参数 $\alpha$ 成反比。关键推论:收入越高的家庭,对同一设施的支付意愿越大——这正是排序(sorting)的根源:高收入家庭愿意出更高价竞标高设施社区。(正文为简洁,常把设施指数化后写作 $\mathrm{WTP}\propto(y-p)/\alpha$。)
2.3 排序均衡与边界家庭
社区按设施升序 $a_1<a_2<\cdots<a_J$ 排列。由于 WTP 随收入递增,均衡时收入分层成立:收入越低的家庭住低设施社区,越高的家庭住高设施社区。相邻社区 $j$ 与 $j+1$ 之间存在一个"边界家庭" $y_j^*$,它在两者间无差异:
两边开 $\alpha$ 次方并整理。令 $r_j=(a_j/a_{j+1})^{1/\alpha}<1$,则:
反过来,给定外生的供给份额(每个社区容纳 $1/J$ 的家庭),边界收入由收入分布 $F_y$ 的分位数决定:$y_j^*=F_y^{-1}(j/J)$。于是房价可由解析递推求出(见第 4、5 节代码)。
2.4 均衡条件:住房市场出清
房价 $\{p_j\}$ 是使所有社区同时出清的均衡价格向量。低设施社区房价低以吸引穷人,高设施社区房价高以挤出低收入家庭。
03 Bayer-McMillan-Rueben:离散选择 + IV
3.1 随机效用设定
Bayer 等人把社区当作离散选项,家庭 $i$ 选社区 $j$ 的效用为:
$X_j$ 社区观察特征(面积、地铁距离);$p_j$ 房价;$\bar X_{-i,j}$ 邻里构成(排除 $i$ 自己的邻里平均,即邻里效应);$\xi_j$ 不可观测社区质量(结构误差);$\varepsilon_{ij}$ i.i.d. Gumbel。
3.2 Logit 选择概率
由于 $\varepsilon_{ij}$ 为 i.i.d. 极值型,由第 03 页 的标准推导,条件选择概率为:
3.3 房价内生性与 Berry 反演
房价 $p_j$ 与不可观测质量 $\xi_j$ 内生相关(好社区房价高且 $\xi_j$ 大)。直接 OLS 会把"质量"误算成"价格",使价格系数向 0 偏误。Berry (1994) 的解析反演把市场份额写成线性形式:
其中 $s_j$ 为社区 $j$ 的市场份额,$s_0$ 为外部选项份额。这是一个关于 $\{X,p,\bar X\}$ 的线性回归方程,残差正是 $\xi_j$。
3.4 工具变量:边界不连续与成本侧 IV
常用 IV:(a) 住房建造成本/建材价格;(b) 行政边界另一侧的邻居特征(利用学区/行政边界的不连续性,Bayer-Ferreira-McMillan 2007);(c) BLP 式竞争品特征和。详见 04 BLP 页。
3.5 通勤成本
工作地固定时,居住选择含通勤成本。在效用中扣减 $\kappa d_{ij}$($\kappa$ 单位通勤成本,$d_{ij}$ 家到工作地距离):
地铁/快速路建设使 $\kappa$ 下降,远距离社区的吸引力上升——这是第 8 节反事实 B 的核心机制。
04 求解算法:均衡房价固定点
05 代码 1:Epple-Sieg 排序均衡求解
下面的代码用解析递推求均衡房价,并验证"收入随设施分层、房价随设施上升"。已实跑验证。
"""
代码块1:Epple-Sieg (1999) 排序模型 —— 连续社区排序与均衡房价求解
- J 个社区按设施 a_j 升序;家庭收入对数正态;间接效用 V=(y-p)^alpha * a
- 边界家庭 y_j* 在社区 j 与 j+1 间无差异,解析递推均衡房价
"""
import numpy as np
from scipy.stats import lognorm
np.random.seed(20240912)
# ---------- 1. 环境设定 ----------
J = 12 # 社区数
alpha = 0.5 # 偏好参数
a = 1.0 + 0.15 * np.arange(1, J + 1) # 社区设施单调递增
# 收入分布:log y ~ N(mu, sigma^2),中位收入约 50
mu, sigma = np.log(50.0), 0.40
Y_dist = lognorm(s=sigma, scale=np.exp(mu))
N = 40000
y_sim = Y_dist.rvs(size=N, random_state=7)
# ---------- 2. 由供给份额确定均衡边界收入 ----------
quantiles = np.arange(1, J) / J # 1/J, ..., (J-1)/J
y_star = Y_dist.ppf(quantiles) # J-1 个边界收入
# ---------- 3. 解析递推均衡房价 ----------
r = (a[:-1] / a[1:]) ** (1.0 / alpha) # r_j = (a_j/a_{j+1})^(1/alpha)
p0 = 5.0 # 锚定最低社区房价
p_eq = np.zeros(J)
p_eq[0] = p0
for j in range(J - 1):
# p_{j+1} = y_j*(1 - r_j) + r_j p_j
p_eq[j + 1] = y_star[j] * (1.0 - r[j]) + r[j] * p_eq[j]
# ---------- 4. 模拟家庭选择,验证均衡 ----------
def choose_communities(p, a):
resid = y_sim[:, None] - p[None, :]
V = np.full((N, J), -np.inf)
m = resid > 0
V[m] = (resid[m] ** alpha) * np.tile(a, (N, 1))[m]
return np.argmax(V, axis=1)
choice = choose_communities(p_eq, a)
# ---------- 5. 输出 ----------
print(f"{'社区':>4} {'设施a_j':>8} {'房价p_j':>9} {'平均收入':>9} {'份额':>7}")
for j in range(J):
sel = choice == j
inc = y_sim[sel].mean() if sel.any() else np.nan
print(f"{j:>4} {a[j]:>8.2f} {p_eq[j]:>9.2f} {inc:>9.1f} {sel.mean():>7.3f}")
mean_inc = np.array([y_sim[choice==j].mean() if (choice==j).any() else np.nan
for j in range(J)])
print("平均收入随设施单调递增?", bool(np.all(np.diff(mean_inc[~np.isnan(mean_inc)])>=-1e-9)))
各社区份额约 $0.083$($=1/12$),平均收入从最低设施社区的约 $24$ 单调上升到最高设施社区的约 $106$;均衡房价从 $5.0$ 单调上升到约 $47.9$。这就是收入分层与房价资本化的核心实证模式:高收入家庭为优质设施支付了更高房价。
06 代码 2:Bayer 框架 IV 估计
模拟带内生房价的离散选择数据,对比 naive OLS 与 IV/2SLS。已实跑验证。
"""
代码块2:Bayer-McMillan-Rueben 离散选择 + IV 估计
U_ij = X_j'beta - alpha p_j + gamma Xbar_j + xi_j + eps_ij
p_j 与 xi_j 内生相关 -> OLS 偏误;用成本冲击 cost_shock 作 IV
"""
import numpy as np
from scipy.optimize import minimize
np.random.seed(20240912)
J, K = 100, 2
X = np.random.randn(J, K)
X[:,0] = (X[:,0]-X[:,0].mean())/X[:,0].std() # 住房面积
X[:,1] = (X[:,1]-X[:,1].mean())/X[:,1].std() # 到地铁距离
xi = 0.35 * np.random.randn(J) # 不可观测质量(与p相关)
cost_shock = np.random.randn(J) # 外生成本冲击(IV)
p = 0.5 + 0.4*X[:,0] - 0.3*X[:,1] + 0.6*xi + 1.5*cost_shock
p = np.abs(p) + 0.1
Xbar = np.random.randn(J) # 邻里构成
beta_true = np.array([1.0, -0.5]); alpha_true = -1.2; gamma_true = 0.3
# 平均效用 + 份额反演所需的观测份额(简化,模拟市场)
delta = X @ beta_true + alpha_true*p + gamma_true*Xbar + xi
R = 300
v = np.random.randn(R)
mu = 0.1 * v[:,None] * X[None,:,0]
u = delta[None,:] + mu
P = np.exp(u - u.max(1, keepdims=True)); P /= P.sum(1, keepdims=True)
S = P.mean(0) * np.exp(0.02*np.random.randn(J)); S /= S.sum()
S0 = max(1.0 - S.sum(), 1e-3)
y_dep = np.log(S) - np.log(S0) # Berry 反演被解释变量
# (a) Naive OLS
Z_ols = np.column_stack([X, p, Xbar])
b_ols = np.linalg.lstsq(Z_ols, y_dep, rcond=None)[0]
print("OLS alpha =", round(b_ols[2],3), "(真实 -1.2)")
# (b) IV/2SLS:cost_shock 作 p 的工具
W_iv = np.column_stack([X, Xbar, cost_shock])
p_hat = W_iv @ np.linalg.lstsq(W_iv, p, rcond=None)[0]
Z_iv = np.column_stack([X, p_hat, Xbar])
b_iv = np.linalg.lstsq(Z_iv, y_dep, rcond=None)[0]
print("IV alpha =", round(b_iv[2],3), "(真实 -1.2)")
naive OLS 估计的价格系数约为 $+0.17$(符号错误、向 0 偏误),而 IV/2SLS 修正后约为 $-1.58$,接近真实值 $-1.2$。这定量展示了房价内生性的危害:好社区同时房价高、质量高,OLS 把质量误读为价格,严重低估居民对房价的敏感度。
07 数据与估计
| 数据类型 | 美国来源 | 中国来源 | 用途 |
|---|---|---|---|
| 家庭选择/收入 | IPUMS-ACS、CPS | 人口普查、CHIP、CFPS | 收入分布、社区选择 |
| 房价/租金 | Zillow、ACS | 中国房价网、城市二手房挂牌、链家 | $p_j$ 与资本化 |
| 公共品/设施 | NCES 学校数据、绿地 GIS | 教育局中考成绩、高德 POI、遥感绿化 | $a_j$、$X_j$ |
| 通勤/职住 | CTPP、LEHD | 人口普查通勤、手机信令 | $d_{ij}$、$\kappa$ |
| 邻里构成 | tract 普查 | 社区/街道人口结构 | $\bar X_{-i,j}$ |
估计方法:GMM/IV 处理房价内生性;随机系数 Logit 处理偏好异质性;排序均衡估计用 Epple-Sieg 的矩匹配。关键参数:$\alpha$(房价/收入边际效用弹性)、$\beta$(社区特征偏好)、$\gamma$(邻里效应)、$\kappa$(通勤成本)。
08 代码 3:反事实与福利分析
承接 Epple-Sieg 框架:(A) 优质学区设施提升 20%;(B) 地铁建设降低通勤成本。已实跑验证。
"""
代码块3:反事实 —— 设施改善 -> 房价资本化 -> 福利(CV)
承接代码1:a1=优质学区+20%;a2=郊区通勤改善
CV:在新(p,a)下维持旧效用 V_base 所需收入 y',CV = y - y'
"""
import numpy as np
from scipy.stats import lognorm
np.random.seed(20240912)
J, alpha = 12, 0.5
a0 = 1.0 + 0.15*np.arange(1, J+1)
Y_dist = lognorm(s=0.40, scale=np.exp(np.log(50.0)))
N = 40000; y_sim = Y_dist.rvs(size=N, random_state=7)
def solve_prices(a, p0=5.0):
q = np.arange(1, J)/J; ys = Y_dist.ppf(q)
r = (a[:-1]/a[1:])**(1/alpha)
p = np.zeros(J); p[0] = p0
for j in range(J-1):
p[j+1] = ys[j]*(1-r[j]) + r[j]*p[j]
return p
def choose(p, a):
res = y_sim[:,None] - p[None,:]
V = np.full((N,J), -np.inf); m = res>0
V[m] = (res[m]**alpha)*np.tile(a,(N,1))[m]
return np.argmax(V, axis=1)
# 基线
p_base = solve_prices(a0); c0 = choose(p_base, a0)
V_base = (y_sim - p_base[c0])**alpha * a0[c0]
# 反事实A:优质学区(末4社区)设施+20%
a1 = a0.copy(); a1[-4:] *= 1.20
pA = solve_prices(a1); cA = choose(pA, a1)
y_eq = (V_base / a1[cA])**(1/alpha) + pA[cA]
CV_A = y_sim - y_eq
print("学区房价上涨%:", np.round(np.mean((pA[-4:]-p_base[-4:])/p_base[-4:])*100,1))
print("平均 CV:", round(CV_A.mean(),2))
# 反事实B:地铁(郊区通勤改善)
a2 = a0.copy(); a2[:6] *= 1.15; a2[6:] *= 1.03
pB = solve_prices(a2); cB = choose(pB, a2)
y_eqB = (V_base/a2[cB])**(1/alpha) + pB[cB]
CV_B = y_sim - y_eqB
print("市区房价变化%:", np.round(np.mean((pB[6:]-p_base[6:])/p_base[6:])*100,1))
print("平均 CV:", round(CV_B.mean(),2))
反事实 A:优质学区设施提升 20%,其房价平均资本化上涨约 $14.7\%$($10\%\sim20\%$),平均补偿变化 CV 为正(家庭净受益)。反事实 B:地铁改善郊区可达性后,市中心房价反而下降约 $10.3\%$(需求外溢到郊区),全市平均 CV 为正。政策含义:学校质量改善的收益大量资本化进房价,现有业主获益、新进入者承担;地铁的福利效应通过降低通勤成本分散到郊区。
(1) 学校质量改善对房价与居住隔离的影响;(2) 地铁/快速路建设对职住与房价梯度的影响;(3) 住房补贴(共有产权、公租房)的福利归宿;(4) 居住隔离与收入分层的长期演化。
09 论文案例
10 常见错误与陷阱
好社区房价高且不可观测质量 $\xi_j$ 也高,OLS 价格系数向 0 偏误甚至符号错误,WTP 被严重低估。必须用 IV/GMM(成本侧、边界不连续、竞争品特征)。
特征价格法的边际 hedonic 价格是边际支付意愿,只在局部有效;做大的政策反事实(设施提升 20%)必须用均衡排序模型重解房价与重新排序,不能线性外推。
设施改善会通过市场出清改变房价,进而影响谁住哪里。只看居民效用变化而不重解均衡房价,会错误估计福利归宿(业主得益、租客受损)。
Epple-Sieg 的边界收入依赖 $F_y^{-1}$。若收入分布用正态而非对数正态拟合,边界收入和均衡房价都会偏。务必用数据拟合收入分布(如对数正态/Gamma)。
只看设施/房价会得出"越市中心越好"。加入 $\kappa d_{ij}$ 后,远距离但低房价的郊区可能最优。地铁建设反事实必须通过通勤成本渠道,而非直接改设施。
构造邻里平均时若把家庭自己算进去,会产生机械相关与反射问题(Manski reflection)。必须用 $\bar X_{-i,j}$(leave-one-out)。
方程总清单 / Equation Summary
本页全部方程按出现顺序汇总,共 18 个。
| 编号 | 方程名称 | 核心公式 | 所在节 |
|---|---|---|---|
| Eq.20-01 | Epple-Sieg 间接效用 | $V=(y-p)^\alpha a$ | 02.1 |
| Eq.20-02 | 对房价边际效用 | $\partial V/\partial p=-\alpha(y-p)^{\alpha-1}a$ | 02.2 |
| Eq.20-03 | 对设施边际效用 | $\partial V/\partial a=(y-p)^\alpha$ | 02.2 |
| Eq.20-04 | 支付意愿 WTP | $\mathrm{WTP}=(y-p)/(\alpha a)$ | 02.2 |
| Eq.20-05 | 边界家庭无差异 | $(y^*-p_j)^\alpha a_j=(y^*-p_{j+1})^\alpha a_{j+1}$ | 02.3 |
| Eq.20-06 | 边界收入解析解 | $y^*=(p_{j+1}-r p_j)/(1-r)$ | 02.3 |
| Eq.20-07 | 住房市场出清 | 需求=固定供给 $h_j$ | 02.4 |
| Eq.20-08 | Bayer 随机效用 | $U_{ij}=X_j'\beta-\alpha p_j+\gamma\bar X_{-i,j}+\xi_j+\varepsilon_{ij}$ | 03.1 |
| Eq.20-09 | 条件 Logit 概率 | $P_{ij}=e^{V_{ij}}/\sum_k e^{V_{ik}}$ | 03.2 |
| Eq.20-10 | Berry 份额反演 | $\ln s_j-\ln s_0=X_j'\beta-\alpha p_j+\gamma\bar X+\xi_j$ | 03.3 |
| Eq.20-11 | IV/GMM 矩条件 | $E[Z_j'\xi_j]=0$ | 03.4 |
| Eq.20-12 | 含通勤成本效用 | $U_{ij}=\cdots-\kappa d_{ij}$ | 03.5 |
| Eq.20-13 | 房价递推 | $p_{j+1}=y_j^*(1-r_j)+r_j p_j$ | 04/代码1 |
| Eq.20-14 | 2SLS 一阶段 | $\hat p=Z(Z'Z)^{-1}Z'p$ | 代码2 |
| Eq.20-15 | 二阶段回归 | $(\ln s_j-\ln s_0)$ 对 $[X,\hat p,\bar X]$ | 代码2 |
| Eq.20-16 | 补偿变化 CV | $y'$ 满足 $u(y'-p')=V_{base}$,CV=$y-y'$ | 代码3 |
| Eq.20-17 | 房价资本化 | $\%\Delta p_j$ 对 $\%\Delta a_j$ | 08 |
| Eq.20-18 | 通勤成本渠道 | $a^{eff}_j=a_j\cdot(1+\text{可达性改善})$ | 08 |