# Sensitivity Analyses¶

Sensitivity analyses are a way to determine the robustness of findings against certain assumptions or unmeasured
factors. Currently, *zEpid* supports Monte Carlo bias analysis

## Trapezoidal Distribution¶

NumPy doesn’t have a trapezoidal distribution, so this is an implementation. The trapezoid distribution is contains a central “zone of indifference” where values are from a uniform distribution. The tails of this distribution reflect the uncertainty around the edges of the distribution. I think a visual will explain it more clearly, so let’s generate one

```
from zepid.sensitivity_analysis import trapezoidal
import matplotlib.pyplot as plt
plt.hist(trapezoidal(mini=1, mode1=1.5, mode2=3, maxi=3.5, size=250000), bins=100)
plt.show()
```

As can be seen in the histogram, `mini`

refers to the smallest value of the distribution, `maxi`

refers to the
maximum value of the distribution, and `mode1`

and `mode2`

refer to the start and end of the uniform distribution
respectively. `size`

is how many samples to draw from the distribution. When `size`

is not specified, a single draw
from the distribution is generated.

```
trapezoidal(mini=1, mode1=1.5, mode2=3, maxi=3.5)
```

## Monte Carlo Risk Ratio¶

As described in Lash TL, Fink AK 2003 and Fox et al. 2005 , a probability distribution is defined for unmeasured confounder - outcome risk ratio, proportion of individuals in exposed group with unmeasured confounder, and proportion of individuals in unexposed group with unmeasured confounder. This version only supports binary exposures, binary outcomes, and binary unmeasured confounders.

```
import matplotlib.pyplot as plt()
from zepid.sensitivity_analysis import MonteCarloRR, trapezoidal
```

Below is code to complete the Monte Carlo bias analysis procedure

```
mcrr = MonteCarloRR(observed_RR=0.73322, sample=10000)
mcrr.confounder_RR_distribution(trapezoidal(mini=0.9, mode1=1.1, mode2=1.7, maxi=1.8, size=10000))
mcrr.prop_confounder_exposed(trapezoidal(mini=0.25, mode1=0.28, mode2=0.32, maxi=0.35, size=10000))
mcrr.prop_confounder_unexposed(trapezoidal(mini=0.55, mode1=0.58, mode2=0.62, maxi=0.65, size=10000))
mcrr.fit()
```

We can view basic summary information about the distribution of the corrected Risk Ratios

```
mcrr.summary()
```

Alternatively, we can easily get a kernel density plot of the distribution of corrected RR

```
mcrr.plot()
plt.show()
```