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.

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 the regional utility using the regional consumption \(C_{t,r}\) and population \(L_{t,r}\): $$ U_{t,r} = \text{utility}(C_{t,r}, L_{t,r}) $$

Second, the global welfare is calculated as the sum of the regional utility values weighted by population: $$ W_t = \sum_r L_{t,r} \cdot 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 - \text{elasmu}} - 1 \right) \cdot \frac{1}{1 - \text{elasmu}}\]

where \(C\) is the consumption and \(L\) the population of a region. \(\text{elasmu}\) is the elasticity of marginal utility. A value of \(\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):
    """
    The utility function is a concave function of per-capita consumption, given by:

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

    where $C$ is the consumption and $L$ the population of a region. $\\text{elasmu}$ is the elasticity of marginal utility. A value of $\\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: AbstractModel, context: ModelContext
) -> Sequence[GeneralConstraint]:
    """

    <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 the regional utility using the regional consumption $C_{t,r}$ and population $L_{t,r}$:
    $$ U_{t,r} = \\text{utility}(C_{t,r}, L_{t,r}) $$

    Second, the global welfare is calculated as the sum of the regional utility values weighted by population:
    $$ W_t = \\sum_r L_{t,r} \\cdot 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(doc="::economics.elasmu")

    m.utility = Var(m.t, m.regions, initialize=0.1)
    m.global_welfare = Var(m.t)

    constraints.extend(
        [
            RegionalEquation(
                m.utility,
                lambda m, t, r: calc_utility(
                    m.consumption[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, calculate the global consumption \(C_{t,r}\) and population \(L_{t,r}\):

\[ \widehat{C}_{t} = \sum_r C_{t,r}, \]
\[ \widehat{L}_{t} = \sum_r L_{t,r}. \]

These are used to calculate the global utility:

\[ 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 - \text{elasmu}} - 1 \right) \cdot \frac{1}{1 - \text{elasmu}}\]

where \(C\) is the consumption and \(L\) the population of a region. \(\text{elasmu}\) is the elasticity of marginal utility. A value of \(\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):
    """
    The utility function is a concave function of per-capita consumption, given by:

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

    where $C$ is the consumption and $L$ the population of a region. $\\text{elasmu}$ is the elasticity of marginal utility. A value of $\\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: AbstractModel, context: ModelContext
) -> Sequence[GeneralConstraint]:
    """

    <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, calculate the global consumption $C_{t,r}$ and population $L_{t,r}$:

    $$ \\widehat{C}_{t} = \\sum_r C_{t,r}, $$

    $$ \\widehat{L}_{t} = \\sum_r L_{t,r}. $$

    These are used to calculate the global utility:

    $$ 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(doc="::economics.elasmu")

    m.utility = Var(m.t, m.regions, initialize=10)
    m.global_welfare = Var(m.t)

    constraints.extend(
        [
            RegionalEquation(
                m.utility, lambda m, t, r: m.consumption[t, r] / m.population[t, r]
            ),
            GlobalEquation(
                m.global_welfare,
                lambda m, t: m.global_population[t]
                * calc_utility(
                    sum(m.consumption[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 \(C_{t,r}\) be regional consumption, \(L_{t,r}\) population, \(\eta\) the inequality-aversion parameter (inequal_aversion), and \(\mu\) the elasticity of marginal utility (elasmu). MIMOSA first calculates:

\[ U_{t,r} = L_{t,r} \left(\frac{C_{t,r}}{L_{t,r}}\right)^{1-\eta}. \]

The regional values are then aggregated into yearly welfare:

\[ W_t = \frac{L_t}{1-\mu} \left(\frac{\sum_r U_{t,r}}{L_t}\right)^{ \frac{1-\mu}{1-\eta}}. \]

A higher \(\eta\) gives relatively more weight to consumption changes in poorer regions. Setting \(\eta=0\) gives the same policy weighting as the cost-minimising setting, while setting \(\eta=\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: AbstractModel, context: ModelContext
) -> Sequence[GeneralConstraint]:
    """
    <h3>General inequality aversion</h3>

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

    $$
    U_{t,r} = L_{t,r}
    \\left(\\frac{C_{t,r}}{L_{t,r}}\\right)^{1-\\eta}.
    $$

    The regional values are then aggregated into yearly welfare:

    $$
    W_t = \\frac{L_t}{1-\\mu}
    \\left(\\frac{\\sum_r U_{t,r}}{L_t}\\right)^{
    \\frac{1-\\mu}{1-\\eta}}.
    $$

    A higher $\\eta$ gives relatively more weight to consumption changes in poorer regions.
    Setting $\\eta=0$ gives the same policy weighting as the cost-minimising setting, while
    setting $\\eta=\\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(doc="::economics.elasmu")
    m.inequal_aversion = Param(doc="::economics.inequal_aversion")

    m.utility = Var(m.t, m.regions, initialize=10)
    m.global_welfare = Var(m.t)

    constraints.extend(
        [
            RegionalEquation(
                m.utility,
                lambda m, t, r: calc_regional_utility(
                    m.consumption[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:

\[ \text{NPV}_t = \text{NPV}_{t-1} + \Delta t \cdot e^{-\text{PRTP}(\text{year}_t-\text{begin year})} \cdot \text{yearly welfare}_t, \]

This is a discrete approximation of the integral of discounted yearly welfare from the beginning year \(t_0\) to the final year \(T\):

\[ \text{NPV}(T) = \int_{t_0}^{T} e^{-\text{PRTP}(t-t_0)} \cdot \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( \text{mitigation costs abs}_{t,r} + \text{damage costs}_{t,r} \cdot \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.