Sobol’ sensitivity indices using rank-based algorithm

import openturns as ot
import openturns.experimental as otexp
import openturns.viewer as viewer
from openturns.usecases import ishigami_function

In this example we are going to compute global sensitivity indices in a data driven framework. For that purpose, we are using the rank-based algorithm which provides the first order Sobol’ indices. We present the method on the Ishigami function.

Definition of the model

We load the model from the usecases module.

im = ishigami_function.IshigamiModel()

We generate an input sample of size 500 (and dimension 3).

size = 500
ot.RandomGenerator.SetSeed(10)
X = im.inputDistribution.getSample(size)

We compute the output by applying the Ishigami model to the input sample.

Y = im.model(X)

Estimate Sobol’ first order indices via rank-based algorithm.

mySobol = otexp.RankSobolSensitivityAlgorithm(X, Y)
indices = mySobol.getFirstOrderIndices()
print("First order indices:", indices)
First order indices: [0.29008,0.421935,0.0856989]

Draw Sobol’ indices.

Options for confidence interval estimation can be defined.

ot.ResourceMap.SetAsUnsignedInteger("SobolIndicesAlgorithm-DefaultBootstrapSize", 200)
ot.ResourceMap.SetAsScalar(
    "RankSobolSensitivityAlgorithm-DefaultBootstrapSampleRatio", 0.85
)

if SobolIndicesAlgorithm-DefaultBootstrapSize > 1, the draw() method will call bootstrap method to compute the confidence intervals.

graph = mySobol.draw()
graph.setTitle("Sobol' indices")
view = viewer.View(graph)

print("confidence intervals:", mySobol.getFirstOrderIndicesInterval())
Sobol' indices
confidence intervals: [0.238895, 0.337643]
[0.381658, 0.485514]
[-0.030505, 0.151549]

It is possible that Sobol’ indices estimates take negative values, that is inconsistent with the theory. Therefore, a larger number of samples is required to get consistent indices.