From 09de3ac20a78b65d3651ffb1f75c76eb52e5d7a8 Mon Sep 17 00:00:00 2001 From: rg727 Date: Tue, 1 Mar 2022 00:09:34 +0000 Subject: [PATCH] fixing saltelli notebook --- docs/source/A2.2_saltelli.rst | 243 ++++++++++++++++++++++++---------- notebooks/figs/output_7_0.png | Bin 0 -> 92194 bytes 2 files changed, 173 insertions(+), 70 deletions(-) create mode 100644 notebooks/figs/output_7_0.png diff --git a/docs/source/A2.2_saltelli.rst b/docs/source/A2.2_saltelli.rst index a18b879..d75417b 100644 --- a/docs/source/A2.2_saltelli.rst +++ b/docs/source/A2.2_saltelli.rst @@ -6,42 +6,63 @@ Sobol SA Tutorial Tutorial: Sensitivity Analysis (SA) using the Saltelli sampling scheme with Sobol SA ==================================================================================== -In this tutorial, we will use the popular Python Sensitivity Analysis -Library (`SALib `__) -to: 1. Generate a problem set as a dictionary for our Ishigami function -that has three inputs 2. Generate 8000 samples for our problem set using -the Saltelli1,2 sampling scheme 3. Execute the Ishigami function for -each of our samples and gather the outputs 4. Compute the sensitivity -analysis to generate first-order and total-order sensitivity indices -using the Sobol3 method 5. Interpret the meaning of our results +In this tutorial, we will set up a workflow to investigate how sensitive +the output of a function is to its inputs. Why might you want to do +this? Imagine that this function represents a complex system, such as +the rainfall-runoff process of a watershed model, and that you, the +researcher, want to investigate how your choice of input parameter +values are affecting the model’s characterization of runoff in the +watershed. Your parameter values are likely uncertain and can take on +any value in a pre-defined range. Using a Sobol SA will allow you to +sample different values of your parameters and calculate how sensitive +your output of interest is to certain parameters. Below, we demonstrate +Sobol SA for a simple function to illustrate the method, but the +workflow can be applied to your own problem of interest! + +In order to conduct this analysis, we will use the popular Python +Sensitivity Analysis Library +(`SALib `__) to: 1. +Generate a problem set as a dictionary for our Ishigami function that +has three inputs 2. Generate 2048 samples for our problem set using the +Saltelli\ `1,2 <#references>`__\ . sampling scheme 3. Execute the +Ishigami function for each of our samples and gather the outputs 4. +Compute the sensitivity analysis to generate first-order and total-order +sensitivity indices using the Sobol3 method 5. Interpret the meaning of +our results Let’s get started! ------------------ **NOTE**: Content from this tutorial is taken directly from the SALib `“Basics” `__ -walkthrough. +walkthrough. To step through the notebook, execute each gray (code) box +by typing “Shift+Enter”. .. code:: ipython3 + #Import relevant libraries import numpy as np - + import matplotlib.pyplot as plt + from mpl_toolkits import mplot3d + from SALib.sample import saltelli from SALib.analyze import sobol from SALib.test_functions import Ishigami - Step 1: Generate the problem dictionary --------------------------------------- The Ishigami function is of the form: -.. math:: f(x) = sin(x_1)+asin^2(x_2)+bx_3^4sin(x_1) +.. math:: f(x_1,x_2,x_3) = sin(x_1)+asin^2(x_2)+bx_3^4sin(x_1) -\ and has three inputs, 𝑥1, 𝑥2, 𝑥3 where 𝑥𝑖 ∈ [−𝜋, 𝜋]. +The function has three inputs, 𝑥1, 𝑥2, 𝑥3 where 𝑥𝑖 ∈ [−𝜋, 𝜋]. The +constants :math:`a` and :math:`b` are defined as 7.0 and 0.1 +respectively. .. code:: ipython3 + #Create a problem dictionary. Here we supply the number of variables, the names of each variable, and the bounds of the variables. problem = { 'num_vars': 3, 'names': ['x1', 'x2', 'x3'], @@ -50,22 +71,23 @@ The Ishigami function is of the form: [-3.14159265359, 3.14159265359]] } - Step 2: Generate samples using the Saltelli sampling scheme ----------------------------------------------------------- Sobol SA requires the use of the Saltelli sampling scheme. The output of the ``saltelli.sample`` function is a NumPy array that is of shape 2048 -by 3. The sampler generates 𝑁∗(2𝐷+2) samples, where in this example N is -256 (the argument we supplied) and D is 3 (the number of model inputs), -yielding 2048 samples. The keyword argument ``calc_second_order=False`` -will exclude second-order indices, resulting in a smaller sample matrix -with 𝑁∗(𝐷+2) rows instead. +by 3. The sampler generates 𝑁∗(2𝐷+2) samples, where in this example, N +is 256 (the argument we supplied) and D is 3 (the number of model +inputs), yielding 2048 samples. The keyword argument +``calc_second_order=False`` will exclude second-order indices, resulting +in a smaller sample matrix with 𝑁∗(𝐷+2) rows instead. Below, we plot the +resulting Saltelli sample. .. code:: ipython3 + #Generate parmeter values using the saltelli.sample function param_values = saltelli.sample(problem, 256) - + print(f"`param_values` shape: {param_values.shape}") @@ -75,6 +97,25 @@ with 𝑁∗(𝐷+2) rows instead. `param_values` shape: (2048, 3) +.. code:: ipython3 + + #Plot the 2048 samples of the parameters + + fig = plt.figure(figsize = (7, 5)) + ax = plt.axes(projection ="3d") + ax.scatter3D(param_values[:,0], param_values[:,1], param_values[:,2]) + ax.set_xlabel('X1 Parameter') + ax.set_ylabel('X2 Parameter') + ax.set_zlabel('X3 Parameter') + plt.title("Saltelli Sample of Parameter Values") + + plt.show() + + + +.. image:: ./figs/output_7_0.png + + Step 3: Execute the Ishigami function over our sample set --------------------------------------------------------- @@ -86,7 +127,6 @@ the function directly. Y = Ishigami.evaluate(param_values) - Step 4: Compute first-, second-, and total-order sensitivity indices using the Sobol method ------------------------------------------------------------------------------------------- @@ -98,7 +138,6 @@ total-order indicies. Si = sobol.analyze(problem, Y) - ``Si`` is a Python dict with the keys “S1”, “S2”, “ST”, “S1_conf”, “S2_conf”, and “ST_conf”. The ``_conf`` keys store the corresponding confidence intervals, typically with a confidence level of 95%. Use the @@ -108,59 +147,78 @@ can print the individual values from ``Si`` as shown in the next step. Step 5: Interpret our results ----------------------------- -When we execute the following code to take a look at our first-order -indices (``S1``) for each of our three parameters, we see that 𝑥1 and 𝑥2 -exibit first-order sensitivities. This means that there is contribution -to the output variance by those parameters independently, whereas 𝑥3 -does not contribute to the output variance. +We execute the following code and take a look at our first-order indices +(``S1``) for each of our three inputs. These indicies can be interpreted +as the fraction of variance in the output that is explained by each +input individually. .. code:: ipython3 first_order = Si['S1'] - + print('First-order:') print(f"x1: {first_order[0]}, x2: {first_order[1]}, x3: {first_order[2]}") - .. parsed-literal:: First-order: - x1: 0.3260389719592443, x2: 0.4820072841939227, x3: 0.011125510338583004 - - -Next, we evaluate the total-order indices and find that they are -substantially larger than the first-order indices, which reveals that -higher-order interactions are occurring. Our total-order indices measure -the contribution to the output variance caused by a model input, + x1: 0.3184242969763115, x2: 0.4303808201623416, x3: 0.022687722804980225 + + +If we were to rank the importance of the inputs in how much they +individually explain the variance in the output, we would rank them from +greatest to least importance as follows: 𝑥2, 𝑥1 and then 𝑥3. Since 𝑥3 +only explains 1% of the output variance, it does not explain output +variability meaningfully. Thus, this indicates that there is +contribution to the output variance by 𝑥2 and 𝑥1 independently, whereas +𝑥3 does not contribute to the output variance. Determining what inputs +are most important or what index value is meaningful is a common +question, but one for which there is no general rule or threshold. This +question is problem and context-dependent, but procedures have been +identified to rank order influential inputs and which can be used to +identify the least influential factors. These factors can be fixed to +simplify the model.\ `4,5,6 <#references>`__\ + +Next, we evaluate the total-order indices, which measure the +contribution to the output variance caused by varying the model input, including both its first-order effects (the input varying alone) and all -higher-order interactions. Now we see that 𝑥3 has non-negligible total -order indices. +higher-order interactions across the input parameters. .. code:: ipython3 total_order = Si['ST'] - + print('Total-order:') print(f"x1: {total_order[0]}, x2: {total_order[1]}, x3: {total_order[2]}") - .. parsed-literal:: Total-order: - x1: 0.5646024820275896, x2: 0.4570071429804512, x3: 0.2506488435438359 + x1: 0.5184119098161343, x2: 0.41021260250026054, x3: 0.2299058431439953 +The magnitude of the total order indices are substantially larger than +the first-order indices, which reveals that higher-order interactions +are occurring, i.e. that the interactions across inputs are also +explaining some of the total variance in the output. Note that 𝑥3 has +non-negligible total-order indices, which indicates that it is not a +consequential parameter when considered in isolation, but becomes +consequential and explains 25% of variance in the output through its +interactions with 𝑥1 and 𝑥2. + Finally, we can investigate these higher order interactions by viewing -the second-order outputs. The second-order indicies measure the +the second-order indices. The second-order indicies measure the contribution to the output variance caused by the interaction between -any two model inputs. +any two model inputs. Some computing error can appear in these +sensitivity indices, such as negative values. Typically, these computing +errors shrink as the number of samples increases. .. code:: ipython3 second_order = Si['S2'] - + print("Second-order:") print(f"x1-x2: {second_order[0,1]}") print(f"x1-x3: {second_order[0,2]}") @@ -171,32 +229,61 @@ any two model inputs. .. parsed-literal:: Second-order: - x1-x2: -0.018110907981879032 - x1-x3: 0.2648898732606599 - x2-x3: -0.005645845624612848 - - -We can see that there are strong interactions between 𝑥1 and 𝑥3. Note in -the Ishigami function, these two variables are multiplied in the last -term, which creates these interactive effects. If we were considering -first order indices alone, we would erroneously assume that 𝑥3 has no -effect on our output, but the second-order and total order indices -reveal that this is not the case. It’s easy to understand where we might -see iteractive effects in the case of the simple Ishigami function. -However, it’s important to remember that in more complex systems, there -may be many higher-order interactions that are not apparent, but could -be extremely consequential in contributing to the variance of the -output. Additionally, some computing error will appear in the -sensitivity indices. For example, we observe a negative value for the -𝑥2-𝑥3 index. Typically, these computing errors shrink as the number of -samples increases. - -References ----------- - -[1] Saltelli, A. (2002). “Making best use of model evaluations to -compute sensitivity indices.” Computer Physics Communications, -145(2):280-297, doi:10.1016/S0010-4655(02)00280-1. + x1-x2: -0.043237389723234154 + x1-x3: 0.17506452088709862 + x2-x3: -0.03430682392607577 + + +We can see that there are strong interactions between 𝑥1 and 𝑥3. Note +that in the Ishigami function, these two variables are multiplied in the +last term of the function, which leads to interactive effects. If we +were considering first order indices alone, we would erroneously assume +that 𝑥3 explains no variance in the output, but the second-order and +total order indices reveal that this is not the case. It’s easy to +understand where we might see interactive effects in the case of the +simple Ishigami function. However, it’s important to remember that in +more complex systems, there may be many higher-order interactions that +are not apparent, but could be extremely consequential in explaining the +variance of the output. + +Tips to Apply Sobol SA to Your Own Problem +------------------------------------------ + +In this tutorial, we demonstrated how to apply an SA analysis to a +simple mathematical test function. In order to apply a Sobol SA to your +own problem, you will follow the same general workflow that we defined +above. You will need to: + +1. Choose sampling bounds for your parameters and set up the problem + dictionary as in Step 1 above. +2. Generate samples using the ``saltelli.sample`` function. This step is + problem-dependent and note that the Sobol method can be + computationally intensive depending on the model being analyzed. For + example, for a simple rainfall-runoff model such as HYMOD, it has + been recommended to run a sample size of at least N = 10,000 (which + translates to 60,000 model runs). More complex models will be slower + to run and will also require more samples to calculate accurate + estimates of Sobol indices. Once you complete this process, pay + attention to the confidence bounds on your sensitivity indices to see + whether you need to run more samples. +3. Run the parameter sets through your model. In the example above, the + Ishigami function could be evaluated through SALib since it is a + built in function. For your application, you will need to run these + parameter sets through the problem externally and save the output. + The output file should contain one row of output values for each + model run. +4. Calculate the Sobol indices. Now, the Y will be a numpy array with + your external model output and you will need to include the parameter + samples as an additional argument. +5. Finally, we interpet the results. If the confidence intervals of your + dominant indices are larger than roughly 10% of the value itself, you + may want to consider increasing your sample size as computation + permits. You should additionally read the references noted in Step 5 + above to understand more about identify important factors. + +## References [1] Saltelli, A. (2002). “Making best use of model +evaluations to compute sensitivity indices.” Computer Physics +Communications, 145(2):280-297, doi:10.1016/S0010-4655(02)00280-1. [2] Saltelli, A., P. Annoni, I. Azzini, F. Campolongo, M. Ratto, and S. Tarantola (2010). “Variance based sensitivity analysis of model output. @@ -207,3 +294,19 @@ Communications, 181(2):259-270, doi:10.1016/j.cpc.2009.09.018. mathematical models and their Monte Carlo estimates.” Mathematics and Computers in Simulation, 55(1-3):271-280, doi:10.1016/S0378-4754(00)00270-6. + +[4] T. H. Andres, “Sampling methods and sensitivity analysis for large +parameter sets,” Journal of Statistical Computation and Simulation, +vol. 57, no. 1–4, pp. 77–110, Apr. 1997, doi: 10.1080/00949659708811804. + +[5] Y. Tang, P. Reed, T. Wagener, and K. van Werkhoven, “Comparing +sensitivity analysis methods to advance lumped watershed model +identification and evaluation,” Hydrology and Earth System Sciences, +vol. 11, no. 2, pp. 793–817, Feb. 2007, doi: +https://doi.org/10.5194/hess-11-793-2007. + +[6] J. Nossent, P. Elsen, and W. Bauwens, “Sobol’ sensitivity analysis +of a complex environmental model,” Environmental Modelling & Software, +vol. 26, no. 12, pp. 1515–1525, Dec. 2011, doi: +10.1016/j.envsoft.2011.08.010. + diff --git a/notebooks/figs/output_7_0.png b/notebooks/figs/output_7_0.png new file mode 100644 index 0000000000000000000000000000000000000000..bde57bbc7e918729a8927765e8751ac9c2b24535 GIT binary patch literal 92194 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