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:
- Combine each sampled multiplier with the corresponding characteristic.
- Multiply those per-multiplier values together to get a base expected value for each opportunity and simulation.
- 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
NAfor a multiplier, that term is omitted from the product rather than making the whole expected valueNA. - If all multiplier values were
NA, the current code would behave like the product of an empty set and return1.
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.8multiplier - later years: no extra effect from
GrantDelay2unless 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:
UtilityDeclineParameteris a sampled multiplier fromimp.- 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:
- The engine takes the sampled
UtilityDeclineParametervalue. - It clamps that value into
[0, 1]. - It converts it into an exponent:
exponent = log2(p + 1)
- For each opportunity, it computes cumulative funding across brackets using the
Room for fundingvalues fromorgmeta. - It then computes the marginal utility of each bracket from the function:
total_utility = cumulative_funding ^ exponent
- From that, it derives bracket-level cost-effectiveness:
ce = (utility gain from the bracket) / (funding in the bracket)
- 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,
UtilityDeclineParametercontrols how quickly marginal value declines as cumulative funding increases.
Input Reference
The input-side definitions of these multiplier types are documented in Impact Multipliers.