Skip to content

🇬🇧 English · 🇪🇸 Español

Incidencia distributiva en los hogares

puremacro.trade.distributional combina canastas observadas de gasto por grupo con precios de comprador, cambios en ingresos nominales y transferencias fiscales proporcionados por el usuario. Calcula variación equivalente (EV) y variación compensatoria (CV) estáticas exactas mediante el motor de preferencias de los hogares.

Es incidencia de equilibrio parcial condicionada a los precios e ingresos proporcionados. Los precios pueden proceder de una solución de equilibrio general auditada o de un escenario supuesto explícitamente. La demanda de los hogares no retroalimenta producción, comercio ni precios de factores. El resultado no es un nuevo equilibrio general ni una estimación causal del efecto de un arancel. Una canasta observada no identifica transmisión a precios, respuestas del ingreso ni elasticidades de preferencias.

Medias de grupo y factores de expansión

prepare_household_groups recibe:

Entrada Significado requerido
expenditure DataFrame con grupos en filas y sectores etiquetados en columnas; gasto monetario medio por unidad representada, no totales del grupo
population_weights Conteos de expansión positivos por grupo, en la misma unidad representada
baseline_budget Series opcional que debe coincidir con la suma del gasto de cada fila
income_exposure DataFrame opcional de grupo por fuente de ingreso, con ingresos nominales iniciales por unidad representada
monetary_unit, period, population_unit Escala monetaria, periodo de gasto y unidad representada explícitos
provenance Diccionario de procedencia; source es obligatorio y se conservan las marcas de datos sintéticos o fixtures de regresión

Las etiquetas deben ser cadenas únicas y no vacías. Las entradas se alinean por etiquetas; las etiquetas faltantes, adicionales o duplicadas producen un error. Los precios deben ser positivos y finitos. Gasto y exposición de ingreso deben ser finitos y no negativos; cada grupo necesita gasto total positivo. No se eliminan grupos ni se imputan observaciones silenciosamente.

Con microdatos y factores de expansión w_i, calcule el gasto medio sectorial como sum(w_i * gasto_i_sector) / sum(w_i) y el conteo del grupo como sum(w_i). Use la misma muestra completa y el mismo denominador para todos los sectores, incluidos los hogares que no compraron en un sector. Un promedio publicado entre compradores positivos no es el promedio incondicional del grupo. No sume repetidamente los factores de expansión en cada registro sectorial. La unidad de gasto debe concordar con ponderaciones de hogares o personas.

Las medias definen grupos representativos. El bienestar no lineal calculado con esas medias no equivale al bienestar individual promedio ponderado de los hogares. Cuando esa diferencia importe y los datos lo permitan, use una fila por hogar.

El ingreso expuesto puede superar el gasto observado: ahorro, recursos no monetarios y otros ingresos pueden diferir. El escenario supone que todo el ingreso nominal incremental expuesto se gasta, manteniendo fijo el resto del gasto inicial. Es un supuesto de comportamiento explícito, no una propensión a consumir estimada. Las fuentes pueden distinguir factor y sector, por ejemplo manufacturing_labor o agriculture_capital.

Un escenario sintético pequeño

Estas cifras son inventadas para mostrar la interfaz. No constituyen una economía calibrada, una estimación de encuesta ni un pronóstico arancelario.

import pandas as pd
from puremacro.trade.distributional import (
    prepare_household_groups, compute_distributional_welfare,
)

spending = pd.DataFrame(
    [[60.0, 40.0], [40.0, 160.0]],
    index=["lower_income", "higher_income"], columns=["food", "other"],
)
groups = prepare_household_groups(
    spending,
    pd.Series([300.0, 100.0], index=spending.index),
    income_exposure=pd.DataFrame(
        {"labor": [80.0, 100.0], "capital": [20.0, 100.0]}, index=spending.index,
    ),
    monetary_unit="illustrative currency units", period="quarter",
    population_unit="households",
    provenance={"source": "two-group synthetic illustration", "is_synthetic": True},
)
result = compute_distributional_welfare(
    groups,
    base_prices=pd.Series({"food": 1.0, "other": 1.0}),
    prices=pd.Series({"food": 1.20, "other": 0.90}),
    factor_income_changes=pd.Series({"labor": 0.10, "capital": -0.05}),
    transfer_total=1400.0,
    transfer_weights=pd.Series({"lower_income": 2.0, "higher_income": 1.0}),
    rule="cobb_douglas",
)
print(result.groups[["baseline_budget", "income_change", "transfer", "ev", "ev_pct"]])
print(result.aggregate[["total_transfer", "total_ev", "ev_pct", "mean_ev_pct"]])
print(result.summary())
result.plot()

factor_income_changes usa fracciones: 0.10 significa +10% y -1 la pérdida completa de esa fuente. Sus etiquetas deben coincidir exactamente con las columnas de exposición. Omitir cambios significa mantener el ingreso.

La razón prices / base_prices normaliza los precios sectoriales respecto al gasto inicial suministrado. Los dos estados y los cambios nominales de ingreso deben usar un numerario común. Escalar uniformemente precios y todos los recursos nominales deja intacto el bienestar real.

Transferencias y agregación

transfer_total es el cambio agregado en la recaudación asignada a los hogares representados, en la moneda y periodo del gasto. Un valor negativo es un retiro agregado. Se proporciona explícitamente: el puente no lo infiere del ingreso del gobierno del modelo GE ni del ingreso factorial del hogar.

transfer_weights contiene puntajes no negativos de asignación por unidad representada, a_g:

transferencia_por_unidad[g] = transfer_total * a_g / sum_h(population_weight[h] * a_h)
sum_g(population_weight[g] * transferencia_por_unidad[g]) = transfer_total

Por defecto cada unidad recibe la misma transferencia; los totales por grupo pueden diferir. En el ejemplo, cada hogar de menor ingreso recibe cuatro unidades monetarias y cada hogar de mayor ingreso dos: 300*4 + 100*2 = 1400. Evite contar esas transferencias de nuevo dentro de los cambios de ingreso. Los pesos normalizados representan una población de tamaño uno; el monto agregado debe usar esa misma escala. Convierta unidades explícitamente si una tabla GE usa millones y la encuesta usa moneda por hogar.

result.groups informa montos por unidad representada y porcentajes respecto al gasto inicial de cada grupo. result.aggregate.total_ev y total_cv suman esos montos con los factores de expansión. ev_pct agregado divide EV total entre gasto inicial total; mean_ev_pct promedia los porcentajes de los grupos usando pesos de población. Responden preguntas distintas. Ninguna agregación es una función de bienestar social ni una comparación interpersonal de utilidad.

Preferencias y atribución exacta

Las reglas son "fixed_baskets", "cobb_douglas", "ces" y "stone_geary". CES acepta ces_elasticity. LES acepta expenditure_elasticities como DataFrame de grupo por sector y supernumerary_share como escalar o Series por grupo. Omitir las elasticidades LES supone valores unitarios; omitir su fracción supernumeraria usa el supuesto explícito 0.5 del motor existente. La auditoría, la reparación de suma ponderada, la marca de fracción asumida y los ajustes de elasticidades quedan en metadata["preference_calibration"]. El gasto observado por sí solo no estima esos parámetros.

El motor define EV = e(p0,u1) - e(p0,u0) y CV = e(p1,u1) - e(p1,u0). Ambas son positivas ante ganancias; CV es el monto que podría retirarse a los precios nuevos. Los porcentajes usan el gasto inicial observado como denominador.

price_ev, income_ev y transfer_ev suman exactamente ev; las columnas análogas _cv suman cv. Son diferencias de bienestar ancladas a la misma base original, siguiendo precios → ingreso factorial → transferencias. Esta atribución descriptiva depende del orden; no es causal ni un promedio Shapley. Se verifica el dominio de preferencias en cada etapa. Una etapa de precios LES que agote los recursos de subsistencia produce un error aunque una transferencia posterior pudiera rescatar el estado final.

Puente desde un modelo de comercio resuelto

distributional_welfare_from_results(groups, calib, baseline, counterfactual, country=..., factor_income_changes=..., **scenario_options) obtiene los precios sectoriales de un país mediante household_prices_from_result y reutiliza su auditoría del equilibrio. Ambos estados deben haber convergido, usar el mismo modo contable y conservar exactamente las etiquetas ordenadas de países y sectores de la calibración. Los sectores de los hogares deben coincidir con los de la calibración.

El mapeo explícito del ingreso es una Series desde las fuentes de ingreso del hogar hacia cambios nominales fraccionales. Asociar salarios nacionales con ingresos laborales de encuesta sigue siendo una decisión del investigador. El presupuesto agregado de consumo GE no reemplaza los presupuestos de los grupos. baseline_tau_fd y tau_fd, si se suministran, se contrastan con los esquemas de demanda final registrados en los dos resultados. Las canastas y restricciones sobre modelos flexibles son las del puente de precios de los hogares.

Dentro de cada sector, todos los grupos heredan la canasta GE de orígenes del país seleccionado. Las diferencias de gasto sectorial no identifican cuotas domésticas/importadas particulares de cada grupo. Si un sector tiene peso nulo en esa categoría GE pero gasto positivo en la encuesta, el puente produce un error: el precio unitario de relleno del motor no puede valorar ese gasto. Para emplear un precio sectorial estimado por separado o un mapeo de orígenes explícito diferente, construya esos precios de comprador y llame directamente a compute_distributional_welfare. El supuesto de orígenes heredados y los sectores con ceros estructurales no utilizados quedan registrados en los metadatos.

El resultado conserva procedencia de los hogares, calibración y metadatos de ambos equilibrios. Se propaga la marca superior is_regression_fixture cuando alguna entrada la contiene. Los resultados basados en un fixture de regresión siguen siendo ejercicios con ese fixture; añadir gasto de encuesta no convierte el escenario de precios GE en evidencia empírica.

Los resultados ofrecen summary(), to_frame() / to_dataframe(), to_markdown(), to_latex(), to_typst() y plot().