Skip to content

Commit fa1ea79

Browse files
committed
updates according to the paper
1 parent 93e6735 commit fa1ea79

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

lectures/gorman_heterogeneous_households.md

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1634,11 +1634,12 @@ def build_gorman_extended(
16341634
Ud = sum(Ud_per_house)
16351635
16361636
# Ub_per_house: bliss loading
1637-
# b_{jt} = b_bar + xi_{j,t}
1637+
# b_{jt} = b_bar_j + xi_{j,t}
1638+
b_bars = np.asarray(b_bar).reshape(-1)
16381639
Ub_per_house = []
16391640
for j in range(n):
16401641
row = np.zeros((1, nz))
1641-
row[0, 0] = b_bar # constant bliss
1642+
row[0, 0] = b_bars[j] # constant bliss (household-specific)
16421643
row[0, 3 + n_idio + j] = 1.0 # loading on xi_j
16431644
Ub_per_house.append(row)
16441645
@@ -1704,19 +1705,22 @@ n_absorb = 50
17041705
# Poorer households face larger, more persistent idiosyncratic shocks
17051706
σ_idio_min, σ_idio_max = 0.2, 5.0
17061707
σs = σ_idio_min + (σ_idio_max - σ_idio_min) * (poorness ** 2.0)
1707-
ρ_idio_min, ρ_idio_max = 0.0, 0.98
1708+
ρ_idio_min, ρ_idio_max = 0.0, 0.94
17081709
ρ_idio = ρ_idio_min + (ρ_idio_max - ρ_idio_min) * (poorness[n_absorb:] ** 1.0)
17091710
1711+
# Bliss points scale with endowment so high-α households want more consumption
1712+
b_bar_base = 5.0
1713+
b_bars = b_bar_base * (αs / αs.mean())
1714+
17101715
# Preference shocks are muted
1711-
b_bar = 5.0
17121716
γs_pref = np.zeros(N)
17131717
ρ_pref = 0.0
17141718
17151719
A22, C2, Ub, Ud, Ub_list, Ud_list, x0 = build_gorman_extended(
17161720
n=N,
17171721
rho1=ρ1, rho2=ρ2, sigma_a=σ_a,
17181722
alphas=αs, phis=φs, sigmas=σs,
1719-
b_bar=b_bar, gammas=γs_pref,
1723+
b_bar=b_bars, gammas=γs_pref,
17201724
rho_idio=ρ_idio, rho_pref=ρ_pref,
17211725
n_absorb=n_absorb,
17221726
)
@@ -2069,14 +2073,22 @@ Once we have the redistributed Pareto weights, we can compute the new household
20692073
The function below computes household consumption and income under given Pareto weights
20702074
20712075
```{code-cell} ipython3
2072-
def allocation_from_weights(paths, econ, U_b_list, weights, γ_1, Λ, h0i=None):
2076+
def allocation_from_weights(paths, econ, U_b_list, weights, γ_1, Λ, h0i=None,
2077+
weights_for_chi=None):
20732078
"""
2074-
Compute household consumption and income under given Pareto weights.
2079+
Compute household consumption and income under given Pareto weights
2080+
while holding preference deviations fixed.
20752081
"""
20762082
20772083
weights = np.asarray(weights).reshape(-1)
20782084
N = len(weights)
20792085
2086+
# Use original weights for χ if not specified
2087+
if weights_for_chi is None:
2088+
weights_for_chi = weights
2089+
else:
2090+
weights_for_chi = np.asarray(weights_for_chi).reshape(-1)
2091+
20802092
# Extract aggregate paths
20812093
x_path = paths["x_path"]
20822094
c_agg = paths["c"]
@@ -2111,7 +2123,8 @@ def allocation_from_weights(paths, econ, U_b_list, weights, γ_1, Λ, h0i=None):
21112123
for j in range(N):
21122124
U_bj = np.asarray(U_b_list[j], dtype=float)
21132125
b_agg = econ.Sb @ x_path
2114-
b_tilde = U_bj @ z_path - weights[j] * b_agg
2126+
# Use weights_for_chi for preference deviation
2127+
b_tilde = U_bj @ z_path - weights_for_chi[j] * b_agg
21152128
21162129
η = np.zeros((n_h, T + 1))
21172130
η[:, 0] = np.asarray(h0i).reshape(-1)
@@ -2165,8 +2178,12 @@ h0i_alloc = np.array([[0.0]])
21652178
21662179
pre = allocation_from_weights(paths, econ,
21672180
Ub_list, μ_values, γ_1, Λ, h0i_alloc)
2168-
post = allocation_from_weights(paths, econ,
2169-
Ub_list, λ_star, γ_1, Λ, h0i_alloc)
2181+
2182+
# For post-redistribution, use λ* for consumption shares but μ for χ
2183+
# (preferences don't change with taxation, only the proportional share)
2184+
post = allocation_from_weights(paths, econ,
2185+
Ub_list, λ_star, γ_1, Λ, h0i_alloc,
2186+
weights_for_chi=μ_values)
21702187
21712188
c_pre = pre["c"][:, t0:]
21722189
y_pre = pre["y_net"][:, t0:]

0 commit comments

Comments
 (0)