(problem, Y, calc_second_order=True, num_resamples=100,
            conf_level=0.95, print_to_console=False, parallel=False,
            n_processors=None, keep_resamples=False, seed=None)
return S
Perform Sobol Analysis on model outputs.

    Returns a dictionary with keys 'S1', 'S1_conf', 'ST', and 'ST_conf', where
    each entry is a list of size D (the number of parameters) containing the
    indices in the same order as the parameter file.  If calc_second_order is
    True, the dictionary also contains keys 'S2' and 'S2_conf'.


    Notes
    -----
    Compatible with:
        `saltelli` : :func:`SALib.sample.saltelli.sample`



    Parameters
    ----------
    problem : dict
        The problem definition
    Y : numpy.array
        A NumPy array containing the model outputs
    calc_second_order : bool
        Calculate second-order sensitivities (default True)
    num_resamples : int
        The number of resamples (default 100)
    conf_level : float
        The confidence interval level (default 0.95)
    print_to_console : bool
        Print results directly to console (default False)
    keep_resamples : bool
        Whether or not to store intermediate resampling results (default False)


    References
    ----------
    .. [1] Sobol, I. M. (2001).  "Global sensitivity indices for nonlinear
           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.
    .. [2] 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.
    .. [3] Saltelli, A., P. Annoni, I. Azzini, F. Campolongo, M. Ratto, and
           S. Tarantola (2010).  "Variance based sensitivity analysis of model
           output.  Design and estimator for the total sensitivity index."
           Computer Physics Communications, 181(2):259-270,
           doi:10.1016/j.cpc.2009.09.018.


    Examples
    --------
        >>> X = saltelli.sample(problem, 512)
        >>> Y = Ishigami.evaluate(X)
        >>> Si = sobol.analyze(problem, Y, print_to_console=True)
Perform Sobol Analysis on model outputs.
Perform Sobol Analysis on model outputs .
def analyze(problem, Y, calc_second_order=True, num_resamples=100,
            conf_level=0.95, print_to_console=False, parallel=False,
            n_processors=None, keep_resamples=False, seed=None):
    """Perform Sobol Analysis on model outputs.

    Returns a dictionary with keys 'S1', 'S1_conf', 'ST', and 'ST_conf', where
    each entry is a list of size D (the number of parameters) containing the
    indices in the same order as the parameter file.  If calc_second_order is
    True, the dictionary also contains keys 'S2' and 'S2_conf'.


    Notes
    -----
    Compatible with:
        `saltelli` : :func:`SALib.sample.saltelli.sample`



    Parameters
    ----------
    problem : dict
        The problem definition
    Y : numpy.array
        A NumPy array containing the model outputs
    calc_second_order : bool
        Calculate second-order sensitivities (default True)
    num_resamples : int
        The number of resamples (default 100)
    conf_level : float
        The confidence interval level (default 0.95)
    print_to_console : bool
        Print results directly to console (default False)
    keep_resamples : bool
        Whether or not to store intermediate resampling results (default False)


    References
    ----------
    .. [1] Sobol, I. M. (2001).  "Global sensitivity indices for nonlinear
           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.
    .. [2] 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.
    .. [3] Saltelli, A., P. Annoni, I. Azzini, F. Campolongo, M. Ratto, and
           S. Tarantola (2010).  "Variance based sensitivity analysis of model
           output.  Design and estimator for the total sensitivity index."
           Computer Physics Communications, 181(2):259-270,
           doi:10.1016/j.cpc.2009.09.018.


    Examples
    --------
        >>> X = saltelli.sample(problem, 512)
        >>> Y = Ishigami.evaluate(X)
        >>> Si = sobol.analyze(problem, Y, print_to_console=True)
    """
    if seed:
        # Set seed to ensure CIs are the same
        rng = np.random.default_rng(seed).integers
    else:
        rng = np.random.randint

    # determining if groups are defined and adjusting the number
    # of rows in the cross-sampled matrix accordingly
    groups = _check_groups(problem)
    if not groups:
        D = problem['num_vars']
    else:
        _, D = extract_group_names(groups)

    if calc_second_order and Y.size % (2 * D + 2) == 0:
        N = int(Y.size / (2 * D + 2))
    elif not calc_second_order and Y.size % (D + 2) == 0:
        N = int(Y.size / (D + 2))
    else:
        raise RuntimeError("""
        Incorrect number of samples in model output file.
        Confirm that calc_second_order matches option used during sampling.""")

    if not 0 < conf_level < 1:
        raise RuntimeError("Confidence level must be between 0-1.")

    # normalize the model output
    Y = (Y - Y.mean()) / Y.std()

    A, B, AB, BA = separate_output_values(Y, D, N, calc_second_order)
    r = rng(N, size=(N, num_resamples))
    Z = norm.ppf(0.5 + conf_level / 2)

    if not parallel:
        S = create_Si_dict(D, num_resamples, keep_resamples, calc_second_order)

        for j in range(D):
            S['S1'][j] = first_order(A, AB[:, j], B)
            S1_conf_j = first_order(A[r], AB[r, j], B[r])

            if keep_resamples:
                S['S1_conf_all'][:, j] = S1_conf_j

            S['S1_conf'][j] = Z * S1_conf_j.std(ddof=1)
            S['ST'][j] = total_order(A, AB[:, j], B)
            ST_conf_j = total_order(A[r], AB[r, j], B[r])

            if keep_resamples:
                S['ST_conf_all'][:, j] = ST_conf_j

            S['ST_conf'][j] = Z * ST_conf_j.std(ddof=1)

        # Second order (+conf.)
        if calc_second_order:
            for j in range(D):
                for k in range(j + 1, D):
                    S['S2'][j, k] = second_order(
                        A, AB[:, j], AB[:, k], BA[:, j], B)
                    S['S2_conf'][j, k] = Z * second_order(A[r], AB[r, j],
                                                          AB[r, k], BA[r, j],
                                                          B[r]).std(ddof=1)
    else:
        tasks, n_processors = create_task_list(
            D, calc_second_order, n_processors)

        func = partial(sobol_parallel, Z, A, AB, BA, B, r)
        pool = Pool(n_processors)
        S_list = pool.map_async(func, tasks)
        pool.close()
        pool.join()

        S = Si_list_to_dict(S_list.get(), D, num_resamples,
                            keep_resamples, calc_second_order)

    # Add problem context and override conversion method for special case
    S.problem = problem
    S.to_df = MethodType(to_df, S)

    # Print results to console
    if print_to_console:
        res = S.to_df()
        for df in res:
            print(df)

    return S
def analyze ( problem , Y , calc_second_order = True , num_resamples = 100 , conf_level = 0.95 , print_to_console = False , parallel = False , n_processors = None , keep_resamples = False , seed = None ) : if seed : # Set seed to ensure CIs are the same rng = np . random . default_rng ( seed ) . integers else : rng = np . random . randint # determining if groups are defined and adjusting the number # of rows in the cross-sampled matrix accordingly groups = _check_groups ( problem ) if not groups : D = problem [ 'num_vars' ] else : _ , D = extract_group_names ( groups ) if calc_second_order and Y . size % ( 2 * D + 2 ) == 0 : N = int ( Y . size / ( 2 * D + 2 ) ) elif not calc_second_order and Y . size % ( D + 2 ) == 0 : N = int ( Y . size / ( D + 2 ) ) else : raise RuntimeError ( """
        Incorrect number of samples in model output file.
        Confirm that calc_second_order matches option used during sampling.""" ) if not 0 < conf_level < 1 : raise RuntimeError ( "Confidence level must be between 0-1." ) # normalize the model output Y = ( Y - Y . mean ( ) ) / Y . std ( ) A , B , AB , BA = separate_output_values ( Y , D , N , calc_second_order ) r = rng ( N , size = ( N , num_resamples ) ) Z = norm . ppf ( 0.5 + conf_level / 2 ) if not parallel : S = create_Si_dict ( D , num_resamples , keep_resamples , calc_second_order ) for j in range ( D ) : S [ 'S1' ] [ j ] = first_order ( A , AB [ : , j ] , B ) S1_conf_j = first_order ( A [ r ] , AB [ r , j ] , B [ r ] ) if keep_resamples : S [ 'S1_conf_all' ] [ : , j ] = S1_conf_j S [ 'S1_conf' ] [ j ] = Z * S1_conf_j . std ( ddof = 1 ) S [ 'ST' ] [ j ] = total_order ( A , AB [ : , j ] , B ) ST_conf_j = total_order ( A [ r ] , AB [ r , j ] , B [ r ] ) if keep_resamples : S [ 'ST_conf_all' ] [ : , j ] = ST_conf_j S [ 'ST_conf' ] [ j ] = Z * ST_conf_j . std ( ddof = 1 ) # Second order (+conf.) if calc_second_order : for j in range ( D ) : for k in range ( j + 1 , D ) : S [ 'S2' ] [ j , k ] = second_order ( A , AB [ : , j ] , AB [ : , k ] , BA [ : , j ] , B ) S [ 'S2_conf' ] [ j , k ] = Z * second_order ( A [ r ] , AB [ r , j ] , AB [ r , k ] , BA [ r , j ] , B [ r ] ) . std ( ddof = 1 ) else : tasks , n_processors = create_task_list ( D , calc_second_order , n_processors ) func = partial ( sobol_parallel , Z , A , AB , BA , B , r ) pool = Pool ( n_processors ) S_list = pool . map_async ( func , tasks ) pool . close ( ) pool . join ( ) S = Si_list_to_dict ( S_list . get ( ) , D , num_resamples , keep_resamples , calc_second_order ) # Add problem context and override conversion method for special case S . problem = problem S . to_df = MethodType ( to_df , S ) # Print results to console if print_to_console : res = S . to_df ( ) for df in res : print ( df ) return S