# Sensitivity analysis functions

Sensitivity analysis enables you to examine the effect of a change in the value of an input variable on the values of its output variables. They do not require their parameters to be uncertain.

**Examples:** The examples in this section refer to the following variables:

`gasPrice`

`Normal(1.3, .3)`

Cost of gasoline per gallon within market fluctuations `mpy:`

`12K`

The average number of miles driven per year `mpg:`

`Normal(28, 5)`

Fuel consumption averaged over driving conditions `fuelCost:`

`gasPrice*mpy/mpg`

Annual cost of fuel

The probability density of `fuelCost`

is shown below.

## Dydx(y, x)

Returns the derivative of expression «y» with respect to variable «x», evaluated at mid values. This function returns the ratio of the change in y to a small change in «x» that affects «y». The “small change” is *x/10000*, or 1.0E-6 if *x = 0*. See Dydx.

**Library:** Special

**Examples:** Because `fuelCost`

depends on `mpg`

, a small change in `mpg`

seems to have a modest negative effect on `fuelCost`

:

`Dydx(fuelCost, mpg) → -19.7`

The reverse is not true, because `mpg`

is not dependent on `fuelCost`

. That is, `fuelCost`

does not cause any change in `mpg`

:

`Dydx(Mpg, Fuelcost) → 0`

In this model of `fuelCost`

, a small change in `gasPrice`

has by far the largest effect of all its inputs:

`Dydx(fuelCost, gasPrice) → 428.6`

`Dydx(fuelCost, mpy) → 0.04643`

When you evaluate Dydx in mid mode, the mid value for «x» is varied and the mid value of «y» is evaluated. In prob mode, the sample of «x» is varied and the sample for «y» is computed in prob mode. Therefore, when «y» is a statistical function of «x», care must be taken to ensure that the evaluation modes for «x» and «y» correspond. So, for example:

`Y := DyDx(Kurtosis(Normal(0, X)), X)`

would not produce the expected result. In this case, when evaluating «y» in determ mode, Kurtosis evaluates its parameter, and thus «x», in prob mode, resulting in a mis-match in computation modes. To get the desired result, you should explicitly use the mid value of «x»:

`Y := DyDx(Kurtosis(Normal(0, Mid(X))), X)`

## Elasticity(y, x)

Returns the percent change in variable «y» caused by a 1 percent change in a dependent variable «x». Mathematically, writing *y(x)* to emphasize that «y» is a function of «x», elasticity is defined as:

- [math]\displaystyle{ Elasticity(y,x)=\lim_{u \to 0} \frac{1}{u} (\frac{y(x(1+u))-y(x)}{y(x)}) }[/math]

When «x» is a positive scalar, but not when «x» is array-valued, Elasticity is related to Dydx in the following manner:

`Elasticity(y, x) = Dydx(y, x)*(x/y)`

**Library:** Special

**Examples:**

`Elasticity(fuelCost, mpg) → -1`

`Elasticity(fuelCost, gasPrice) → 1`

A 1% change in variables `mpg`

and `gasPrice`

cause about the same degree of change in `fuelCost`

, although in opposite directions.

`mpg`

is inversely proportional to the value of `fuelCost`

, while `gasPrice`

is proportional to it.

## Whatif(e, v, vNew)

Returns the value of expression «e» when variable «v» is set to the value of «vNew». «v» must be a variable. It lets you explore the effect of a change to a value without changing it permanently. It restores the original definition of «v» after evaluating Whatif expression, so that there is no permanent change (and so causes no side effects).

**Library:** Special

**Example:**

`Fuelcost → 557.1`

`Whatif(Fuelcost, Mpy, 14K) → 650`

## WhatIfAll(e, vList, vNew)

Like Whatif, but it lets you examine a set of changes to a list of variables, «vList». It returns the mid value of «e» when each of variables in «vList» is assigned the value in «vNew» one at a time, with the remaining variables remaining at their nominal values. The result is indexed by «vList». If «vNew» is indexed by «vList», it assigns the corresponding value of «vNew» to each variable, letting you assign a different value to each variable in «vList». WhatIfAll is useful for performing *ceteris paribus* style sensitivity analysis, which varies one variable at a time, leaving the others at their initial value, such as in Tornado charts (see next section for an example).

Suppose `Z`

is a function of `A`

, `B`

, and `C`

, and we wish to examine the effect on `Z`

when each input is varied, one at a time, by 10% from its nominal value. Define:

`Variable Z := 10*A + B^2 + 5*C`

`Index L := [90%, 110%]`

`Variable V := [A, B, C]`

`MyTornado := WhatIfAll(Z, V, L*V)`

**Library:** Special

## See Also

- Tutorial: Performing parametric (sensitivity) analysis
- The Sensitivity Analysis Library
- Dydx
- Elasticity
- Whatif
- WhatIfAll

Enable comment auto-refresher