@@ -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
17151719A22, 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
20692073The 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
21662179pre = 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
21712188c_pre = pre["c"][:, t0:]
21722189y_pre = pre["y_net"][:, t0:]
0 commit comments