RBD Fast Sensitivity Analysis

This example demonstrates a RBD-FAST sensitivity analysis using the rbd_fast function from SALib (https://github.com/SALib/SALib). In this case, the sensitivity of the sum-of-squared errors (sse) to model parameters is evaluated. It is also possible to provide the name of an individual observation instead of the sse as an argument in the rbd_fast method (i.e., argument “obsname”).

import sys,os
import matk
import numpy as np
from matplotlib import pyplot as plt

# define a simple decaying sinusoidal function
def sine_decay(params, x, data):
    """ model decaying sine wave, subtract data"""
    amp = params['amp']
    shift = params['shift']
    omega = params['omega']
    decay = params['decay']

    model = amp * np.sin(x * omega + shift) * np.exp(-x*x*decay)

    obsnames = ['obs'+str(i) for i in range(1,len(data)+1)]
    return dict(zip(obsnames,model))

# create noisy data
x = np.linspace(0, 15, 301)
data = (5. * np.sin(2 * x - 0.1) * np.exp(-x*x*0.025) +
        np.random.normal(size=len(x), scale=0.2) )

# Create MATK object
p = matk.matk(model=sine_decay, model_args=(x,data,))

# Create parameters
p.add_par('amp', value=10, min=0., max=20.)
p.add_par('decay', value=0.1, min=0, max=0.2)
p.add_par('shift', value=0.0, min=-np.pi/2., max=np.pi/2.)
p.add_par('omega', value=3.0, min=0, max=6)

# Create observation names and set observation values to noisy data
for i in range(len(data)):
    p.add_obs('obs'+str(i+1), value=data[i])

# Create LHS sample
ss1 = p.lhs(siz=1000)

# Execute the model on the LHS sample parameter combinations.

# Perform the RBD_FAST analysis
SS = ss1.rbd_fast()
Parameter First
amp       0.416543
decay     0.289382
shift     0.0286196
omega     0.0386413
# Manually print some results
print SS['S1']
[0.41654295222954379, 0.28938223959466058, 0.028619627269347119, 0.03864126571374104]

The results indicate that the model is most sensitive to “amp” followed by “decay”. The model is relatively insensitive to “shift” and “omega”.