code: def refute_data_subset(
      data: pd.DataFrame,
      target_estimand: IdentifiedEstimand,
      estimate: CausalEstimate,
      subset_fraction: float = 0.8,
      num_simulations: int = 100,
      random_state: Optional[Union[int, np.random.RandomState]] = None,
      show_progress_bar: bool = False,
      n_jobs: int = 1,
      verbose: int = 0,
      **_,
  ) -> CausalRefutation:
      """Refute an estimate by rerunning it on a random subset of the original data.
  
      :param data: pd.DataFrame: Data to run the refutation
      :param target_estimand: IdentifiedEstimand: Identified estimand to run the refutation
      :param estimate: CausalEstimate: Estimate to run the refutation
      :param subset_fraction: Fraction of the data to be used for re-estimation, which is ``DataSubsetRefuter.DEFAULT_SUBSET_FRACTION`` by default.
      :param num_simulations: The number of simulations to be run, ``CausalRefuter.DEFAULT_NUM_SIMULATIONS`` by default
      :param random_state: The seed value to be added if we wish to repeat the same random behavior. For this purpose, we repeat the same seed in the psuedo-random generator.
      :param n_jobs: The maximum number of concurrently running jobs. If -1 all CPUs are used. If 1 is given, no parallel computing code is used at all (this is the default).
      :param verbose: The verbosity level: if non zero, progress messages are printed. Above 50, the output is sent to stdout. The frequency of the messages increases with the verbosity level. If it more than 10, all iterations are reported. The default is 0.
      """
  
      logger.info(
          "Refutation over {} simulated datasets of size {} each".format(
              subset_fraction, subset_fraction * len(data.index)
          )
      )
  
      # Run refutation in parallel
      sample_estimates = Parallel(n_jobs=n_jobs, verbose=verbose)(
          delayed(_refute_once)(
              data,
              target_estimand,
              estimate,
              subset_fraction,
              random_state,
          )
          for _ in tqdm(
              range(num_simulations),
              colour=CausalRefuter.PROGRESS_BAR_COLOR,
              disable=not show_progress_bar,
              desc="Refuting Estimates: ",
          )
      )
      sample_estimates = np.array(sample_estimates)
  
      refute = CausalRefutation(
          estimate.value,
          np.mean(sample_estimates),
          refutation_type="Refute: Use a subset of data",
      )
  
      # We want to see if the estimate falls in the same distribution as the one generated by the refuter
      # Ideally that should be the case as choosing a subset should not have a significant effect on the ability
      # of the treatment to affect the outcome
      refute.add_significance_test_results(
          test_significance(estimate, sample_estimates)
      )
  
      return refute
  
file_path: dowhy/dowhy/causal_refuters/data_subset_refuter.py
imports: import logging
  from typing import Optional, Union
  import numpy
  import pandas
  from joblib import Parallel, delayed
  from tqdm.auto import tqdm
  from dowhy.causal_estimator import CausalEstimate
  from dowhy.causal_estimators.econml import Econml
  from dowhy.causal_identifier import IdentifiedEstimand
  from dowhy.causal_refuter import CausalRefutation, CausalRefuter, test_significance
label_desc: Use image node_id 2 for calling a global function with example usage: refute_data_subset(data, target_estimand, estimate, subset_fraction, num_simulations, random_state, show_progress_bar, n_jobs, verbose) and returns: refute