Skip to content

Expected Value Computation

This page explains how the model turns impact multipliers and characteristics into expected values.

Terminology

Term Meaning
Impact Differentiator The multiplier name defined in the imp sheet.
SOW In Weight Type values, the multiplier: its sampled value for the simulation. (Historically "state of the world".)
OC In Weight Type values, the characteristic: the opportunity's value from the fos sheet for the same multiplier.

Overview

The engine computes expected values in three stages:

  1. Combine each sampled multiplier with the corresponding characteristic.
  2. Multiply those per-multiplier values together to get a base expected value for each opportunity and simulation.
  3. Propagate that base expected value across years using time discounts.

After that, portfolio optimisation scales each bracket's funding by its bracket decline, bracket factor and utility decline parameter.

For the separate post-EV noise step driven by Model Coverage, see Noise And Model Coverage.

Step 1: Combine Multiplier And Characteristic

For each impact multiplier, the engine combines:

  • the sampled multiplier value from imp, and
  • the opportunity-specific value from fos.

It does so according to the multiplier type:

Type How the opportunity-level value is computed
SOW x OC Multiply the sampled multiplier by the characteristic.
OC ^ SOW Raise the characteristic to the sampled multiplier.
SOW ^ OC Raise the sampled multiplier to the characteristic.

These are the only multiplier types used in the base expected-value calculation.

Step 2: Multiply Across Multipliers

Once the engine has one value per multiplier, it multiplies those values together to get the base expected value for that opportunity in that simulation.

Important detail:

  • If an characteristic entry is NA for a multiplier, that term is omitted from the product rather than making the whole expected value NA.
  • If all multiplier values were NA, the current code would behave like the product of an empty set and return 1.

Step 3: Propagate Expected Values Across Years

Time discounts are not part of the base expected-value calculation. They are applied afterwards when the engine expands expected values across years.

TempModifier-Compounded

This creates a year-by-year propagation factor.

  • Year 1 starts from the opportunity-specific value.
  • Later years repeatedly apply the sampled multiplier.
  • If no compounded time discount is provided, the engine inserts a default value of 1.

Example:

Suppose:

  • the sampled time discount is 0.95,
  • the opportunity-specific value is 1,
  • the model has 4 years.
Year Applied factor
1 starts at the opportunity-specific value = 1.0000
2 1.0000 * 0.95 = 0.9500
3 0.9500 * 0.95 = 0.9025
4 0.9025 * 0.95 = 0.8574

The same opportunity's expected value is therefore multiplied by a smaller factor in later years.

TempModifier-SingleYear

This adds an extra one-year adjustment.

  • It is applied only in years whose analysis-year number appears in the multiplier name.
  • It multiplies whatever compounded factor is already in force for that year.

Example:

  • a multiplier named GrantDelay2,
  • sampled value 0.8,
  • opportunity-specific value 1.

Then:

  • year 1: no extra effect from GrantDelay2
  • year 2: expected value gets an extra 0.8 multiplier
  • later years: no extra effect from GrantDelay2 unless another single-year modifier matches them

UtilityDeclineParameter

UtilityDeclineParameter is not applied directly to the base expected value. Instead, it is used later when the engine builds the per-bracket factors that scale funding in portfolio optimisation.

Important implementation detail:

  • UtilityDeclineParameter is a sampled multiplier from imp.
  • It does not use a corresponding characteristic from fos.
  • The engine excludes it from the base expected-value calculation and then reads its sampled value directly when constructing those per-bracket factors.

The implementation combines three pieces:

Component Source How it enters the effective multiplier
Bracket decline orgmeta rows Discount N (alias Utility decline N) Applied as (1 - decline)
Bracket factor orgmeta rows Utility multiplier N Applied multiplicatively
Utility decline parameter imp row whose Weight Type is UtilityDeclineParameter Converted into an additional per-bracket decline, added to the bracket decline and capped at 1

How The Computed Decline Is Derived

For each simulation:

  1. The engine takes the sampled UtilityDeclineParameter value.
  2. It clamps that value into [0, 1].
  3. It converts it into an exponent:

exponent = log2(p + 1)

  1. For each opportunity, it computes cumulative funding across brackets using the Room for funding values from orgmeta.
  2. It then computes the marginal utility of each bracket from the function:

total_utility = cumulative_funding ^ exponent

  1. From that, it derives bracket-level cost-effectiveness:

ce = (utility gain from the bracket) / (funding in the bracket)

  1. Finally, it converts that into a computed decline:

computed_decline = 1 - ce

So the computed decline is:

  • simulation-specific because it depends on the sampled UtilityDeclineParameter,
  • opportunity-specific because opportunities can have different funding-bracket sizes,
  • bracket-specific because it is derived from cumulative funding by bracket.

After that, the engine combines everything as:

effective_factor = (1 - combined_decline) * bracket_factor

where combined_decline is the sum of:

  • the bracket decline from orgmeta, and
  • the computed decline from UtilityDeclineParameter,

capped at 1.

Practical interpretation:

  • earlier funding brackets usually keep a higher effective factor,
  • later brackets usually get a lower effective factor,
  • UtilityDeclineParameter controls how quickly marginal value declines as cumulative funding increases.

Input Reference

The input-side definitions of these multiplier types are documented in Impact Multipliers.