Skip to content

Welfare

Back to general structure

Welfare and utility

MIMOSA separates the calculation of yearly welfare1 from the final optimisation goal. There are three ways to calculate welfare: welfare-loss-minimising, cost-minimising, and a general inequality-aversion setting that connects the first two methods. The objective can then either maximise discounted welfare or minimise discounted global costs.

The welfare module can be chosen using the parameter welfare module.

In the equations below, \(\href{./#var__accreu_sectoral::non_market_damage_costs_abs}{D^{\mathrm{NM}}_{t,r}}\) denotes monetised non-market damages, such as mortality, in the same currency units as consumption. These damages reduce the consumption-equivalent input to welfare, while reported consumption \(\href{./#var__consumption}{C_{t,r}}\) remains physical consumption. The deduction is zero when non-market damages are not included.

Usage:

params = load_params()
params["model structure"]["welfare module"] = "welfare_loss_minimising"
model = MIMOSA(params)

Welfare-loss-minimising setting

In welfare-loss-minimising setting, the utility is first calculated regionally from the per capita consumption. These regional utilities are then summed up to get the global welfare. This means that costs are weighted differently in different regions, depending on the regional per capita consumption. As a consequence, this setting leads to differentiated carbon prices across regions: poorer regions typically will have lower carbon prices than richer regions.

Difference with cost-minimising setting

In the cost-minimising setting, the regional per capita consumption values are first added up to a global per capita consumption. The utility function is only then applied to this global per capita consumption to obtain global welfare.

Equations

First, calculate regional utility from consumption after deducting non-market damages, and population: $$ \href{./#var__coacch::utility}{U_{t,r}} = \text{utility}\left(\href{./#var__coacch::consumption}{C_{t,r}} - \href{./#var__accreu_sectoral::non_market_damage_costs_abs}{D_{t,r}^{NM}}, \href{./#param__timeandregional.population}{L_{t,r}}\right) $$

Second, the global welfare is calculated as the sum of the regional utility values weighted by population: $$ \href{./#var__coacch::global_welfare}{W_t} = \sum_r \href{./#param__timeandregional.population}{L_{t,r}} \cdot \href{./#var__coacch::utility}{U_{t,r}} $$

Utility function

The utility function is a concave function of per-capita consumption, given by:

\[ \text{utility}(C, L) = \left( \left(\frac{C}{L}\right)^{1 - \href{./#param__economics.elasmu}{\text{elasmu}}} - 1 \right) \cdot \frac{1}{1 - \href{./#param__economics.elasmu}{\text{elasmu}}}\]

Here \(C\) is the consumption-equivalent input supplied after deducting non-market damages, and \(L\) is population. \(\href{./#param__economics.elasmu}{\text{elasmu}}\) is the elasticity of marginal utility. A value of \(\href{./#param__economics.elasmu}{\text{elasmu}}\) close to 1 approaches a logarithmic utility function:

Source code in mimosa/components/welfare/utility_fct.py
def calc_utility(consumption, population, elasmu):
    r"""
    The utility function is a concave function of per-capita consumption, given by:

    $$ \text{utility}(C, L) = \left( \left(\frac{C}{L}\right)^{1 - \href{./#param__economics.elasmu}{\text{elasmu}}} - 1 \right) \cdot \frac{1}{1 - \href{./#param__economics.elasmu}{\text{elasmu}}}$$

    Here $C$ is the consumption-equivalent input supplied after deducting non-market damages,
    and $L$ is [population](#param__timeandregional.population).
    $\href{./#param__economics.elasmu}{\text{elasmu}}$ is the elasticity of marginal utility. A value of $\href{./#param__economics.elasmu}{\text{elasmu}}$ close to 1 approaches a logarithmic utility function:
    ``` plotly
    {"file_path": "./assets/plots/utility_fct.json"}
    ```

    """

    # Note that the `soft_min` function is used to avoid division by zero
    return (soft_min(consumption / population) ** (1 - elasmu) - 1) / (1 - elasmu)

Parameters defined in this module

Source code in mimosa/components/welfare/welfare_loss_minimising.py
def get_constraints(
    m: ConcreteModel, inputs: ModelInputs
) -> Sequence[GeneralConstraint]:
    r"""

    <h3>Welfare-loss-minimising setting</h3>

    In welfare-loss-minimising setting, the utility is first calculated regionally
    from the per capita consumption. These regional utilities are then summed up to
    get the global welfare. This means that costs are weighted differently in different
    regions, depending on the regional per capita consumption. As a consequence, this
    setting leads to differentiated carbon prices across regions: poorer regions typically
    will have lower carbon prices than richer regions.

    ???+ info "Difference with cost-minimising setting"
        In the cost-minimising setting, the regional per capita consumption values
        are first added up to a global per capita consumption. The utility function
        is only then applied to this global per capita consumption to obtain global welfare.

    <h3>Equations</h3>

    First, calculate regional utility from consumption after deducting non-market damages, and population:
    $$ \href{./#var__coacch::utility}{U_{t,r}} = \text{utility}\left(\href{./#var__coacch::consumption}{C_{t,r}} - \href{./#var__accreu_sectoral::non_market_damage_costs_abs}{D_{t,r}^{NM}}, \href{./#param__timeandregional.population}{L_{t,r}}\right) $$

    Second, the global welfare is calculated as the sum of the regional utility values weighted by population:
    $$ \href{./#var__coacch::global_welfare}{W_t} = \sum_r \href{./#param__timeandregional.population}{L_{t,r}} \cdot \href{./#var__coacch::utility}{U_{t,r}} $$

    <h3>Utility function</h3>
    :::mimosa.components.welfare.utility_fct.calc_utility


    <h3>Parameters defined in this module</h3>
    - params["economics"]["elasmu"]: Elasticity of marginal utility. Type: float. Default: 1.001. Min: 0.1. Max: 10.

    """
    constraints = []

    # Parameters
    m.elasmu = Param(initialize=inputs.config("economics.elasmu"))

    m.utility = Var(
        m.t,
        m.regions,
        initialize=0.1,
        doc="Regional per-capita utility, calculated from consumption after deducting monetised non-market damages, using the elasticity of marginal utility.",
    )
    m.global_welfare = Var(
        m.t,
        doc="Undiscounted global welfare at each timestep, calculated as the sum of regional per-capita utilities weighted by population.",
    )

    constraints.extend(
        [
            RegionalEquation(
                m.utility,
                lambda m, t, r: calc_utility(
                    m.consumption[t, r] - m.non_market_damage_costs_abs[t, r],
                    m.population[t, r],
                    m.elasmu,
                ),
            ),
            GlobalEquation(
                m.global_welfare,
                lambda m, t: sum(
                    m.population[t, r] * m.utility[t, r] for r in m.regions
                ),
            ),
        ]
    )

    return constraints

Usage:

params = load_params()
params["model structure"]["welfare module"] = "cost_minimising"
model = MIMOSA(params)

Cost-minimising setting

In cost-minimising setting, the global per-capita consumption is first calculated before applying the utility function. This means that costs are weighted equally across regions, regardless of the regional per capita consumption. As a consequence, this setting leads to uniform carbon prices across regions. This is quantitatively similar to using Negishi weights.

Difference with welfare-loss-minimising setting

In the welfare-loss-minimising setting, the utility function is applied to the regional per capita consumption values, and the regional utilities are then summed up to get the global welfare. This means that costs (from mitigation or damages) have a larger weight in the final welfare in poorer regions than in richer regions.

Equations

First, aggregate consumption after deducting non-market damages, and population:

\[ \widehat{C}_{t} = \sum_r \left(\href{./#var__welfare_cost_minimising::consumption}{C_{t,r}} - \href{./#var__accreu_sectoral::non_market_damage_costs_abs}{D^{\mathrm{NM}}_{t,r}}\right), \]
\[ \widehat{L}_{t} = \sum_r \href{./#param__timeandregional.population}{L_{t,r}}. \]

These are used to calculate the global utility:

\[ \href{./#var__welfare_cost_minimising::global_welfare}{W_t} = \widehat{L}_t \cdot \text{utility}\left( \widehat{C}_{t}, \widehat{L}_{t} \right) \]

Utility function

The utility function is a concave function of per-capita consumption, given by:

\[ \text{utility}(C, L) = \left( \left(\frac{C}{L}\right)^{1 - \href{./#param__economics.elasmu}{\text{elasmu}}} - 1 \right) \cdot \frac{1}{1 - \href{./#param__economics.elasmu}{\text{elasmu}}}\]

Here \(C\) is the consumption-equivalent input supplied after deducting non-market damages, and \(L\) is population. \(\href{./#param__economics.elasmu}{\text{elasmu}}\) is the elasticity of marginal utility. A value of \(\href{./#param__economics.elasmu}{\text{elasmu}}\) close to 1 approaches a logarithmic utility function:

Source code in mimosa/components/welfare/utility_fct.py
def calc_utility(consumption, population, elasmu):
    r"""
    The utility function is a concave function of per-capita consumption, given by:

    $$ \text{utility}(C, L) = \left( \left(\frac{C}{L}\right)^{1 - \href{./#param__economics.elasmu}{\text{elasmu}}} - 1 \right) \cdot \frac{1}{1 - \href{./#param__economics.elasmu}{\text{elasmu}}}$$

    Here $C$ is the consumption-equivalent input supplied after deducting non-market damages,
    and $L$ is [population](#param__timeandregional.population).
    $\href{./#param__economics.elasmu}{\text{elasmu}}$ is the elasticity of marginal utility. A value of $\href{./#param__economics.elasmu}{\text{elasmu}}$ close to 1 approaches a logarithmic utility function:
    ``` plotly
    {"file_path": "./assets/plots/utility_fct.json"}
    ```

    """

    # Note that the `soft_min` function is used to avoid division by zero
    return (soft_min(consumption / population) ** (1 - elasmu) - 1) / (1 - elasmu)

Parameters defined in this module

Source code in mimosa/components/welfare/cost_minimising.py
def get_constraints(
    m: ConcreteModel, inputs: ModelInputs
) -> Sequence[GeneralConstraint]:
    r"""

    <h3>Cost-minimising setting</h3>

    In cost-minimising setting, the global per-capita consumption is first calculated before
    applying the utility function. This means that costs are weighted equally across regions,
    regardless of the regional per capita consumption. As a consequence, this setting leads to
    uniform carbon prices across regions. This is quantitatively similar to using Negishi weights.

    ???+ info "Difference with welfare-loss-minimising setting"
        In the welfare-loss-minimising setting, the utility function is applied to the regional
        per capita consumption values, and the regional utilities are then summed up to get the
        global welfare. This means that costs (from mitigation or damages) have a larger weight in
        the final welfare in poorer regions than in richer regions.


    <h3>Equations</h3>

    First, aggregate consumption after deducting non-market damages, and population:

    $$ \widehat{C}_{t} = \sum_r \left(\href{./#var__welfare_cost_minimising::consumption}{C_{t,r}} - \href{./#var__accreu_sectoral::non_market_damage_costs_abs}{D^{\mathrm{NM}}_{t,r}}\right), $$

    $$ \widehat{L}_{t} = \sum_r \href{./#param__timeandregional.population}{L_{t,r}}. $$

    These are used to calculate the global utility:

    $$ \href{./#var__welfare_cost_minimising::global_welfare}{W_t} = \widehat{L}_t \cdot \text{utility}\left( \widehat{C}_{t}, \widehat{L}_{t} \right) $$

    <h3>Utility function</h3>
    :::mimosa.components.welfare.utility_fct.calc_utility


    <h3>Parameters defined in this module</h3>
    - params["economics"]["elasmu"]: Elasticity of marginal utility. Type: float. Default: 1.001. Min: 0.1. Max: 10.

    """
    constraints = []

    # Parameters
    m.elasmu = Param(initialize=inputs.config("economics.elasmu"))

    m.utility = Var(
        m.t,
        m.regions,
        initialize=10,
        doc="Regional consumption per person after deducting monetised non-market damages, reported as the utility variable in the cost-minimising setting.",
    )
    m.global_welfare = Var(
        m.t,
        doc="Undiscounted global welfare, calculated by applying the utility function to global per-capita consumption after non-market damages and multiplying by global population.",
    )

    constraints.extend(
        [
            RegionalEquation(
                m.utility,
                lambda m, t, r: (
                    m.consumption[t, r] - m.non_market_damage_costs_abs[t, r]
                )
                / m.population[t, r],
            ),
            GlobalEquation(
                m.global_welfare,
                lambda m, t: m.global_population[t]
                * calc_utility(
                    sum(
                        m.consumption[t, r] - m.non_market_damage_costs_abs[t, r]
                        for r in m.regions
                    ),
                    sum(m.population[t, r] for r in m.regions),
                    m.elasmu,
                ),
            ),
        ]
    )

    return constraints

Usage:

params = load_params()
params["model structure"]["welfare module"] = "inequal_aversion_general"
model = MIMOSA(params)

General inequality aversion

This setting makes the weight given to inequality between regions explicit. Let \(\href{./#var__welfare_inequal_aversion_general::consumption}{C_{t,r}}\) be regional consumption, \(\href{./#param__timeandregional.population}{L_{t,r}}\) population, \(\href{./#param__economics.inequal_aversion}{\eta}\) the inequality-aversion parameter (inequal_aversion), and \(\href{./#param__economics.elasmu}{\mu}\) the elasticity of marginal utility (elasmu). MIMOSA first calculates:

\[ \href{./#var__welfare_inequal_aversion_general::utility}{U_{t,r}} = \href{./#param__timeandregional.population}{L_{t,r}} \left(\frac{\href{./#var__welfare_inequal_aversion_general::consumption}{C_{t,r}} - \href{./#var__accreu_sectoral::non_market_damage_costs_abs}{D^{\mathrm{NM}}_{t,r}}}{\href{./#param__timeandregional.population}{L_{t,r}}}\right)^{1-\href{./#param__economics.inequal_aversion}{\eta}}. \]

The regional values are then aggregated into yearly welfare:

\[ \href{./#var__welfare_inequal_aversion_general::global_welfare}{W_t} = \frac{L_t}{1-\href{./#param__economics.elasmu}{\mu}} \left(\frac{\sum_r \href{./#var__welfare_inequal_aversion_general::utility}{U_{t,r}}}{L_t}\right)^{ \frac{1-\href{./#param__economics.elasmu}{\mu}}{1-\href{./#param__economics.inequal_aversion}{\eta}}}. \]

A higher \(\href{./#param__economics.inequal_aversion}{\eta}\) gives relatively more weight to consumption changes in poorer regions. Setting \(\href{./#param__economics.inequal_aversion}{\eta}=0\) gives the same policy weighting as the cost-minimising setting, while setting \(\href{./#param__economics.inequal_aversion}{\eta}=\href{./#param__economics.elasmu}{\mu}\) gives the same policy weighting as the welfare-loss-minimising setting. The welfare levels can differ by terms that do not depend on the policy controls.

Parameters defined in this module

Source code in mimosa/components/welfare/inequal_aversion_general.py
def get_constraints(
    m: ConcreteModel, inputs: ModelInputs
) -> Sequence[GeneralConstraint]:
    r"""
    <h3>General inequality aversion</h3>

    This setting makes the weight given to inequality between regions explicit. Let $\href{./#var__welfare_inequal_aversion_general::consumption}{C_{t,r}}$
    be regional consumption, $\href{./#param__timeandregional.population}{L_{t,r}}$ population, $\href{./#param__economics.inequal_aversion}{\eta}$ the inequality-aversion parameter
    (`inequal_aversion`), and $\href{./#param__economics.elasmu}{\mu}$ the elasticity of marginal utility (`elasmu`). MIMOSA first
    calculates:

    $$
    \href{./#var__welfare_inequal_aversion_general::utility}{U_{t,r}} = \href{./#param__timeandregional.population}{L_{t,r}}
    \left(\frac{\href{./#var__welfare_inequal_aversion_general::consumption}{C_{t,r}} - \href{./#var__accreu_sectoral::non_market_damage_costs_abs}{D^{\mathrm{NM}}_{t,r}}}{\href{./#param__timeandregional.population}{L_{t,r}}}\right)^{1-\href{./#param__economics.inequal_aversion}{\eta}}.
    $$

    The regional values are then aggregated into yearly welfare:

    $$
    \href{./#var__welfare_inequal_aversion_general::global_welfare}{W_t} = \frac{L_t}{1-\href{./#param__economics.elasmu}{\mu}}
    \left(\frac{\sum_r \href{./#var__welfare_inequal_aversion_general::utility}{U_{t,r}}}{L_t}\right)^{
    \frac{1-\href{./#param__economics.elasmu}{\mu}}{1-\href{./#param__economics.inequal_aversion}{\eta}}}.
    $$

    A higher $\href{./#param__economics.inequal_aversion}{\eta}$ gives relatively more weight to consumption changes in poorer regions.
    Setting $\href{./#param__economics.inequal_aversion}{\eta}=0$ gives the same policy weighting as the cost-minimising setting, while
    setting $\href{./#param__economics.inequal_aversion}{\eta}=\href{./#param__economics.elasmu}{\mu}$ gives the same policy weighting as the welfare-loss-minimising
    setting. The welfare levels can differ by terms that do not depend on the policy controls.

    <h3>Parameters defined in this module</h3>
    - params["economics"]["elasmu"]: Elasticity of marginal utility. Type: float. Default: 1.001. Min: 0.1. Max: 10.
    - param::inequal_aversion

    """
    constraints = []

    # Parameters
    m.elasmu = Param(initialize=inputs.config("economics.elasmu"))
    m.inequal_aversion = Param(initialize=inputs.config("economics.inequal_aversion"))

    m.utility = Var(
        m.t,
        m.regions,
        initialize=10,
        doc="Regional welfare contribution, equal to population times welfare-adjusted consumption per person raised to one minus inequality aversion. Welfare-adjusted consumption deducts monetised non-market damages.",
    )
    m.global_welfare = Var(
        m.t,
        doc="Undiscounted global welfare, calculated by aggregating regional welfare contributions with the configured inequality aversion and elasticity of marginal utility.",
    )

    constraints.extend(
        [
            RegionalEquation(
                m.utility,
                lambda m, t, r: calc_regional_utility(
                    m.consumption[t, r] - m.non_market_damage_costs_abs[t, r],
                    m.population[t, r],
                    m.inequal_aversion,
                ),
            ),
            GlobalEquation(
                m.global_welfare,
                lambda m, t: sum(m.population[t, r] for r in m.regions)
                * calc_global_utility(
                    sum(m.utility[t, r] for r in m.regions),
                    m.global_population[t],
                    m.elasmu,
                    m.inequal_aversion,
                ),
            ),
        ]
    )

    return constraints

Optimisation goal and discounting

The welfare module determines how regional consumption is aggregated into global_welfare. The separate objective module determines what MIMOSA optimises:

  • utility (default) maximises discounted global_welfare.
  • globalcosts minimises discounted mitigation and damage costs.

The objective can be selected in the model configuration:

params = load_params()
params["model structure"]["objective module"] = "globalcosts"
model = MIMOSA(params)

With the utility objective, MIMOSA calculates:

\[ \href{./#var__NPV}{\text{NPV}_t} = \href{./#var__NPV}{\text{NPV}_{t-1}} + \Delta t \cdot e^{-\href{./#param__economics.PRTP}{\text{PRTP}}(\text{year}_t-\href{./#param__time.start}{\text{begin year}})} \cdot \href{./#var__global_welfare}{\text{yearly welfare}_t}, \]

This is a discrete approximation of the integral of discounted yearly welfare from the beginning year \(\href{./#param__time.start}{t_0}\) to the final year \(\href{./#param__time.end}{T}\):

\[ \href{./#var__NPV}{\text{NPV}}(\href{./#param__time.end}{T}) = \int_{\href{./#param__time.start}{t_0}}^{\href{./#param__time.end}{T}} e^{-\href{./#param__economics.PRTP}{\text{PRTP}}(t-\href{./#param__time.start}{t_0})} \cdot \href{./#var__global_welfare}{\text{yearly welfare}(t)}\, dt. \]

MIMOSA maximises the final value of NPV. With the global-cost objective, global_welfare is replaced by:

\[ \text{global costs}_t = \sum_r \left( \href{./#var__objective_globalcosts::mitigation_costs_abs}{\text{mitigation costs abs}_{t,r}} + \href{./#var__objective_globalcosts::damage_costs}{\text{damage costs}_{t,r}} \cdot \href{./#var__objective_globalcosts::GDP_gross}{\text{GDP gross}_{t,r}} \right), \]

and the final NPV is minimised. The welfare variables are still calculated in this case, but they do not determine the objective.

PRTP is the pure rate of time preference. A higher value gives less weight to outcomes further in the future. The factor \(\Delta t\) accounts for the number of years represented by each timestep.

The main result variables are:

Variable Meaning
utility Regional utility or consumption measure, depending on the selected welfare module
global_welfare Welfare aggregated across regions for one timestep
NPV Discounted welfare under the utility objective, or discounted costs under the global-cost objective

  1. While the terms welfare and utility can be used interchangeably, we typically refer to utility as the regional utility, and welfare as the global population-weighted utility. ↩