Skip to content

Welfare

Back to general structure

Welfare and utility

The optimisation goal of MIMOSA is to maximise discounted welfare or utility1. There are three ways to calculate welfare in MIMOSA: welfare-loss-minimising, cost-minimising, and a general inequality aversion setting which is the generalised version of the first two methods.

The welfare module can be chosen using the parameter params["model"]["welfare module"].

Usage:

params = load_params()
params["model"]["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

  • elasmu: Elasticity of marginal utility. Type: float. Default: 1.001. Min: 0.1. Max: 10.
Source code in mimosa/components/welfare/welfare_loss_minimising.py
def get_constraints(m: AbstractModel) -> 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>
    - 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.yearly_welfare = Var(m.t)

    constraints.extend(
        [
            RegionalConstraint(
                lambda m, t, r: m.utility[t, r]
                == calc_utility(m.consumption[t, r], m.population[t, r], m.elasmu),
                "utility",
            ),
            GlobalConstraint(
                lambda m, t: m.yearly_welfare[t]
                == sum(m.population[t, r] * m.utility[t, r] for r in m.regions),
                "yearly_welfare",
            ),
        ]
    )

    return constraints

Usage:

params = load_params()
params["model"]["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

  • elasmu: Elasticity of marginal utility. Type: float. Default: 1.001. Min: 0.1. Max: 10.
Source code in mimosa/components/welfare/cost_minimising.py
def get_constraints(m: AbstractModel) -> 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>
    - 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.yearly_welfare = Var(m.t)

    constraints.extend(
        [
            RegionalConstraint(
                lambda m, t, r: m.utility[t, r]
                == m.consumption[t, r] / m.population[t, r],
                "utility",
            ),
            GlobalConstraint(
                lambda m, t: m.yearly_welfare[t]
                == sum(m.population[t, r] for r in m.regions)
                * calc_utility(
                    sum(m.consumption[t, r] for r in m.regions),
                    sum(m.population[t, r] for r in m.regions),
                    m.elasmu,
                ),
                "yearly_welfare",
            ),
        ]
    )

    return constraints

Usage:

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

General inequality aversion

TODO

Parameters defined in this module

  • elasmu: Elasticity of marginal utility. Type: float. Default: 1.001. Min: 0.1. Max: 10.
  • param::inequal_aversion
Source code in mimosa/components/welfare/inequal_aversion_general.py
def get_constraints(m: AbstractModel) -> Sequence[GeneralConstraint]:
    """
    <h3>General inequality aversion</h3>

    TODO

    <h3>Parameters defined in this module</h3>
    - 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.yearly_welfare = Var(m.t)

    constraints.extend(
        [
            RegionalConstraint(
                lambda m, t, r: m.utility[t, r]
                == calc_regional_utility(
                    m.consumption[t, r], m.population[t, r], m.inequal_aversion
                ),
                "utility",
            ),
            GlobalConstraint(
                lambda m, t: m.yearly_welfare[t]
                == sum(m.population[t, r] for r in m.regions)
                * calc_global_utility(
                    sum(m.utility[t, r] for r in m.regions),
                    sum(m.population[t, r] for r in m.regions),
                    m.elasmu,
                    m.inequal_aversion,
                ),
                "yearly_welfare",
            ),
        ]
    )

    return constraints

Optimisation goal and discounting

TODO


  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.