diff --git a/docs/image/bootstrap_hist.png b/docs/image/bootstrap_hist.png index 9212688..c81c961 100644 Binary files a/docs/image/bootstrap_hist.png and b/docs/image/bootstrap_hist.png differ diff --git a/docs/image/bootstrap_hists.png b/docs/image/bootstrap_hists.png new file mode 100644 index 0000000..a158bd2 Binary files /dev/null and b/docs/image/bootstrap_hists.png differ diff --git a/docs/tutorial/bootstrap.rst b/docs/tutorial/bootstrap.rst index 741cccf..cf8c3a4 100644 --- a/docs/tutorial/bootstrap.rst +++ b/docs/tutorial/bootstrap.rst @@ -15,6 +15,9 @@ In this example, we need to import ``numpy``, ``pandas``, and ``graphviz`` in ad import lingam from lingam.utils import print_causal_directions, print_dagc, make_dot + import warnings + warnings.filterwarnings("ignore") + print([np.__version__, pd.__version__, graphviz.__version__, lingam.__version__]) np.set_printoptions(precision=3, suppress=True) @@ -23,8 +26,8 @@ In this example, we need to import ``numpy``, ``pandas``, and ``graphviz`` in ad .. parsed-literal:: - ['1.24.4', '2.0.3', '0.20.1', '1.8.3'] - + ['1.26.4', '2.3.3', '0.21', '1.12.1'] + Test data --------- @@ -33,12 +36,13 @@ We create test data consisting of 6 variables. .. code-block:: python - x3 = np.random.uniform(size=1000) - x0 = 3.0*x3 + np.random.uniform(size=1000) - x2 = 6.0*x3 + np.random.uniform(size=1000) - x1 = 3.0*x0 + 2.0*x2 + np.random.uniform(size=1000) - x5 = 4.0*x0 + np.random.uniform(size=1000) - x4 = 8.0*x0 - 1.0*x2 + np.random.uniform(size=1000) + _size = 100 + x3 = np.random.uniform(size=_size) + x0 = 3.0*x3 + np.random.uniform(size=_size) + x2 = 6.0*x3 + np.random.uniform(size=_size) + x1 = 3.0*x0 + 2.0*x2 + np.random.uniform(size=_size) + x5 = 4.0*x0 + np.random.uniform(size=_size) + x4 = 8.0*x0 - 1.0*x2 + np.random.uniform(size=_size) X = pd.DataFrame(np.array([x0, x1, x2, x3, x4, x5]).T ,columns=['x0', 'x1', 'x2', 'x3', 'x4', 'x5']) X.head() @@ -99,48 +103,48 @@ We create test data consisting of 6 variables. 0 - 2.239321 - 15.340724 - 4.104399 + 2.324257 + 15.088680 + 3.604677 0.548814 - 14.176947 - 9.249925 + 15.299760 + 9.698288 1 - 2.155632 - 16.630954 - 4.767220 + 2.415576 + 17.995735 + 4.987480 0.715189 - 12.775458 - 9.189045 + 14.710164 + 10.591596 2 - 2.284116 - 15.910406 - 4.139736 + 2.543484 + 15.952262 + 3.994332 0.602763 - 14.201794 - 9.273880 + 16.878512 + 10.273552 3 - 2.343420 - 14.921457 - 3.519820 + 2.596838 + 14.769421 + 3.448903 0.544883 - 15.580067 - 9.723392 + 18.076397 + 11.332654 4 - 1.314940 - 11.055176 - 3.146972 + 1.519718 + 10.099609 + 2.566608 0.423655 - 7.604743 - 5.312976 + 9.924640 + 6.948359 @@ -174,8 +178,10 @@ We call :func:`~lingam.DirectLiNGAM.bootstrap` method instead of :func:`~lingam. .. code-block:: python + n_samples = 1000 + model = lingam.DirectLiNGAM() - result = model.bootstrap(X, n_sampling=100) + result = model.bootstrap(X, n_sampling=n_samples) Causal Directions ----------------- @@ -190,20 +196,20 @@ We can check the result by utility function. .. code-block:: python - print_causal_directions(cdc, 100) + print_causal_directions(cdc, n_samples) .. parsed-literal:: - x5 <--- x0 (b>0) (100.0%) - x1 <--- x0 (b>0) (100.0%) - x1 <--- x2 (b>0) (100.0%) - x4 <--- x2 (b<0) (100.0%) - x0 <--- x3 (b>0) (98.0%) - x4 <--- x0 (b>0) (98.0%) - x2 <--- x3 (b>0) (96.0%) - x3 <--- x2 (b>0) (4.0%) - + x4 <--- x2 (b<0) (87.9%) + x4 <--- x0 (b>0) (86.6%) + x1 <--- x2 (b>0) (77.5%) + x1 <--- x0 (b>0) (77.3%) + x2 <--- x3 (b>0) (76.1%) + x5 <--- x0 (b>0) (75.4%) + x0 <--- x3 (b>0) (45.4%) + x0 <--- x5 (b>0) (24.6%) + Directed Acyclic Graphs ----------------------- @@ -222,12 +228,12 @@ We can check the result by utility function. .. code-block:: python - print_dagc(dagc, 100) + print_dagc(dagc, n_samples) .. parsed-literal:: - DAG[0]: 84.0% + DAG[0]: 17.0% x0 <--- x3 (b>0) x1 <--- x0 (b>0) x1 <--- x2 (b>0) @@ -235,7 +241,7 @@ We can check the result by utility function. x4 <--- x0 (b>0) x4 <--- x2 (b<0) x5 <--- x0 (b>0) - DAG[1]: 3.0% + DAG[1]: 4.2% x0 <--- x3 (b>0) x1 <--- x0 (b>0) x1 <--- x2 (b>0) @@ -243,16 +249,15 @@ We can check the result by utility function. x4 <--- x0 (b>0) x4 <--- x2 (b<0) x5 <--- x0 (b>0) - DAG[2]: 2.0% - x0 <--- x3 (b>0) + DAG[2]: 3.9% x1 <--- x0 (b>0) x1 <--- x2 (b>0) - x1 <--- x3 (b<0) x2 <--- x3 (b>0) + x3 <--- x0 (b>0) x4 <--- x0 (b>0) x4 <--- x2 (b<0) x5 <--- x0 (b>0) - + Probability ----------- @@ -268,13 +273,13 @@ bootstrapping. .. parsed-literal:: - [[0. 0. 0.03 0.98 0.02 0. ] - [1. 0. 1. 0.02 0. 0.01] - [0.01 0. 0. 0.96 0. 0.01] - [0. 0. 0.04 0. 0. 0. ] - [0.98 0.01 1. 0.02 0. 0.02] - [1. 0. 0.02 0.02 0. 0. ]] - + [[0. 0.178 0.163 0.482 0.134 0.246] + [0.773 0. 0.775 0.202 0.069 0.064] + [0.2 0.225 0. 0.761 0.093 0.032] + [0.183 0.166 0.19 0. 0.031 0.084] + [0.866 0.074 0.88 0.121 0. 0.043] + [0.754 0.059 0.065 0.095 0.062 0. ]] + Total Causal Effects -------------------- @@ -351,150 +356,213 @@ below. 0 - x3 - x0 - 3.004106 - 1.00 + x2 + x4 + -0.986006 + 0.884 1 x0 - x1 - 2.963177 - 1.00 + x4 + 7.975821 + 0.866 2 - x2 - x1 - 2.017539 - 1.00 + x3 + x4 + 17.169757 + 0.858 3 x3 x1 - 20.928254 - 1.00 + 20.553538 + 0.794 4 x0 - x5 - 3.997787 - 1.00 + x1 + 3.020369 + 0.793 5 x3 - x4 - 18.077943 - 1.00 + x2 + 5.968590 + 0.788 6 - x3 - x5 - 12.012988 - 1.00 + x2 + x1 + 1.992771 + 0.775 7 - x2 - x4 - -1.006362 - 1.00 + x0 + x5 + 3.984278 + 0.754 8 - x0 - x4 - 8.011818 - 0.98 + x3 + x5 + 11.686617 + 0.657 9 x3 - x2 - 5.964879 - 0.96 + x0 + 2.920996 + 0.653 10 + x0 x2 - x5 - 0.396327 - 0.09 + 1.679845 + 0.343 11 x2 - x0 - 0.487915 - 0.07 + x5 + 0.155444 + 0.282 12 - x2 - x3 - 0.164565 - 0.04 + x5 + x4 + 1.550997 + 0.266 13 - x5 - x4 - 0.087437 - 0.03 + x0 + x3 + 0.305366 + 0.260 14 - x4 x5 - 0.496445 - 0.02 + x1 + 0.939446 + 0.259 15 x5 - x1 - -0.064703 - 0.02 + x0 + 0.249365 + 0.246 16 - x4 x1 - 0.367100 - 0.02 + x4 + 0.863039 + 0.245 17 - x4 + x2 x0 - 0.124114 - 0.02 + 0.120842 + 0.244 18 - x0 + x1 x2 - 0.056261 - 0.01 + 0.285349 + 0.225 19 x1 - x4 - -0.097108 - 0.01 + x5 + 0.576121 + 0.199 20 + x1 + x0 + 0.144407 + 0.197 + + + 21 x5 x2 - -0.111894 - 0.01 + 0.451434 + 0.196 + + + 22 + x1 + x3 + 0.046961 + 0.194 + + + 23 + x2 + x3 + 0.133917 + 0.191 + + + 24 + x5 + x3 + 0.076654 + 0.168 + + + 25 + x4 + x1 + 0.362045 + 0.144 + + + 26 + x4 + x5 + 0.478376 + 0.143 + + + 27 + x4 + x0 + 0.123534 + 0.134 + + + 28 + x4 + x2 + -0.139721 + 0.097 + + + 29 + x4 + x3 + -0.006454 + 0.043 @@ -565,36 +633,36 @@ We can easily perform sorting operations with pandas.DataFrame. 3 x3 x1 - 20.928254 - 1.00 + 20.553538 + 0.794 - 5 + 2 x3 x4 - 18.077943 - 1.00 + 17.169757 + 0.858 - 6 + 8 x3 x5 - 12.012988 - 1.00 + 11.686617 + 0.657 - 8 + 1 x0 x4 - 8.011818 - 0.98 + 7.975821 + 0.866 - 9 + 5 x3 x2 - 5.964879 - 0.96 + 5.968590 + 0.788 @@ -660,39 +728,39 @@ We can easily perform sorting operations with pandas.DataFrame. - 20 - x5 - x2 - -0.111894 - 0.01 + 29 + x4 + x3 + -0.006454 + 0.043 - 18 - x0 + 28 + x4 x2 - 0.056261 - 0.01 + -0.139721 + 0.097 - 19 - x1 + 27 x4 - -0.097108 - 0.01 + x0 + 0.123534 + 0.134 - 17 + 26 x4 - x0 - 0.124114 - 0.02 + x5 + 0.478376 + 0.143 - 16 + 25 x4 x1 - 0.367100 - 0.02 + 0.362045 + 0.144 @@ -761,39 +829,39 @@ following code extracts the causal direction towards x1. - 1 - x0 + 3 + x3 x1 - 2.963177 - 1.00 + 20.553538 + 0.794 - 2 - x2 + 4 + x0 x1 - 2.017539 - 1.00 + 3.020369 + 0.793 - 3 - x3 + 6 + x2 x1 - 20.928254 - 1.00 + 1.992771 + 0.775 - 15 + 14 x5 x1 - -0.064703 - 0.02 + 0.939446 + 0.259 - 16 + 25 x4 x1 - 0.367100 - 0.02 + 0.362045 + 0.144 @@ -818,6 +886,78 @@ values of the causal effect, as shown below. .. image:: ../image/bootstrap_hist.png +Furthermore, when we separate the bootstrap coefficient distributions +into the three structural cases - X->Y, Y->X, and no directed edge between +X and Y - the resulting histograms are shown below. + +.. code-block:: python + + import matplotlib.ticker as ticker + + from_index, to_index = 2, 4 + + te_xy = result.total_effects_[:, to_index, from_index] + te_yx = result.total_effects_[:, from_index, to_index] + + both_zero_mask = (te_xy == 0.0) & (te_yx == 0.0) + te_zero = result.total_effects_[both_zero_mask, to_index, from_index] + + te_xy = te_xy[te_xy != 0.0] + te_yx = te_yx[te_yx != 0.0] + + bins_count = int(np.ceil(1 + np.log2(max(n_samples, 1)))) + + # calculate xmin, xmax + arr_list = [te_xy, te_yx, te_zero] + if any(a.size > 0 for a in arr_list): + vals = np.concatenate([a for a in arr_list if a.size > 0]) + else: + vals = np.array([0.0]) + + xmin, xmax = np.min(vals), np.max(vals) + if xmin == xmax: + eps = 1e-9 if xmin == 0 else abs(xmin) * 1e-3 + xmin, xmax = xmin - eps, xmax + eps + + bin_edges = np.linspace(xmin, xmax, bins_count + 1) + + # calculate ymax + counts_xy, _ = np.histogram(te_xy, bins=bin_edges) if te_xy.size > 0 else (np.zeros(bins_count, dtype=int), None) + counts_yx, _ = np.histogram(te_yx, bins=bin_edges) if te_yx.size > 0 else (np.zeros(bins_count, dtype=int), None) + counts_zz, _ = np.histogram(te_zero, bins=bin_edges) if te_zero.size > 0 else (np.zeros(bins_count, dtype=int), None) + + ymax = int(max(counts_xy.max(initial=0), counts_yx.max(initial=0), counts_zz.max(initial=0))) + ymax = max(ymax, 1) + # If you want to set ymax to the number of bootstrap iterations, uncomment next line. + # ymax = n_samples + + # display histograms + fig, axes = plt.subplots(1, 3, figsize=(15, 4), sharex=True, sharey=True) + labels = [f'x{i}' for i in range(X.shape[1])] + + axes[0].hist(te_xy, bins=bin_edges) + axes[0].set_title(f"{labels[from_index]} -> {labels[to_index]}") + axes[0].yaxis.set_major_locator(ticker.MaxNLocator(integer=True)) + axes[0].set_xlim(xmin, xmax) + axes[0].set_ylim(0, ymax) + + axes[1].hist(te_yx, bins=bin_edges) + axes[1].set_title(f"{labels[to_index]} -> {labels[from_index]}") + axes[1].yaxis.set_major_locator(ticker.MaxNLocator(integer=True)) + axes[1].set_xlim(xmin, xmax) + axes[1].set_ylim(0, ymax) + + axes[2].hist(te_zero, bins=bin_edges) + axes[2].set_title("No directed edge between " + labels[from_index] + " and " + labels[to_index]) + axes[2].yaxis.set_major_locator(ticker.MaxNLocator(integer=True)) + axes[2].set_xlim(xmin, xmax) + axes[2].set_ylim(0, ymax) + + plt.tight_layout() + plt.show() + +.. image:: ../image/bootstrap_hists.png + Bootstrap Probability of Path ----------------------------- @@ -830,7 +970,7 @@ variable X0 to variable X1. .. code-block:: python from_index = 3 # index of x3 - to_index = 1 # index of x0 + to_index = 1 # index of x1 pd.DataFrame(result.get_paths(from_index, to_index)) @@ -888,57 +1028,237 @@ variable X0 to variable X1. 0 - [3, 0, 1] - 8.893562 - 0.98 + [3, 2, 1] + 11.914854 + 0.660 1 - [3, 2, 1] - 12.030408 - 0.96 + [3, 0, 1] + 8.756234 + 0.443 2 - [3, 2, 0, 1] - 2.239175 - 0.03 + [3, 1] + 2.105700 + 0.202 3 - [3, 1] - -0.639462 - 0.02 + [3, 2, 0, 1] + 1.635862 + 0.094 4 - [3, 2, 4, 0, 1] - -3.194541 - 0.02 + [3, 5, 0, 1] + 8.670284 + 0.060 5 [3, 4, 0, 1] - 9.820705 - 0.02 + 6.979752 + 0.054 6 - [3, 0, 2, 1] - 3.061033 - 0.01 + [3, 2, 4, 1] + -1.146483 + 0.038 7 - [3, 0, 5, 1] - 1.176834 - 0.01 + [3, 0, 4, 1] + 4.459602 + 0.028 8 + [3, 0, 5, 1] + 2.864025 + 0.026 + + + 9 + [3, 2, 4, 0, 1] + -4.602396 + 0.024 + + + 10 + [3, 0, 2, 1] + -1.512156 + 0.022 + + + 11 + [3, 4, 1] + 4.954881 + 0.019 + + + 12 + [3, 2, 5, 0, 1] + 0.374461 + 0.009 + + + 13 + [3, 2, 0, 5, 1] + 0.583856 + 0.008 + + + 14 + [3, 5, 4, 0, 1] + 6.941594 + 0.007 + + + 15 + [3, 4, 5, 0, 1] + 2.145360 + 0.007 + + + 16 + [3, 4, 2, 1] + -1.080988 + 0.007 + + + 17 + [3, 5, 1] + 3.272935 + 0.006 + + + 18 + [3, 4, 0, 5, 1] + 2.697207 + 0.005 + + + 19 + [3, 4, 2, 0, 1] + -0.219167 + 0.005 + + + 20 [3, 0, 5, 2, 1] - -2.719517 - 0.01 + 5.181321 + 0.004 + + + 21 + [3, 5, 0, 4, 1] + 5.442240 + 0.004 + + + 22 + [3, 5, 2, 1] + 1.537410 + 0.003 + + + 23 + [3, 4, 5, 1] + 4.166390 + 0.003 + + + 24 + [3, 0, 5, 4, 1] + -0.522766 + 0.003 + + + 25 + [3, 2, 4, 5, 0, 1] + -1.083415 + 0.003 + + + 26 + [3, 5, 4, 1] + -7.351469 + 0.002 + + + 27 + [3, 2, 4, 5, 1] + 0.203801 + 0.002 + + + 28 + [3, 2, 4, 0, 5, 1] + -1.303056 + 0.002 + + + 29 + [3, 5, 2, 0, 1] + -0.006054 + 0.002 + + + 30 + [3, 5, 4, 2, 1] + -15.137090 + 0.002 + + + 31 + [3, 4, 0, 2, 1] + -3.885974 + 0.001 + + + 32 + [3, 2, 5, 4, 1] + -0.035426 + 0.001 + + + 33 + [3, 5, 0, 2, 1] + 7.112032 + 0.001 + + + 34 + [3, 2, 0, 4, 1] + -3.206907 + 0.001 + + + 35 + [3, 5, 2, 4, 0, 1] + 0.351331 + 0.001 + + + 36 + [3, 0, 4, 5, 1] + -0.695107 + 0.001 + + + 37 + [3, 5, 4, 0, 2, 1] + 14.386599 + 0.001 + + + 38 + [3, 4, 2, 0, 5, 1] + -0.072976 + 0.001 diff --git a/docs/tutorial/bootstrap_with_imputation.rst b/docs/tutorial/bootstrap_with_imputation.rst index 4df14f0..3a596fe 100644 --- a/docs/tutorial/bootstrap_with_imputation.rst +++ b/docs/tutorial/bootstrap_with_imputation.rst @@ -28,8 +28,8 @@ Import and settings .. parsed-literal:: - ['1.24.4', '1.8.3'] - + ['1.26.4', '1.12.1'] + Test data --------- @@ -311,12 +311,17 @@ results with no missing data. Median value of each element of the matrix ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Median values of each element of the adjacency matrix estimated on the -data with missing values are as follows: +The following matrix shows the median of each adjacency matrix element +across all bootstrap replicates. For each bootstrap replicate, its +representative adjacency matrix is obtained by taking the median across +its multiple imputations. .. code-block:: python - np.median(adj_matrices_list, axis=(0, 1)) + adj_median_per_bootstrap = np.median(adj_matrices_list, axis=1) + adj_median_over_bootstrap = np.median(adj_median_per_bootstrap, axis=0) + + adj_median_over_bootstrap @@ -327,8 +332,8 @@ data with missing values are as follows: [ 0.555, 0. , 0.381, 0. , 0. , 0. ], [ 0. , 0. , 0. , 0.918, 0. , 0. ], [ 0. , 0. , 0. , 0. , 0. , 0. ], - [ 1.025, 0. , -0.147, 0. , 0. , 0. ], - [ 0.892, 0. , 0. , 0. , 0. , 0. ]]) + [ 1.026, 0. , -0.148, 0. , 0. , 0. ], + [ 0.893, 0. , 0. , 0. , 0. , 0. ]]) diff --git a/examples/Bootstrap.ipynb b/examples/Bootstrap.ipynb index 9b9223f..e5be0ab 100644 --- a/examples/Bootstrap.ipynb +++ b/examples/Bootstrap.ipynb @@ -29,7 +29,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "['1.24.4', '2.0.3', '0.20.1', '1.8.3']\n" + "['1.26.4', '2.3.3', '0.21', '1.12.1']\n" ] } ], @@ -40,6 +40,9 @@ "import lingam\n", "from lingam.utils import print_causal_directions, print_dagc, make_dot\n", "\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", "print([np.__version__, pd.__version__, graphviz.__version__, lingam.__version__])\n", "\n", "np.set_printoptions(precision=3, suppress=True)\n", @@ -96,60 +99,60 @@ " \n", " \n", " 0\n", - " 2.239321\n", - " 15.340724\n", - " 4.104399\n", + " 2.324257\n", + " 15.088680\n", + " 3.604677\n", " 0.548814\n", - " 14.176947\n", - " 9.249925\n", + " 15.299760\n", + " 9.698288\n", " \n", " \n", " 1\n", - " 2.155632\n", - " 16.630954\n", - " 4.767220\n", + " 2.415576\n", + " 17.995735\n", + " 4.987480\n", " 0.715189\n", - " 12.775458\n", - " 9.189045\n", + " 14.710164\n", + " 10.591596\n", " \n", " \n", " 2\n", - " 2.284116\n", - " 15.910406\n", - " 4.139736\n", + " 2.543484\n", + " 15.952262\n", + " 3.994332\n", " 0.602763\n", - " 14.201794\n", - " 9.273880\n", + " 16.878512\n", + " 10.273552\n", " \n", " \n", " 3\n", - " 2.343420\n", - " 14.921457\n", - " 3.519820\n", + " 2.596838\n", + " 14.769421\n", + " 3.448903\n", " 0.544883\n", - " 15.580067\n", - " 9.723392\n", + " 18.076397\n", + " 11.332654\n", " \n", " \n", " 4\n", - " 1.314940\n", - " 11.055176\n", - " 3.146972\n", + " 1.519718\n", + " 10.099609\n", + " 2.566608\n", " 0.423655\n", - " 7.604743\n", - " 5.312976\n", + " 9.924640\n", + " 6.948359\n", " \n", " \n", "\n", "" ], "text/plain": [ - " x0 x1 x2 x3 x4 x5\n", - "0 2.239321 15.340724 4.104399 0.548814 14.176947 9.249925\n", - "1 2.155632 16.630954 4.767220 0.715189 12.775458 9.189045\n", - "2 2.284116 15.910406 4.139736 0.602763 14.201794 9.273880\n", - "3 2.343420 14.921457 3.519820 0.544883 15.580067 9.723392\n", - "4 1.314940 11.055176 3.146972 0.423655 7.604743 5.312976" + " x0 x1 x2 x3 x4 x5\n", + "0 2.324257 15.088680 3.604677 0.548814 15.299760 9.698288\n", + "1 2.415576 17.995735 4.987480 0.715189 14.710164 10.591596\n", + "2 2.543484 15.952262 3.994332 0.602763 16.878512 10.273552\n", + "3 2.596838 14.769421 3.448903 0.544883 18.076397 11.332654\n", + "4 1.519718 10.099609 2.566608 0.423655 9.924640 6.948359" ] }, "execution_count": 2, @@ -158,12 +161,13 @@ } ], "source": [ - "x3 = np.random.uniform(size=1000)\n", - "x0 = 3.0*x3 + np.random.uniform(size=1000)\n", - "x2 = 6.0*x3 + np.random.uniform(size=1000)\n", - "x1 = 3.0*x0 + 2.0*x2 + np.random.uniform(size=1000)\n", - "x5 = 4.0*x0 + np.random.uniform(size=1000)\n", - "x4 = 8.0*x0 - 1.0*x2 + np.random.uniform(size=1000)\n", + "_size = 100\n", + "x3 = np.random.uniform(size=_size)\n", + "x0 = 3.0*x3 + np.random.uniform(size=_size)\n", + "x2 = 6.0*x3 + np.random.uniform(size=_size)\n", + "x1 = 3.0*x0 + 2.0*x2 + np.random.uniform(size=_size)\n", + "x5 = 4.0*x0 + np.random.uniform(size=_size)\n", + "x4 = 8.0*x0 - 1.0*x2 + np.random.uniform(size=_size)\n", "X = pd.DataFrame(np.array([x0, x1, x2, x3, x4, x5]).T ,columns=['x0', 'x1', 'x2', 'x3', 'x4', 'x5'])\n", "X.head()" ] @@ -184,104 +188,103 @@ "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", "\n", - "%3\n", - "\n", + "\n", "\n", "\n", "x0\n", - "\n", - "x0\n", + "\n", + "x0\n", "\n", "\n", "\n", "x1\n", - "\n", - "x1\n", + "\n", + "x1\n", "\n", "\n", "\n", "x0->x1\n", - "\n", - "\n", - "3.00\n", + "\n", + "\n", + "3.00\n", "\n", "\n", "\n", "x4\n", "\n", - "x4\n", + "x4\n", "\n", "\n", "\n", "x0->x4\n", - "\n", - "\n", - "8.00\n", + "\n", + "\n", + "8.00\n", "\n", "\n", "\n", "x5\n", - "\n", - "x5\n", + "\n", + "x5\n", "\n", "\n", "\n", "x0->x5\n", - "\n", - "\n", - "4.00\n", + "\n", + "\n", + "4.00\n", "\n", "\n", "\n", "x2\n", - "\n", - "x2\n", + "\n", + "x2\n", "\n", "\n", "\n", "x2->x1\n", - "\n", - "\n", - "2.00\n", + "\n", + "\n", + "2.00\n", "\n", "\n", "\n", "x2->x4\n", - "\n", - "\n", - "-1.00\n", + "\n", + "\n", + "-1.00\n", "\n", "\n", "\n", "x3\n", "\n", - "x3\n", + "x3\n", "\n", "\n", "\n", "x3->x0\n", - "\n", - "\n", - "3.00\n", + "\n", + "\n", + "3.00\n", "\n", "\n", "\n", "x3->x2\n", - "\n", - "\n", - "6.00\n", + "\n", + "\n", + "6.00\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -319,8 +322,10 @@ }, "outputs": [], "source": [ + "n_samples = 1000\n", + "\n", "model = lingam.DirectLiNGAM()\n", - "result = model.bootstrap(X, n_sampling=100)" + "result = model.bootstrap(X, n_sampling=n_samples)" ] }, { @@ -366,19 +371,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "x5 <--- x0 (b>0) (100.0%)\n", - "x1 <--- x0 (b>0) (100.0%)\n", - "x1 <--- x2 (b>0) (100.0%)\n", - "x4 <--- x2 (b<0) (100.0%)\n", - "x0 <--- x3 (b>0) (98.0%)\n", - "x4 <--- x0 (b>0) (98.0%)\n", - "x2 <--- x3 (b>0) (96.0%)\n", - "x3 <--- x2 (b>0) (4.0%)\n" + "x4 <--- x2 (b<0) (87.9%)\n", + "x4 <--- x0 (b>0) (86.6%)\n", + "x1 <--- x2 (b>0) (77.5%)\n", + "x1 <--- x0 (b>0) (77.3%)\n", + "x2 <--- x3 (b>0) (76.1%)\n", + "x5 <--- x0 (b>0) (75.4%)\n", + "x0 <--- x3 (b>0) (45.4%)\n", + "x0 <--- x5 (b>0) (24.6%)\n" ] } ], "source": [ - "print_causal_directions(cdc, 100)" + "print_causal_directions(cdc, n_samples)" ] }, { @@ -424,7 +429,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "DAG[0]: 84.0%\n", + "DAG[0]: 17.0%\n", "\tx0 <--- x3 (b>0)\n", "\tx1 <--- x0 (b>0)\n", "\tx1 <--- x2 (b>0)\n", @@ -432,7 +437,7 @@ "\tx4 <--- x0 (b>0)\n", "\tx4 <--- x2 (b<0)\n", "\tx5 <--- x0 (b>0)\n", - "DAG[1]: 3.0%\n", + "DAG[1]: 4.2%\n", "\tx0 <--- x3 (b>0)\n", "\tx1 <--- x0 (b>0)\n", "\tx1 <--- x2 (b>0)\n", @@ -440,12 +445,11 @@ "\tx4 <--- x0 (b>0)\n", "\tx4 <--- x2 (b<0)\n", "\tx5 <--- x0 (b>0)\n", - "DAG[2]: 2.0%\n", - "\tx0 <--- x3 (b>0)\n", + "DAG[2]: 3.9%\n", "\tx1 <--- x0 (b>0)\n", "\tx1 <--- x2 (b>0)\n", - "\tx1 <--- x3 (b<0)\n", "\tx2 <--- x3 (b>0)\n", + "\tx3 <--- x0 (b>0)\n", "\tx4 <--- x0 (b>0)\n", "\tx4 <--- x2 (b<0)\n", "\tx5 <--- x0 (b>0)\n" @@ -453,7 +457,7 @@ } ], "source": [ - "print_dagc(dagc, 100)" + "print_dagc(dagc, n_samples)" ] }, { @@ -478,12 +482,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[0. 0. 0.03 0.98 0.02 0. ]\n", - " [1. 0. 1. 0.02 0. 0.01]\n", - " [0.01 0. 0. 0.96 0. 0.01]\n", - " [0. 0. 0.04 0. 0. 0. ]\n", - " [0.98 0.01 1. 0.02 0. 0.02]\n", - " [1. 0. 0.02 0.02 0. 0. ]]\n" + "[[0. 0.178 0.163 0.482 0.134 0.246]\n", + " [0.773 0. 0.775 0.202 0.069 0.064]\n", + " [0.2 0.225 0. 0.761 0.093 0.032]\n", + " [0.183 0.166 0.19 0. 0.031 0.084]\n", + " [0.866 0.074 0.88 0.121 0. 0.043]\n", + " [0.754 0.059 0.065 0.095 0.062 0. ]]\n" ] } ], @@ -541,150 +545,213 @@ " \n", "
\n", " 0\n", - " x3\n", - " x0\n", - " 3.004106\n", - " 1.00\n", + " x2\n", + " x4\n", + " -0.986006\n", + " 0.884\n", "
\n", "
\n", " 1\n", " x0\n", - " x1\n", - " 2.963177\n", - " 1.00\n", + " x4\n", + " 7.975821\n", + " 0.866\n", "
\n", "
\n", " 2\n", - " x2\n", - " x1\n", - " 2.017539\n", - " 1.00\n", + " x3\n", + " x4\n", + " 17.169757\n", + " 0.858\n", "
\n", "
\n", " 3\n", " x3\n", " x1\n", - " 20.928254\n", - " 1.00\n", + " 20.553538\n", + " 0.794\n", "
\n", "
\n", " 4\n", " x0\n", - " x5\n", - " 3.997787\n", - " 1.00\n", + " x1\n", + " 3.020369\n", + " 0.793\n", "
\n", "
\n", " 5\n", " x3\n", - " x4\n", - " 18.077943\n", - " 1.00\n", + " x2\n", + " 5.968590\n", + " 0.788\n", "
\n", "
\n", " 6\n", - " x3\n", - " x5\n", - " 12.012988\n", - " 1.00\n", + " x2\n", + " x1\n", + " 1.992771\n", + " 0.775\n", "
\n", "
\n", " 7\n", - " x2\n", - " x4\n", - " -1.006362\n", - " 1.00\n", + " x0\n", + " x5\n", + " 3.984278\n", + " 0.754\n", "
\n", "
\n", " 8\n", - " x0\n", - " x4\n", - " 8.011818\n", - " 0.98\n", + " x3\n", + " x5\n", + " 11.686617\n", + " 0.657\n", "
\n", "
\n", " 9\n", " x3\n", - " x2\n", - " 5.964879\n", - " 0.96\n", + " x0\n", + " 2.920996\n", + " 0.653\n", "
\n", "
\n", " 10\n", + " x0\n", " x2\n", - " x5\n", - " 0.396327\n", - " 0.09\n", + " 1.679845\n", + " 0.343\n", "
\n", "
\n", " 11\n", " x2\n", - " x0\n", - " 0.487915\n", - " 0.07\n", + " x5\n", + " 0.155444\n", + " 0.282\n", "
\n", "
\n", " 12\n", - " x2\n", - " x3\n", - " 0.164565\n", - " 0.04\n", + " x5\n", + " x4\n", + " 1.550997\n", + " 0.266\n", "
\n", "
\n", " 13\n", - " x5\n", - " x4\n", - " 0.087437\n", - " 0.03\n", + " x0\n", + " x3\n", + " 0.305366\n", + " 0.260\n", "
\n", "
\n", " 14\n", - " x4\n", " x5\n", - " 0.496445\n", - " 0.02\n", + " x1\n", + " 0.939446\n", + " 0.259\n", "
\n", "
\n", " 15\n", " x5\n", - " x1\n", - " -0.064703\n", - " 0.02\n", + " x0\n", + " 0.249365\n", + " 0.246\n", "
\n", "
\n", " 16\n", - " x4\n", " x1\n", - " 0.367100\n", - " 0.02\n", + " x4\n", + " 0.863039\n", + " 0.245\n", "
\n", "
\n", " 17\n", - " x4\n", + " x2\n", " x0\n", - " 0.124114\n", - " 0.02\n", + " 0.120842\n", + " 0.244\n", "
\n", "
\n", " 18\n", - " x0\n", + " x1\n", " x2\n", - " 0.056261\n", - " 0.01\n", + " 0.285349\n", + " 0.225\n", "
\n", "
\n", " 19\n", " x1\n", - " x4\n", - " -0.097108\n", - " 0.01\n", + " x5\n", + " 0.576121\n", + " 0.199\n", "
\n", "
\n", " 20\n", + " x1\n", + " x0\n", + " 0.144407\n", + " 0.197\n", + "
\n", + "
\n", + " 21\n", " x5\n", " x2\n", - " -0.111894\n", - " 0.01\n", + " 0.451434\n", + " 0.196\n", + "
\n", + "
\n", + " 22\n", + " x1\n", + " x3\n", + " 0.046961\n", + " 0.194\n", + "
\n", + "
\n", + " 23\n", + " x2\n", + " x3\n", + " 0.133917\n", + " 0.191\n", + "
\n", + "
\n", + " 24\n", + " x5\n", + " x3\n", + " 0.076654\n", + " 0.168\n", + "
\n", + "
\n", + " 25\n", + " x4\n", + " x1\n", + " 0.362045\n", + " 0.144\n", + "
\n", + "
\n", + " 26\n", + " x4\n", + " x5\n", + " 0.478376\n", + " 0.143\n", + "
\n", + "
\n", + " 27\n", + " x4\n", + " x0\n", + " 0.123534\n", + " 0.134\n", + "
\n", + "
\n", + " 28\n", + " x4\n", + " x2\n", + " -0.139721\n", + " 0.097\n", + "
\n", + "
\n", + " 29\n", + " x4\n", + " x3\n", + " -0.006454\n", + " 0.043\n", "
\n", "
\n", "\n", @@ -692,27 +759,36 @@ ], "text/plain": [ " from to effect probability\n", - "0 x3 x0 3.004106 1.00\n", - "1 x0 x1 2.963177 1.00\n", - "2 x2 x1 2.017539 1.00\n", - "3 x3 x1 20.928254 1.00\n", - "4 x0 x5 3.997787 1.00\n", - "5 x3 x4 18.077943 1.00\n", - "6 x3 x5 12.012988 1.00\n", - "7 x2 x4 -1.006362 1.00\n", - "8 x0 x4 8.011818 0.98\n", - "9 x3 x2 5.964879 0.96\n", - "10 x2 x5 0.396327 0.09\n", - "11 x2 x0 0.487915 0.07\n", - "12 x2 x3 0.164565 0.04\n", - "13 x5 x4 0.087437 0.03\n", - "14 x4 x5 0.496445 0.02\n", - "15 x5 x1 -0.064703 0.02\n", - "16 x4 x1 0.367100 0.02\n", - "17 x4 x0 0.124114 0.02\n", - "18 x0 x2 0.056261 0.01\n", - "19 x1 x4 -0.097108 0.01\n", - "20 x5 x2 -0.111894 0.01" + "0 x2 x4 -0.986006 0.884\n", + "1 x0 x4 7.975821 0.866\n", + "2 x3 x4 17.169757 0.858\n", + "3 x3 x1 20.553538 0.794\n", + "4 x0 x1 3.020369 0.793\n", + "5 x3 x2 5.968590 0.788\n", + "6 x2 x1 1.992771 0.775\n", + "7 x0 x5 3.984278 0.754\n", + "8 x3 x5 11.686617 0.657\n", + "9 x3 x0 2.920996 0.653\n", + "10 x0 x2 1.679845 0.343\n", + "11 x2 x5 0.155444 0.282\n", + "12 x5 x4 1.550997 0.266\n", + "13 x0 x3 0.305366 0.260\n", + "14 x5 x1 0.939446 0.259\n", + "15 x5 x0 0.249365 0.246\n", + "16 x1 x4 0.863039 0.245\n", + "17 x2 x0 0.120842 0.244\n", + "18 x1 x2 0.285349 0.225\n", + "19 x1 x5 0.576121 0.199\n", + "20 x1 x0 0.144407 0.197\n", + "21 x5 x2 0.451434 0.196\n", + "22 x1 x3 0.046961 0.194\n", + "23 x2 x3 0.133917 0.191\n", + "24 x5 x3 0.076654 0.168\n", + "25 x4 x1 0.362045 0.144\n", + "26 x4 x5 0.478376 0.143\n", + "27 x4 x0 0.123534 0.134\n", + "28 x4 x2 -0.139721 0.097\n", + "29 x4 x3 -0.006454 0.043" ] }, "execution_count": 10, @@ -780,36 +856,36 @@ " 3\n", " x3\n", " x1\n", - " 20.928254\n", - " 1.00\n", + " 20.553538\n", + " 0.794\n", " \n", "
\n", - " 5\n", + " 2\n", " x3\n", " x4\n", - " 18.077943\n", - " 1.00\n", + " 17.169757\n", + " 0.858\n", "
\n", "
\n", - " 6\n", + " 8\n", " x3\n", " x5\n", - " 12.012988\n", - " 1.00\n", + " 11.686617\n", + " 0.657\n", "
\n", "
\n", - " 8\n", + " 1\n", " x0\n", " x4\n", - " 8.011818\n", - " 0.98\n", + " 7.975821\n", + " 0.866\n", "
\n", "
\n", - " 9\n", + " 5\n", " x3\n", " x2\n", - " 5.964879\n", - " 0.96\n", + " 5.968590\n", + " 0.788\n", "
\n", " \n", "\n", @@ -817,11 +893,11 @@ ], "text/plain": [ " from to effect probability\n", - "3 x3 x1 20.928254 1.00\n", - "5 x3 x4 18.077943 1.00\n", - "6 x3 x5 12.012988 1.00\n", - "8 x0 x4 8.011818 0.98\n", - "9 x3 x2 5.964879 0.96" + "3 x3 x1 20.553538 0.794\n", + "2 x3 x4 17.169757 0.858\n", + "8 x3 x5 11.686617 0.657\n", + "1 x0 x4 7.975821 0.866\n", + "5 x3 x2 5.968590 0.788" ] }, "execution_count": 11, @@ -872,39 +948,39 @@ " \n", " \n", "
\n", - " 20\n", - " x5\n", - " x2\n", - " -0.111894\n", - " 0.01\n", + " 29\n", + " x4\n", + " x3\n", + " -0.006454\n", + " 0.043\n", "
\n", "
\n", - " 18\n", - " x0\n", + " 28\n", + " x4\n", " x2\n", - " 0.056261\n", - " 0.01\n", + " -0.139721\n", + " 0.097\n", "
\n", "
\n", - " 19\n", - " x1\n", + " 27\n", " x4\n", - " -0.097108\n", - " 0.01\n", + " x0\n", + " 0.123534\n", + " 0.134\n", "
\n", "
\n", - " 17\n", + " 26\n", " x4\n", - " x0\n", - " 0.124114\n", - " 0.02\n", + " x5\n", + " 0.478376\n", + " 0.143\n", "
\n", "
\n", - " 16\n", + " 25\n", " x4\n", " x1\n", - " 0.367100\n", - " 0.02\n", + " 0.362045\n", + " 0.144\n", "
\n", "
\n", "\n", @@ -912,11 +988,11 @@ ], "text/plain": [ " from to effect probability\n", - "20 x5 x2 -0.111894 0.01\n", - "18 x0 x2 0.056261 0.01\n", - "19 x1 x4 -0.097108 0.01\n", - "17 x4 x0 0.124114 0.02\n", - "16 x4 x1 0.367100 0.02" + "29 x4 x3 -0.006454 0.043\n", + "28 x4 x2 -0.139721 0.097\n", + "27 x4 x0 0.123534 0.134\n", + "26 x4 x5 0.478376 0.143\n", + "25 x4 x1 0.362045 0.144" ] }, "execution_count": 12, @@ -974,39 +1050,39 @@ " \n", " \n", "
\n", - " 1\n", - " x0\n", + " 3\n", + " x3\n", " x1\n", - " 2.963177\n", - " 1.00\n", + " 20.553538\n", + " 0.794\n", "
\n", "
\n", - " 2\n", - " x2\n", + " 4\n", + " x0\n", " x1\n", - " 2.017539\n", - " 1.00\n", + " 3.020369\n", + " 0.793\n", "
\n", "
\n", - " 3\n", - " x3\n", + " 6\n", + " x2\n", " x1\n", - " 20.928254\n", - " 1.00\n", + " 1.992771\n", + " 0.775\n", "
\n", "
\n", - " 15\n", + " 14\n", " x5\n", " x1\n", - " -0.064703\n", - " 0.02\n", + " 0.939446\n", + " 0.259\n", "
\n", "
\n", - " 16\n", + " 25\n", " x4\n", " x1\n", - " 0.367100\n", - " 0.02\n", + " 0.362045\n", + " 0.144\n", "
\n", "
\n", "\n", @@ -1014,11 +1090,11 @@ ], "text/plain": [ " from to effect probability\n", - "1 x0 x1 2.963177 1.00\n", - "2 x2 x1 2.017539 1.00\n", - "3 x3 x1 20.928254 1.00\n", - "15 x5 x1 -0.064703 0.02\n", - "16 x4 x1 0.367100 0.02" + "3 x3 x1 20.553538 0.794\n", + "4 x0 x1 3.020369 0.793\n", + "6 x2 x1 1.992771 0.775\n", + "14 x5 x1 0.939446 0.259\n", + "25 x4 x1 0.362045 0.144" ] }, "execution_count": 13, @@ -1050,9 +1126,9 @@ { "data": { "text/plain": [ - "(array([ 1., 8., 10., 17., 19., 20., 13., 9., 1., 2.]),\n", - " array([2.936, 2.951, 2.965, 2.98 , 2.994, 3.008, 3.023, 3.037, 3.051,\n", - " 3.066, 3.08 ]),\n", + "(array([ 26., 18., 348., 13., 0., 4., 570., 7., 12., 2.]),\n", + " array([-2.185, -1.413, -0.641, 0.131, 0.904, 1.676, 2.448, 3.22 ,\n", + " 3.993, 4.765, 5.537]),\n", " )" ] }, @@ -1062,14 +1138,12 @@ }, { "data": { - "image/png": "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", + "image/png": "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dtaDyvDhw6Nnz56xcePGlmUNDQ2xdevW4noqAAAdNkYljU2ZPHlyLFy4MM4999w477zziuuopOupTJw48WzvDgCQsQ654Nv06dOjsbEx5syZU8z0SS0py5cvj86dO3fE7gAAmTrr05MBAE5W3nMSAYCqJqgAANkSVACAbAkqAEC2BBUAIFuCCgCQLUEFAMiWoNKOXnnllbjxxhvjz//8z4uL2H3pS1+K559/PirdrbfeGjfddFNUgubm5li8eHGMGzcuRo0aFdOmTYudO3dGpbv//vvj6quvjkr0xhtvFOfo5ZdfHpdcckl84QtfiM2bN0elee2112LWrFkxZsyYuPjii+Paa6+N7du3RyV76aWXilrXrl0blejVV1+NYcOGHXer1HpPRFBpJ+nboNMbwx/+8Ie47777YtWqVXHOOefEF7/4xXj99dejEqU/6vfcc0+sXr06KsWSJUuK3928efPi4YcfLmqcOnXqcd/2XUkeeuih+O53vxuVKn14+NWvflWcq2vWrImPfOQjxYeIF198MSrJ9ddfHzt27IilS5fGj370o+Kb6q+55po4ePBgVKK33347Zs6cGW+99VZUqm3btkXXrl3j5z//eTz55JMtt8985jNRTQSVdpI+oT333HPFdxh97GMfiw9/+MPFdxilF9F//dd/RaVJn9T+/u//Pn74wx/GBz7wgagEKYysWLGi+IqH8ePHF1+guWjRoti1a1esX78+KvHT2pe//OXinL3ggguiEqU/3L/4xS/i9ttvj0svvTQGDx4ct9xyS/Tr1y/WrVsXlWLfvn3F96bdeeedMXLkyBgyZEh89atfLb6VvlJbde+9997iC24rWfqbcsEFFxTna9++fVtuKYRWE0GlnaRgkj7J9O/f/38Pbk1Ny7dDV5oNGzYUb4b/8R//Eeeff35UyqeXAwcOxNixY1uW1dfXx4gRI2LTpk1RaX73u98V36/14x//OC666KKoRL179y5el+nDQ0mnTp2KWyW9Lt/3vvfF3XffHUOHDi1+Tq24K1euLL7s9cILL4xKk16PqSV3wYIFUcmeffbZ4n222nXIlxJWopRyP/GJT7Ra9i//8i/Fly6mMSuV5qqrropKk1pOkoEDB7Zanj7NlNZVkgkTJhS3SpaC5jtflz/96U+LlpZvfvObUYlSi9EjjzxSfFP99773vejRo0dUkhQwZ8+eXXyp7Ttfq5XYotK7d+/i/TaNx/ngBz8YX/nKV4rxVtVEUDlJv//97+Mv//IvT7j+qaeeinPPPbfl55/97GfFJ5zUR5wGP1VyrZWi1Jef3uCPlfqIU9M65e+Xv/xlfOMb34iJEycW3XuVKI2L+/znP1+MPUrjVtKYqz/7sz+LSpG68dIA2s9+9rNRyRobG4txVBdeeGExWSF1cz322GPFWMjvf//7rVp+K52gcpJSl85PfvKT92x6LfnXf/3XYjDm5z73uSL5V3KtlaTU75vGqhzbB3z48OHo3r17B+4Z7eHxxx8vBl+mmT9pXE6lKnX1zJ8/P55++ul48MEH49vf/nZUgkcffbQYD1hJ44tOpK6uLjZu3Bi1tbUt70cf/ehHizFHy5cvF1Q4XurLP5m+wjSAdtmyZTFlypT4p3/6p6IvvFJrrTSlZuQ0AHHQoEEty9PP5dYqRmvpj3X6w/3pT386vvOd7xzXalbu0piU1NL5qU99qvgDVxojl0JLOn8rRZq1laZhv7M17Lbbbis+XKX33kqSZo6+23jINPOnmhhM245KISUFlNRUV44hpZqlWT6peTV9ijm2P3zr1q3FdXEoT6Xp5qmfP01RrrSQkuzZs6eYhp3CyrHTd9O5W0kfOlJLWAokqWWldEvSTL0URCtJajlJrX8bj3k/Sn77299W5ADp96Lrp52kkymFlHTRrNR3mq6nUpIGs71bMiYv6Q/Y5MmTizfDNAYnTfdM4TPNnEhjGig/aQDit771rfjkJz8Z1113XfEHvSQ1p/fq1SsqQZrtkwZYpunJ6Za6Z9NF/FLQTuPkKsWxsyqP1adPnxOuK1cpYH7oQx+KuXPnxh133FEMqk2DpH/9618XLUvVRFBpJ2mabmmmT7od62tf+1rccMMN7fVfcQalT2ZpEFuaUZBmbKWWlNQfnLrDKD9phk9qWUiD29PtWJMmTaqo6a2ptSgN4J8xY0bs37+/uG5MGlBbKdc5qjap6y5dPPTuu++Or3/960XoTJdKSANpS9PQq0Wno0ePHu3onQAAeDfGqAAA2RJUAIBsCSoAQLYEFQAgW4IKAJAtQQUAyJagAgBkS1ABALIlqAAA2RJUAIBsCSoAQOTq/wK3j3WBZf+v1AAAAABJRU5ErkJggg==", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1084,6 +1158,95 @@ "plt.hist(result.total_effects_[:, to_index, from_index])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Furthermore, when we separate the bootstrap coefficient distributions into the three structural cases — X→Y, Y→X, and no directed edge between X and Y — the resulting histograms are shown below." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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mDFjYt26dU3bEgAAAAAAaIK2DV1h6dKlccEFF8T8+fNj5513rjfvzjvvjHbt2sXFF18cbdu2jX79+sVrr70WM2fOjCOOOCJLis+ePTvGjx8fI0aMyNaZPn16Vm0+b968GDVqVFO2BQAAAAAAtl3C/M9//nOWFL/33nvjpz/9abzxxhu185544ok48MADs2R5wUEHHZQN3fL222/HX//613j//fdj6NChtfMrKipi0KBBsWDBgiYlzNu2NRx7sZSXl9W7p/TiInZbNwabmmaf54/YNJ4+uHgct/kkLvklNvkkLo2nDy4ex21+iU0+iUs+iUszJczTuOTptilLliyJ/v3715vWs2fP7P7NN9/M5id9+vT50DKFeY1RVtYmunXbrtHr0zwqKjrZlTkkLvnc9+KSX2LTMPrgfHDc5pO45JfY5JO4NIw+OB8ct/klNvkkLvkkLk1MmH+UNWvWRPv27etN69ChQ3a/du3aWL16dfZ4U8usWLGi0a9bVVUdlZWrGr0+TT8bld5YlZWrY8OGKruzBONSWJbmtal97/2SX60pNmk7m+tXDvrg4mpNx20pEZf8Ept8ak1x0Qe3HK3puC01YpNP4pJPrSkuFQ34P7hZE+YdO3b80MU7U6I86dy5czY/ScsUHheW6dSpacm69etbdlBLQXpjiUP+iEs+97245JfYNJzP/uJz3OaTuOSX2OSTuDScPrj4HLf5JTb5JC75JC71Neug0717945ly5bVm1b4u1evXrVDsWxqmTQfAAAAAACKpVkrzIcMGRK33357bNiwIcrLy7Npjz/+eOyyyy6x4447RteuXaNLly4xf/786Nu3bza/srIyFi5cGKNHj27OpgBA0cYTTTcAAACglSfMjzjiiLjhhhvi3HPPjTFjxsQzzzwTN954Y1x00UW1Y5enxPi0adOie/fusdNOO8XUqVOzyvSRI0c2Z1MAYJtLifIddujcbOODAwAAACWcME9V5ClhPmXKlDj88MOjR48eMXHixOxxwbhx42L9+vUxadKk7CKhqSp91qxZ0a5du+ZsCgAUJWGekuXTbnsyXl+6MrcRuHDs0Niha81FuQEAAIBmSphfeumlH5q29957xx133LHZddJQLRMmTMhuANASpWT5y2+siLxa38Kvfg4AAACN5TfjAAAAAAAgYQ4AAAAAADVUmAMAAAAAgIQ5AAAA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.ticker as ticker\n", + "\n", + "from_index, to_index = 2, 4\n", + "\n", + "te_xy = result.total_effects_[:, to_index, from_index]\n", + "te_yx = result.total_effects_[:, from_index, to_index]\n", + "\n", + "both_zero_mask = (te_xy == 0.0) & (te_yx == 0.0)\n", + "te_zero = result.total_effects_[both_zero_mask, to_index, from_index]\n", + "\n", + "te_xy = te_xy[te_xy != 0.0]\n", + "te_yx = te_yx[te_yx != 0.0]\n", + "\n", + "bins_count = int(np.ceil(1 + np.log2(max(n_samples, 1))))\n", + "\n", + "# calculate xmin, xmax\n", + "arr_list = [te_xy, te_yx, te_zero]\n", + "if any(a.size > 0 for a in arr_list):\n", + " vals = np.concatenate([a for a in arr_list if a.size > 0])\n", + "else:\n", + " vals = np.array([0.0])\n", + "\n", + "xmin, xmax = np.min(vals), np.max(vals)\n", + "if xmin == xmax:\n", + " eps = 1e-9 if xmin == 0 else abs(xmin) * 1e-3\n", + " xmin, xmax = xmin - eps, xmax + eps\n", + "\n", + "bin_edges = np.linspace(xmin, xmax, bins_count + 1)\n", + "\n", + "# calculate ymax\n", + "counts_xy, _ = np.histogram(te_xy, bins=bin_edges) if te_xy.size > 0 else (np.zeros(bins_count, dtype=int), None)\n", + "counts_yx, _ = np.histogram(te_yx, bins=bin_edges) if te_yx.size > 0 else (np.zeros(bins_count, dtype=int), None)\n", + "counts_zz, _ = np.histogram(te_zero, bins=bin_edges) if te_zero.size > 0 else (np.zeros(bins_count, dtype=int), None)\n", + "\n", + "ymax = int(max(counts_xy.max(initial=0), counts_yx.max(initial=0), counts_zz.max(initial=0)))\n", + "ymax = max(ymax, 1)\n", + "# If you want to set ymax to the number of bootstrap iterations, uncomment next line.\n", + "# ymax = n_samples\n", + "\n", + "# display histograms\n", + "fig, axes = plt.subplots(1, 3, figsize=(15, 4), sharex=True, sharey=True)\n", + "labels = [f'x{i}' for i in range(X.shape[1])]\n", + "\n", + "axes[0].hist(te_xy, bins=bin_edges)\n", + "axes[0].set_title(f\"{labels[from_index]} -> {labels[to_index]}\")\n", + "axes[0].yaxis.set_major_locator(ticker.MaxNLocator(integer=True))\n", + "axes[0].set_xlim(xmin, xmax)\n", + "axes[0].set_ylim(0, ymax)\n", + "\n", + "axes[1].hist(te_yx, bins=bin_edges)\n", + "axes[1].set_title(f\"{labels[to_index]} -> {labels[from_index]}\")\n", + "axes[1].yaxis.set_major_locator(ticker.MaxNLocator(integer=True))\n", + "axes[1].set_xlim(xmin, xmax)\n", + "axes[1].set_ylim(0, ymax)\n", + "\n", + "axes[2].hist(te_zero, bins=bin_edges)\n", + "axes[2].set_title(\"No directed edge between \" + labels[from_index] + \" and \" + labels[to_index])\n", + "axes[2].yaxis.set_major_locator(ticker.MaxNLocator(integer=True))\n", + "axes[2].set_xlim(xmin, xmax)\n", + "axes[2].set_ylim(0, ymax)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1094,7 +1257,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2021-06-25T01:43:17.514898Z", @@ -1131,83 +1294,293 @@ " \n", "
\n", " 0\n", - " [3, 0, 1]\n", - " 8.893562\n", - " 0.98\n", + " [3, 2, 1]\n", + " 11.914854\n", + " 0.660\n", "
\n", "
\n", " 1\n", - " [3, 2, 1]\n", - " 12.030408\n", - " 0.96\n", + " [3, 0, 1]\n", + " 8.756234\n", + " 0.443\n", "
\n", "
\n", " 2\n", - " [3, 2, 0, 1]\n", - " 2.239175\n", - " 0.03\n", + " [3, 1]\n", + " 2.105700\n", + " 0.202\n", "
\n", "
\n", " 3\n", - " [3, 1]\n", - " -0.639462\n", - " 0.02\n", + " [3, 2, 0, 1]\n", + " 1.635862\n", + " 0.094\n", "
\n", "
\n", " 4\n", - " [3, 2, 4, 0, 1]\n", - " -3.194541\n", - " 0.02\n", + " [3, 5, 0, 1]\n", + " 8.670284\n", + " 0.060\n", "
\n", "
\n", " 5\n", " [3, 4, 0, 1]\n", - " 9.820705\n", - " 0.02\n", + " 6.979752\n", + " 0.054\n", "
\n", "
\n", " 6\n", - " [3, 0, 2, 1]\n", - " 3.061033\n", - " 0.01\n", + " [3, 2, 4, 1]\n", + " -1.146483\n", + " 0.038\n", "
\n", "
\n", " 7\n", - " [3, 0, 5, 1]\n", - " 1.176834\n", - " 0.01\n", + " [3, 0, 4, 1]\n", + " 4.459602\n", + " 0.028\n", "
\n", "
\n", " 8\n", + " [3, 0, 5, 1]\n", + " 2.864025\n", + " 0.026\n", + "
\n", + "
\n", + " 9\n", + " [3, 2, 4, 0, 1]\n", + " -4.602396\n", + " 0.024\n", + "
\n", + "
\n", + " 10\n", + " [3, 0, 2, 1]\n", + " -1.512156\n", + " 0.022\n", + "
\n", + "
\n", + " 11\n", + " [3, 4, 1]\n", + " 4.954881\n", + " 0.019\n", + "
\n", + "
\n", + " 12\n", + " [3, 2, 5, 0, 1]\n", + " 0.374461\n", + " 0.009\n", + "
\n", + "
\n", + " 13\n", + " [3, 2, 0, 5, 1]\n", + " 0.583856\n", + " 0.008\n", + "
\n", + "
\n", + " 14\n", + " [3, 5, 4, 0, 1]\n", + " 6.941594\n", + " 0.007\n", + "
\n", + "
\n", + " 15\n", + " [3, 4, 5, 0, 1]\n", + " 2.145360\n", + " 0.007\n", + "
\n", + "
\n", + " 16\n", + " [3, 4, 2, 1]\n", + " -1.080988\n", + " 0.007\n", + "
\n", + "
\n", + " 17\n", + " [3, 5, 1]\n", + " 3.272935\n", + " 0.006\n", + "
\n", + "
\n", + " 18\n", + " [3, 4, 0, 5, 1]\n", + " 2.697207\n", + " 0.005\n", + "
\n", + "
\n", + " 19\n", + " [3, 4, 2, 0, 1]\n", + " -0.219167\n", + " 0.005\n", + "
\n", + "
\n", + " 20\n", " [3, 0, 5, 2, 1]\n", - " -2.719517\n", - " 0.01\n", + " 5.181321\n", + " 0.004\n", + "
\n", + "
\n", + " 21\n", + " [3, 5, 0, 4, 1]\n", + " 5.442240\n", + " 0.004\n", + "
\n", + "
\n", + " 22\n", + " [3, 5, 2, 1]\n", + " 1.537410\n", + " 0.003\n", + "
\n", + "
\n", + " 23\n", + " [3, 4, 5, 1]\n", + " 4.166390\n", + " 0.003\n", + "
\n", + "
\n", + " 24\n", + " [3, 0, 5, 4, 1]\n", + " -0.522766\n", + " 0.003\n", + "
\n", + "
\n", + " 25\n", + " [3, 2, 4, 5, 0, 1]\n", + " -1.083415\n", + " 0.003\n", + "
\n", + "
\n", + " 26\n", + " [3, 5, 4, 1]\n", + " -7.351469\n", + " 0.002\n", + "
\n", + "
\n", + " 27\n", + " [3, 2, 4, 5, 1]\n", + " 0.203801\n", + " 0.002\n", + "
\n", + "
\n", + " 28\n", + " [3, 2, 4, 0, 5, 1]\n", + " -1.303056\n", + " 0.002\n", + "
\n", + "
\n", + " 29\n", + " [3, 5, 2, 0, 1]\n", + " -0.006054\n", + " 0.002\n", + "
\n", + "
\n", + " 30\n", + " [3, 5, 4, 2, 1]\n", + " -15.137090\n", + " 0.002\n", + "
\n", + "
\n", + " 31\n", + " [3, 4, 0, 2, 1]\n", + " -3.885974\n", + " 0.001\n", + "
\n", + "
\n", + " 32\n", + " [3, 2, 5, 4, 1]\n", + " -0.035426\n", + " 0.001\n", + "
\n", + "
\n", + " 33\n", + " [3, 5, 0, 2, 1]\n", + " 7.112032\n", + " 0.001\n", + "
\n", + "
\n", + " 34\n", + " [3, 2, 0, 4, 1]\n", + " -3.206907\n", + " 0.001\n", + "
\n", + "
\n", + " 35\n", + " [3, 5, 2, 4, 0, 1]\n", + " 0.351331\n", + " 0.001\n", + "
\n", + "
\n", + " 36\n", + " [3, 0, 4, 5, 1]\n", + " -0.695107\n", + " 0.001\n", + "
\n", + "
\n", + " 37\n", + " [3, 5, 4, 0, 2, 1]\n", + " 14.386599\n", + " 0.001\n", + "
\n", + "
\n", + " 38\n", + " [3, 4, 2, 0, 5, 1]\n", + " -0.072976\n", + " 0.001\n", "
\n", "
\n", "\n", "" ], "text/plain": [ - " path effect probability\n", - "0 [3, 0, 1] 8.893562 0.98\n", - "1 [3, 2, 1] 12.030408 0.96\n", - "2 [3, 2, 0, 1] 2.239175 0.03\n", - "3 [3, 1] -0.639462 0.02\n", - "4 [3, 2, 4, 0, 1] -3.194541 0.02\n", - "5 [3, 4, 0, 1] 9.820705 0.02\n", - "6 [3, 0, 2, 1] 3.061033 0.01\n", - "7 [3, 0, 5, 1] 1.176834 0.01\n", - "8 [3, 0, 5, 2, 1] -2.719517 0.01" + " path effect probability\n", + "0 [3, 2, 1] 11.914854 0.660\n", + "1 [3, 0, 1] 8.756234 0.443\n", + "2 [3, 1] 2.105700 0.202\n", + "3 [3, 2, 0, 1] 1.635862 0.094\n", + "4 [3, 5, 0, 1] 8.670284 0.060\n", + "5 [3, 4, 0, 1] 6.979752 0.054\n", + "6 [3, 2, 4, 1] -1.146483 0.038\n", + "7 [3, 0, 4, 1] 4.459602 0.028\n", + "8 [3, 0, 5, 1] 2.864025 0.026\n", + "9 [3, 2, 4, 0, 1] -4.602396 0.024\n", + "10 [3, 0, 2, 1] -1.512156 0.022\n", + "11 [3, 4, 1] 4.954881 0.019\n", + "12 [3, 2, 5, 0, 1] 0.374461 0.009\n", + "13 [3, 2, 0, 5, 1] 0.583856 0.008\n", + "14 [3, 5, 4, 0, 1] 6.941594 0.007\n", + "15 [3, 4, 5, 0, 1] 2.145360 0.007\n", + "16 [3, 4, 2, 1] -1.080988 0.007\n", + "17 [3, 5, 1] 3.272935 0.006\n", + "18 [3, 4, 0, 5, 1] 2.697207 0.005\n", + "19 [3, 4, 2, 0, 1] -0.219167 0.005\n", + "20 [3, 0, 5, 2, 1] 5.181321 0.004\n", + "21 [3, 5, 0, 4, 1] 5.442240 0.004\n", + "22 [3, 5, 2, 1] 1.537410 0.003\n", + "23 [3, 4, 5, 1] 4.166390 0.003\n", + "24 [3, 0, 5, 4, 1] -0.522766 0.003\n", + "25 [3, 2, 4, 5, 0, 1] -1.083415 0.003\n", + "26 [3, 5, 4, 1] -7.351469 0.002\n", + "27 [3, 2, 4, 5, 1] 0.203801 0.002\n", + "28 [3, 2, 4, 0, 5, 1] -1.303056 0.002\n", + "29 [3, 5, 2, 0, 1] -0.006054 0.002\n", + "30 [3, 5, 4, 2, 1] -15.137090 0.002\n", + "31 [3, 4, 0, 2, 1] -3.885974 0.001\n", + "32 [3, 2, 5, 4, 1] -0.035426 0.001\n", + "33 [3, 5, 0, 2, 1] 7.112032 0.001\n", + "34 [3, 2, 0, 4, 1] -3.206907 0.001\n", + "35 [3, 5, 2, 4, 0, 1] 0.351331 0.001\n", + "36 [3, 0, 4, 5, 1] -0.695107 0.001\n", + "37 [3, 5, 4, 0, 2, 1] 14.386599 0.001\n", + "38 [3, 4, 2, 0, 5, 1] -0.072976 0.001" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from_index = 3 # index of x3\n", - "to_index = 1 # index of x0\n", + "to_index = 1 # index of x1\n", "\n", "pd.DataFrame(result.get_paths(from_index, to_index))" ] @@ -1215,7 +1588,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "lingam_env (3.11.9)", "language": "python", "name": "python3" }, @@ -1229,7 +1602,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.11.9" }, "toc": { "base_numbering": 1, diff --git a/examples/BootstrapWithImputation.ipynb b/examples/BootstrapWithImputation.ipynb index 9d75069..0769c88 100644 --- a/examples/BootstrapWithImputation.ipynb +++ b/examples/BootstrapWithImputation.ipynb @@ -32,7 +32,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "['1.24.4', '1.9.0']\n" + "['1.26.4', '1.12.1']\n" ] } ], @@ -43,6 +43,9 @@ "from lingam.utils import make_dot\n", "from lingam.tools import bootstrap_with_imputation\n", "\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", "import matplotlib.pyplot as plt\n", "\n", "print([np.__version__, lingam.__version__])\n", @@ -75,104 +78,103 @@ "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", "\n", - "%3\n", - "\n", + "\n", "\n", "\n", "x0\n", - "\n", - "x0\n", + "\n", + "x0\n", "\n", "\n", "\n", "x1\n", - "\n", - "x1\n", + "\n", + "x1\n", "\n", "\n", "\n", "x0->x1\n", - "\n", - "\n", - "0.56\n", + "\n", + "\n", + "0.56\n", "\n", "\n", "\n", "x4\n", "\n", - "x4\n", + "x4\n", "\n", "\n", "\n", "x0->x4\n", - "\n", - "\n", - "0.99\n", + "\n", + "\n", + "0.99\n", "\n", "\n", "\n", "x5\n", - "\n", - "x5\n", + "\n", + "x5\n", "\n", "\n", "\n", "x0->x5\n", - "\n", - "\n", - "0.90\n", + "\n", + "\n", + "0.90\n", "\n", "\n", "\n", "x2\n", - "\n", - "x2\n", + "\n", + "x2\n", "\n", "\n", "\n", "x2->x1\n", - "\n", - "\n", - "0.38\n", + "\n", + "\n", + "0.38\n", "\n", "\n", "\n", "x2->x4\n", - "\n", - "\n", - "-0.12\n", + "\n", + "\n", + "-0.12\n", "\n", "\n", "\n", "x3\n", "\n", - "x3\n", + "x3\n", "\n", "\n", "\n", "x3->x0\n", - "\n", - "\n", - "0.90\n", + "\n", + "\n", + "0.90\n", "\n", "\n", "\n", "x3->x2\n", - "\n", - "\n", - "0.90\n", + "\n", + "\n", + "0.90\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -583,14 +585,12 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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tusrr7wyDBw4MDz99NO9Xmaj11c9t6+NYaxcecbKtVHPY2VxW3nitrFityLJ5Di4jwcaTzzxROu0O+64I/Tp0ye8/vrrXX4uHmSec845lVilujVx4sRw1llntf4eD+biAPDiiy/udP5jjz02HHnkke2mTZo0KZx++ukVX9dGrvcYrPHANu/EbnWI29qo17itdsyvXLkyTd7dfPPNrdMWL16cLufRRx/t9DNvvPFG+pnf/OY3GyQl//rXv4ailS3+/vvf/77Lvx2TMTHR0taXv/zlNKFepO0WnXnmmeHzn/98xbZbufeH69evDzvssEO49NJL25U9Jl9/97vfbVJfVyk9rYM47+TJk9tNi19cfPazn22X7IvJ8nrU0/qKifZf/OIX7aYdc8wx4YQTTuj1Mhu9vuq5fWUxVq4OY+XaqNexsritDnHbWLFbkdtcPProo+klg/vtt1/rtHiJYd++fZPHH3+828/ecMMNybbbbpt86lOfSr773e8ma9asqcQq1oWPPvooeeqpp9K6LYl1HH+P26AzcXrb+aPDDz+8y/kpT71H8fLZXXbZJb0c9eijj04WLVqUu+oVu5UnbmujnuO22jEf6zFeBt22LuPlzTvvvHOXdfmb3/wmGTRoUPJP//RPG7y39957p7cj+Pu///vk4YcfTopStni7iDhemThxYnLttdemt1aoVl9bre0WrVq1Ktl6660rst0qsT985ZVX0ltutJ1nyJAh6eV+pXk2pa8rt97UwYEHHph+pnT54ssvv5ze6uOII45oN1+8tceOO+6Y7LbbbuktPV577bWk6HpTXx9++OEGl27G24M89NBDvV5mI9dXPbevjWGsXHnGyrVRz2NlcVt54rbxYrcpqYA4iN9+++3b/6GmpvRgpLt76h1//PFpYeLA5Nlnn02+853vJEuWLEluvfXWSqxm4b355pvJunXrkmHDhrWbHn9/4YUXOv1MrP/O5i/nPSrrXW/qPd7XMCYb9tprr/TA/LLLLksPBmPAjhw5MskLsVt54rY26jluqx3zcXr//v3TZNzG9iXXXHNN2sfHhERJTET+8pe/TBN6MXnx61//On12QkzmxXsN57ls8X6ikydPThPkd999d3LmmWemA7Kzzz67dTmdtbXVq1cn77//frt6yFvZ2nrkkUeSG2+8MZkzZ05Ftlsl9oel/7Pm6c04tRJ6UwcxluLn/u7v/i79EmPt2rXpM0a+973vtc4Tk+fxfnhxP9bS0pJcdNFFyec+97nkueeeS7bccsukqHpTX/HLhp/85CfJQQcdlN4HeO7cuemxRVxOb5fZyPVVz+1rYxgrV56xcm3U81hZ3FaeuG282O1RMnn69OnJJZdc0u08ixcvTnrrtNNOa/05PlAlHrBMmTIlWbp0aTqYgaI64IAD0ldJDNT4YKOrr746+eEPf1jxvy92oXhxm+eY74n4jXj8W7/97W83GMTEV9v6jf39T3/60w3mzVvZLrjggtafJ0yYkLz33nvJpZde2ppM7q08lK0kJoXiWQozZsxIDjvssE3ebpRPfAjij370o+TKK69Mk3ovvfRScs4556T7pVLb/MIXvtA6fzxQiPPFEzZuuumm9GGDjSQ+RPLUU09Nz8SPD5iJxxSnnHJKehBF7+qrHtuXsTIUb6wsbqF2sdujZPJ5552XnHzyyd3OEy912mGHHVqf1l4Sz5qIT9CM722sODCJ4iBZMnlD8fLazTbbbIOnzMffu6rnOL0n81Oeeu+oX79+aQIitu1qELv5IW6LU++1jtu8xnycHi+nWrlyZbuzXLuqy3jmarwlwr777pu53vGWER0vpc5z2dqOV+LAK56pO2DAgC772ubm5m7PSs5L2Z5//vn0y/z4Jf/555+flGO7VWt/WPo/TosnJbSdJ7bD0jzlGKeWQ2/qICaMTzzxxORf/uVfWk/AiF9oxO31/e9/P720saO4zXffffdC7L/KXV/bbbddcttttyUffPBB8tZbb6VXQMYERIyl3i6zkeurM/XQvoyV88NYuTj13pFj3MYlbhsvdnt0z+Q4uIjfUnf3ipdQxgx3PFiJ9+0omTdvXrJ+/frWBPHGeOaZZ9L/2x4M8L9iXceD83j5WUms4/h7228Z2orT284f3XPPPV3OT3nqvaN4GcLChQur1rbFbn6I2+LUe63jNq8xH+sxDjja1mW8JVW8X2bHuoy3fujJmWqx38+q37yUreN6b7XVVmkieVP62jyULV7e9vnPfz456aSTkn/7t3/rdn3blr83cVGJ/eGuu+6aDpzbzhNvLxJvw1Gap1zj1HLoTR3E54l0TBjHg4io7b27O8ZiPIO8CPuvSu3L432AR4wYkX5xcMstt6Rn3m/qMhuxvuq1fRkr54excnHqvSPHuI1L3DZg7IYKmTp1apgwYUJ4/PHHw0MPPRQ+8YlPhGnTprW+v2zZsjB27Nj0/eill14KM2fODE8++WR45ZVXwh/+8Iew2267hYMOOqhSq1gXZs+enT6h/Prrr0+fUnraaaeFoUOHhuXLl6fvn3jiiWH69Omt8z/88MOhqakpXHbZZelT3OPTmOPT3RcuXFjDUtR/vV900UXhrrvuCkuXLg1PPfVUOO6448LAgQPDokWLQt6I3coTt7VRz3FbzZiPzjjjjLDzzjuHefPmpf32AQcckL46+vWvf53W2V//+tcN3vvpT38abrvttvDiiy+mfdA555wT+vbtG+69995cl+2Pf/xj+NWvfpWuc1z3K6+8MgwaNChceOGFrfO8/PLL6bRvfetbaV97xRVXhM022yzceeeduS5bLNN2220X/vmf/zm0tLS0vt54442KbbdK7A9nzZqVLiOOJZ999tlw9NFHh1133TW8//77G11/1dTTOohl3nLLLcPvfve7tK3dfffdYfTo0eHYY49tnee8884L999/fzqmjnV26KGHhm233bbdtiyqntbXY489Fm655ZZ0X/7AAw+EyZMnp+2h7X4pa5lFVon6quf2tTGMlSvPWLk26nmsLG4rT9w2VuxWLJn81ltvpYPyLbbYIjQ3N4dTTjklvPPOO63vx8FHzGXfd9996e+vvfZamjjeeuut00oYM2ZMehC2atWqSq1i3bj88svTg8P+/fuHiRMnpoPAkoMPPjicdNJJ7ea/6aabwu67757Ov+eee4Y5c+bUYK0bq97PPffc1nmHDRsWjjjiiPD000+HPBK71SFua6Ne47aaMR/FpNyZZ54ZttpqqzRp+sUvfjFNOnYUE5XHH398p3/3kksuSRNgceAS+/5DDjkkTXLmvWx33HFH2HvvvdNlDh48OIwfPz788pe/DOvWrWv3t+My43yx/cQvx6+77rrcly0mKeNnOr522WWXim63cu8P169fHy644II0buOYcsqUKWHJkiU9qr9q60kdfPzxx+EHP/hB63bYaaed0u3aNtn35S9/OQwfPjxd3ogRI9Lf44kb9aIn9RWTnuPGjUvbwjbbbJMeUL3++us9WmbRlbu+6r19ZTFWrg5j5dqo17GyuK0Ocds4sdsn/tObU6kBAAAAAGgcPbpnMgAAAAAAjUkyGQAAAACATJLJAAAAAABkkkwGAAAA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X0/qtVyRsuVfPW+jPFPv6r4RaffqEnFnX9I4+8d6KVO9lKNo1Lt6137qLxaUpVjq5p7JAAAAAABUTt2cmQwAAAAAQOVIJgMAAAAAkEkyGQAAAACATJLJAAAAAABkkkwGAAAAAKC4yeQrrrgiGTVqVDJw4MBk0qRJyfz587uc9/rrr0/69OnT7hU/11YIIbnwwguT4cOHJ5tvvnly6KGHJi+++GJSD2U7+eSTN5hn6tSpSd7LFq1cuTI566yz0u0yYMCAZPfdd09uv/32TVpmEcr1gx/8YINttsceeyR58PbbbycnnHBC0tzcnAwdOjT56le/mrz77rvdfuaQQw7ZoDxnnHFG1da5iHrapm6++ea0jcT5P/3pT28QJ9Rm/0v56vvWW29N9ttvv3S/M3jw4GTvvfdOfvvb3+a2v6um3vaDs2fPTuvoH//xH3M7JiJ/ffq///u/p/16/ExsP3FM01Fsjx1jcdasWUmRy9Sb5ZZLb/72Bx98kI41t9lmm2SLLbZIvvSlLyUrVqxoN0/HbRRfcb9QlLFNXvdVxsrVYaxcG0UYK9diX1OpPqKcZfn444+T73znO+n0OJbecccdk6985SvJf//3f1elDy/3dtmYcX8RtktX/XF8XXrppUkexla9EnJo9uzZoX///uHaa68NixYtCqeeemoYOnRoWLFiRafzX3fddaG5uTm0tLS0vpYvX95unlmzZoUhQ4aE2267LfzpT38KRx11VNh1113D+++/X6VSVa5sJ510Upg6dWq7ed5+++1QbT0t24cffhj222+/cMQRR4SHHnoovPLKK+H+++8PzzzzTK+XWZRyzZgxI+y5557tttlf/vKXkAexLY0fPz489thj4cEHHwxjxowJ06ZN6/YzBx98cFovbcuzatWqqq1z0fS0TT388MNhs802Cz/+8Y/D888/H84///zQr1+/sHDhwqqve5FVYv9L+er7vvvuC7feemvaxl966aXws5/9LG33d955Z+76u2rqbT8Y+54RI0aEz33uc+Hoo4/O5ZiIfPbpP/3pT8PFF1+cvuKhwl//+tcN5tlll13CzJkz28Xiu+++G4pcpt4st1x687fPOOOMsNNOO4W5c+eGJ598MnzmM58JBx54YLt5YlljX9Z2O1UqzisxtsnrvspYufKMlWujCGPlWu1rKtFHlLssK1euDIceemi48cYbwwsvvBAeffTRMHHixLDvvvtWvA+vxHbZmHF/EbZL1LYM8RWX3adPn7B06dKQh7FVb+QymRwb/FlnndX6+7p168KOO+6YDgC72onF4O/K+vXrww477BAuvfTS1mkx0AYMGBB+97vfhSKXrRRkHQ8Ua6GnZbvqqqvCbrvtFj766KOyLbMo5YrJ5LjTy5u484sHHk888UTrtDvuuCPd0b3++uvdJpPPOeecKq1l8fW0TR177LHhyCOPbDdt0qRJ4fTTT6/4utaTSux/KV99d2bChAnpgCxv/V3e63Ht2rVpUunXv/71BnWWpzER+ezT237B010yOSZo66VMm7rcTdGbvx1jNh6o3nzzza3TFi9enC4nJg9K4u+///3vQxHHNnndVxkrV4excm0UYaxci31NpfqIarTz+fPnp+v+5z//uaJ9eCXKkjXuL/J2Ofroo8PkyZNzMbbqrdzd5uKjjz5KnnrqqfTSgpK+ffumvz/66KNdfi6eyr7LLrskO+20U3L00UcnixYtan3vlVdeSZYvX95umUOGDElPV+9umUUoW8n999+fbL/99snYsWOTr33ta8lbb72VVFNvyvbHP/4xOeCAA9JL9IYNG5Z86lOfSn70ox8l69at6/Uyi1CuknjpTLz0ZLfddksvzXjttdeSWotlipeHxEvNS2JZY5kff/zxbj97ww03JNtuu21a3u9+97vJmjVrqrDGxdObNhWnt50/Ovzww6u6/yq6Su5/KV99l8QcyNy5c5MlS5YkBx10UK76uyLU48yZM9M6ipf6dZSXMRH57tM3Rrz0Mt5iYcKECellmmvXrk2KWqZK11W5/3bcL8TLmdvGcby8duedd94gjuN4NI7PJk6cmFx77bXp/rUIY5u87quMlSvPWLk2ijBWrtW+phJ9RLXa+apVq9LbJcT1r1QfXsmydDfuL+p2WbFiRTJnzpxOx+m1GFv1VlOSM2+++WaadItJuLbi7y+88EKnn4kNKw6O9tprrzRYLrvssuTAAw9Md2QjR45Mdw6lZXRcZum9opYtiveNOeaYY5Jdd901Wbp0afK9730v+cIXvpA23s022yy3ZXv55ZeTefPmpYnUeE+Zl156KTnzzDPTwfGMGTN6tcwilCuKnVO8x1Tcvi0tLclFF12UfO5zn0uee+65ZMstt0xqJcZD3Fm31dTUlGy99dbdxsrxxx+fDiJicvzZZ59N79UUk0DxHqhsepuKdV/r/VfRVWr/S/nqO4r1PGLEiOTDDz9M+68rr7wy+fu///vW9/PQ3+W9Hh966KHkmmuuSZ555plO38/LmIj89ukb4+yzz0722WefdFmPPPJI+iVyHM/85Cc/SYpYpkrWVSX+dpzev3//DZIDHeM4frE0efLkZNCgQcndd9+djkdj4iduv7yPbfK6rzJWrjxj5doowli5VvuaSvQR1Wjn8d768bh82rRp6T2FK9WHV6osWeP+om6X//iP/0hzPrFseRhb1U0yuTfiWaDxVRJ3YOPGjUuuvvrq5Ic//GFS72U77rjjWt+PN/uOO/PRo0en3+JMmTIlyav169enwR8fihJ3Bvvuu2/y+uuvp9/AlJKuRbQx5Yo7wZK4vWJyOSZjb7rppk6/odpU06dPTy655JJu51m8eHGvl3/aaae1a4Px4QWx7cWdfmyLUET13LfkVRxYxSRoTHbEM5O/8Y1vpFdvxAdnFbm/q5Z33nknOfHEE5Nf/epX6ZmI1KdK9+kbI8ZmSYzDmNg8/fTTk4svvjh98HARy1RueSjTBRdc0PpzPMvpvffeS8ej5U4m1wNjZeg5Y+X8iieyHXvssenVKFdddVVF+/BKqddx/7XXXpueeNjxYZVF2S65TSbHg5+YgOv4NOL4+w477LBRy+jXr186YIpnhEalz8VlxCRX22XGp8UXuWydiQfe8W/FeaoVZL0pW9wWsTxtzyaLiZr4DU68vKAc9ZXHcsWdQkfxzJLdd9+92+26Kc4777z0aajdie0mlumNN95oNz1eWhGfktqTOo/J8SiWRzJ509tUnF7LOKgH1dr/smn1HS8jGzNmTPpz7J9joiUOoErJ5Dz0d3mux/gF3quvvpr8wz/8Q7svOEtnasQrRvIyJqI4ffrG9vtx2bH9xTPVilamSiy3kmWK0+OYcuXKle3OTs7ax8btFL8MjVd/lPPAtBJjm2rvq4yV88NYuTj1Xu2xcq32NZXoIyrZzkuJ5D//+c/pFdNtz0quRB9erZjtOO4v2naJHnzwwXQ8fuONNyZZNnW7VFru7pkcE23xTM54RlLbA6H4e9szxLoTT0tfuHBh684gnhYfN2TbZa5evTq9j8rGLjOvZevMsmXL0nvJdDdPHsr22c9+Nt0RlA50o//3//5fut5xeeWorzyWqzPxLLyYBKjUNttuu+3Se+l194rrFssUD0zifYJKYgcUy1JKEG+M0uXV1WyDRdGbNhWnt50/uueee6q6/yq6au1/KV99lz4Tkx556u/yXI9xXx7baNwHl15HHXVU8vnPfz79Od7PMC9jIorTp2+M2L7il0EdLzctSpkqsdxKlinuF2LSpm0cx4PT+PyN7uI4bqetttqq7Gc4VWJsU+19lbFyfhgrF6feqz1WrtW+phJ9RKXaeSmRHJ/PdO+996b33610H16tmO047i/SdimJt6KLyx8/fnxS6e1ScSGHZs+enT498/rrr0+f0HjaaaeFoUOHhuXLl6fvn3jiiWH69Omt81900UXhrrvuCkuXLg1PPfVUOO6448LAgQPDokWLWueZNWtWuow//OEP4dlnn02fnrjrrruG999/v9Ble+edd8I3v/nN9MnNr7zySrj33nvDPvvsEz7xiU+EDz74INdle+2118KWW24Z/vVf/zUsWbIk/Nd//VfYfvvtw//5P/9no5dZ1HKdd9554f7770+32cMPPxwOPfTQsO2224Y33ngj1NrUqVPDhAkTwuOPPx4eeuihtC1Nmzat9f1ly5aFsWPHpu9HL730Upg5c2Z48skn0/LEGNttt93CQQcdVMNS5FtP21RsI01NTeGyyy5Ln9Y+Y8aM9CnuCxcurGEpiqcSfQvlq+8f/ehH4e67707rO84f23ts97/61a9y19/luR476uxJ2HkZE5G/Pj1qaWkJCxYsSGMvHio88MAD6e9vvfVW+v4jjzySPm38mWeeSeP1P//zP8N2220XvvKVrxS2TBuz3LyV6Ywzzgg777xzmDdvXjoGO+CAA9JXyR//+Me0vHGs8OKLL4Yrr7wyDBo0KFx44YWFGdvkdV9lrFx5xsq1UYSxcq32NZXoI8pdlo8++igcddRRYeTIkWkfHfu+0uvDDz+saB9e7rJs7Li/CNulZNWqVWk/fNVVV4WOaj226o1cJpOjyy+/PB0g9e/fP0ycODE89thjre8dfPDB6cFRybnnnts677Bhw8IRRxwRnn766XbLW79+fbjgggvS92PDmDJlSproK3rZ1qxZEw477LC0ocUGu8suu4RTTz21qsnW3patFDSTJk1Kt0lMQP7bv/1bWLt27UYvs6jl+vKXvxyGDx+eLm/EiBHp7zEpmwfxwCrugLfYYovQ3NwcTjnllHRn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1qwRt/Sq/RjrVFfe+9yN6W+LpJ7bubLVRjxDKm9xGxkr51c9x2qe5b2/jcRtfonb+jrGLUsyeWOsXr06GTJkSLJq1aqkubl0ISjqvT7VS3uvl3IUjXpX99pPMYld9d4I6rmdKxvaTDHUc6zmWb3Ue72Uo2jUe33VffFPjwAAAAAAoOIkkwEAAAAAyE8yecCAAcmMGTPS/6ke9V4b9VLv9VKOolHv6l77KSaxq94bQT23c2VDmymGeo7VPKuXeq+XchSNeq+vuq/aPZMBAAAAACgut7kAAAAAACCTZDIAAAAAAJkkkwEAAAAAyCSZDAAAAABA7ZLJb7/9dnLCCSckzc3NydChQ5OvfvWrybvvvtvtZw455JCkT58+7V5nnHFGpVaxblxxxRXJqFGjkoEDByaTJk1K5s+f3+38N998c7LHHnuk83/6059Obr/99qqta6PW+/XXX79B246fyyOxWx3itjbE7f/S51a2/UT62/Kp19gtYv1+/PHHycyZM5PRo0en848fPz658847N2mZRSrbxRdfnOy///7JlltumWy//fbJP/7jPyZLlixJ6mW7lcyaNSuNnXPPPbdCa19cxsrVoc+tjXrtb8VtdYjbBordUCFTp04N48ePD4899lh48MEHw5gxY8K0adO6/czBBx8cTj311NDS0tL6WrVqVaVWsS7Mnj079O/fP1x77bVh0aJFaf0NHTo0rFixotP5H3744bDZZpuFH//4x+H5558P559/fujXr19YuHBh1de9ker9uuuuC83Nze3a9vLly0Meid3KE7e1IW7b0+dWtv3ob8unnmO3iPX77W9/O+y4445hzpw5YenSpeHKK68MAwcODE8//XSvl1mksh1++OFpG3vuuefCM888E4444oiw8847h3fffbfwZSuZP39+GDVqVNhrr73COeecU4XSFIuxcuXpc2ujnvtbcVt54raxYrciyeSYpIx56ieeeKJ12h133BH69OkTXn/99W4PbA1YembixInhrLPOav193bp16UDx4osv7nT+Y489Nhx55JHtpk2aNCmcfvrpPfzLja2n9R6DdciQISHvxG51iNvaELft6XMr2370t+VTr7Fb1PodPnx4+MUvftFu2jHHHBNOOOGEXi+zSGXr6I033kiPe/7v//2/oR7K9s4774RPfOIT4Z577tFPdMJYuTr0ubVRr/2tuK0OcdtYsVuR21w8+uij6a0t9ttvv9Zphx56aNK3b9/k8ccf7/azN9xwQ7Ltttsmn/rUp5Lvfve7yZo1ayqxinXho48+Sp566qm0bktiHcff4zboTJzedv7o8MMP73J+ylPvUbzNyy677JLstNNOydFHH50sWrQod9UrditP3NaGuO2cPrdy7Ud/Wx71HLtFrd8PP/xwg0shN9988+Shhx7q9TKLUrbOrFq1Kv1/6623TuqhbGeddVZy5JFHbnC8wP8wVq48fW5t1HN/K24rT9w2Xuw2JRWwfPny9B5i7f5QU1M6yIrvdeX4449PC7Pjjjsmzz77bPKd73wnvQfZrbfeWonVLLw333wzWbduXTJs2LB20+PvL7zwQqefifXf2fzdbRc2vd7Hjh2bXHvttclee+2VHnRcdtllyYEHHpgG7MiRI3NTxWK38sRtbYjbDelzK9t+9LflUc+xW9T6jSch/OQnP0kOOuig9P67c+fOTcfqcTm9XWZRytbR+vXr03sKf/azn01PhCl62WbPnp08/fTTyRNPPFHxMhSVsXLl6XNro577W3FbeeK28WK3R8nk6dOnJ5dcckm38yxevDjprdNOO6315/hguOHDhydTpkxJli5dmg56oKgOOOCA9FUSA3XcuHHJ1Vdfnfzwhz+s+N8Xu9Bz4haKqdaxW+9+/vOfJ6eeemr6MOf4wJY4Rj/llFPSg5JGK1s8i/e5557r9szlopTt//v//r/knHPOSe65557cPkCrkoyVoXj9rbiF2sVuj5LJ5513XnLyySd3O89uu+2W7LDDDskbb7zRbvratWvTJ2jG9zZWfAJh9NJLL0kmdyLeDmSzzTZLVqxY0W56/L2reo7TezI/5an3jvr165dMmDAhbdvVIHbzQ9wWp947EreNS9wWq+5rHbv1Xr/bbbddcttttyUffPBB8tZbb6VXFMYD+ngM0NtlFqVsbf3rv/5r8l//9V/JAw88UPUz8CpRtniJbDx+22effVo/E890iuX7xS9+kd4mI/7NemWsnB/63OLUe0fGyo1L3DZe7PbonslxEBK/ze7u1b9//zTDvXLlynRQUjJv3rz0UrBSgnhjPPPMM+n/8QxlNhTret99900vUyuJdRx/b/stQ1txetv5o3gGQlfzU5567ygOzhcuXFi1ti1280PcFqfeOxK3jUvcFqvuax27jVK/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/h63QWfi9LbzR4cffniX81Oeeo/ibV522WWXZKeddkqOPvroZNGiRbmrXrFbeeK2NsRt5/S5lWs/+tvyqNfY1d9Wh9itjXqN20jsVp64rQ1x2zlj5cq1H2PlYsduU1IBy5cvT7bffvv2f6ipKdl6663T97py/PHHp4XZcccdk2effTb5zne+kyxZsiS59dZbK7Gahffmm28m69atS4YNG9Zuevz9hRde6PQzsf47m7+77cKm1/vYsWOTa6+9Ntlrr72SVatWJZdddlly4IEHpgE7cuTI3FSx2K08cVsb4nZD+tzKth/9bXnUa+zqb6tD7NZGvcZtJHYrT9zWhrjdkLFyZduPsXKxY7dHyeTp06cnl1xySbfzLF68OOmt0047rfXn+GC44cOHJ1OmTEmWLl2ajB49utfLhVo74IAD0ldJDNRx48YlV199dfLDH/6w4n9f7ELPiVsoplrGrv4WekefC8UjbqFxY7dHyeTzzjsvOfnkk7udZ7fddkt22GGH5I033mg3fe3atemTb+N7Gys+gTB66aWXJJM7EW8HstlmmyUrVqxoNz3+3lU9x+k9mZ/y1HtH/fr1SyZMmJC27WoQu/khbotT7x2J28YlbotV97WMXf1tvojd4tR7R/rcxiVui1PvHYnbxiVuGy92e3TP5O222y7ZY489un31798/zXCvXLkyvW9Hybx585L169e3Jog3xjPPPJP+H89QZkOxrvfdd99k7ty5rdNiHcff237L0Fac3nb+6J577ulyfspT7x3FyxAWLlxYtbYtdvND3Ban3jsSt41L3Bar7msZu/rbfBG7xan3jvS5jUvcFqfeOxK3jUvcNmDshgqZOnVqmDBhQnj88cfDQw89FD7xiU+EadOmtb6/bNmyMHbs2PT96KWXXgozZ84MTz75ZHjllVfCH/7wh7DbbruFgw46qFKrWBdmz54dBgwYEK6//vr06cKnnXZaGDp0aFi+fHn6/oknnhimT5/eOv/DDz8cmpqawmWXXRYWL14cZsyYEfr16xcWLlxYw1LUf71fdNFF4a677gpLly4NTz31VDjuuOPCwIEDw6JFi0LeiN3KE7e1IW71udVsP/rb8qnX2NXfVofYrY16jdtI7FaeuK0NcWusXM32Y6xc7NitWDL5rbfeSpPHW2yxRWhubg6nnHJKeOedd1rfjwnjmMu+77770t9f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0NLS0vr6y1/+UvGy3H777eH73/9+uPXWW0PczL///e+7nf/ll18OgwYNCt/4xjfC888/Hy6//PKw2WabhTvvvDMX26YS5anVtqlnU6dODePHjw+PPfZYePDBB8OYMWPCtGnTuv3MGWecEXbaaacwd+7c8OSTT4bPfOYz4cADD2x9f82aNe22UXwdfvjh4eCDD26d57777kvbxZIlS9rNt27dulyXLYrrfd1117Vb7/fff79HbTmPZbvmmmvC2WefHe6///50//jb3/42bL755un6V2q79XQf9fDDD6d1+eMf/zit2/PPPz/069cvLFy4sHWeWbNmhSFDhoTbbrst/OlPfwpHHXVU2HXXXdtto97UH5XVm23y05/+NFx88cXpK7bLv/71rxvMs8suu4SZM2e2a6/vvvtuqGeVqst6j5ta7Y/qVSXq86STTkrbYdt4fvvtt0O962ldzp8/P3zzm98Mv/vd78IOO+yQxvemLrPoerP/iuPWWC9t29uqVauqts5FU4mYp/z1Ho9hmpub27Xr5cuXV7Sq63m8X+6yrVy5Mhx66KHhxhtvDC+88EJ49NFHw8SJE8O+++5bk/FtrfryIm67qGMOJC67T58+6bF1Ho5NNimZHBviWWed1fp7TADE5Go8eOjM8OHDwy9+8Yt204455phwwgkn9HqZ5VSJ8sSEZWy4tbQxydeYGI+J1ba+/OUvp0m7PGybSpQnD9umnsSdYNw2TzzxROu0O+64I93hvf76651+JnZwcad58803t05bvHhxupzY2XXmjTfeSD/zm9/8ZoOkZGcJi7yXLas9b0xbLsJ2i84888zw+c9/vmLbraf7qGOPPTYceeSR7aZNmjQpnH766enP69evTw+cL7300nZlHzBgQHpQ3dv6o7I2dZt01y7jgK2zREq9qlRdNkLc1GJ/VM/KXZ+lA9Cjjz46NJpNGc93tQ/MyzFCNfR2/xWTyeecc06V1rL4KhHzlL/eYzI5JmGrqZ7H+9Vo9/ELwliWP//5z1Uf39aiL6+nbXf00UeHyZMn5+bYpNe3ufjoo4+Sp556Kr0EoKRv377p748++minn/nwww83uOwhXkbw0EMP9XqZ5VKJ8pTESyTiJQW77bZbenr9a6+9luRNLGPbskeHH354a9lruW0qUZ4ibZuiiHUbLxvZb7/9WqfFbRDbyeOPP97pZ2KbipfftN1W8VKPnXfeuct29Zvf/CYZNGhQ8k//9E8bvLf33nunlyf9/d//ffLwww8nRSlbvF3Etttum0ycODG59tpr00utetqW81q2tlatWpVsvfXWFdluvdlHZdXtK6+8kt5yo+08Q4YMSS9bKs3Tm/qjsiq9TeKlY/H2LhMmTEgvM1u7dm1SrypVl/UeN7XaH9WrStRn29stbb/99snYsWOTr33ta8lbb72V1LNKjOeLdoywqTZl/3XDDTek471PfepTyXe/+91kzZo1VVjj4qlkzFPeeo/i7QJ22WWX9NZ2Rx99dHprnEqp5/F+tdp9PB6Lt0KI5anm+LZWfXm9bLsVK1Ykc+bMSW/RkZdjk6befvDNN99M1q1blwwbNqzd9Pj7Cy+80OlnYuX85Cc/SQ466KD0PsNz585Nbr311nQ5vV1muVSiPFHcCcV7CcWG3dLSklx00UXJ5z73ueS5555LttxyyyQv4g60s7KvXr06ef/995O//vWvNds2lShPTPoXZdsURazzuBNvq6mpKU0ednUP3Di9f//+G3RmcVt19ZlrrrkmOf7449NtWBITkb/85S/TTiJ+yfPrX/86vTdd7CDivYbzXLZ43/XJkyenCfK77747OfPMM9NB2dlnn73RbTmvZWvrkUceSW688ca0E6zEduvNPryrui2VofR/1jw9rT8qq5LbJMZlbJtxWbFNx2RA7D/iWKAeVaou6z1uarU/qleVqM8o3lPxmGOOSXbddddk6dKlyfe+973kC1/4Qnogt9lmmyX1qBLHWrU8fquF3u6/4tg1JtziSSzPPvtseh/TJUuWpMeOVCfmKX+9x+PoeCLMXnvtlSYpL7vssuTAAw9ME8ojR44se5XX83i/Gu0+PvMm7nvic23i/YOrOb6tVV9eL9vuP/7jP9IcVSxrXo5Nep1M7o348KVTTz01PYMtfhsSE7CnnHJKugMqoo0pT2zIJXEnGxOYcSBx0003dfqtAtVj22yc6dOnJ5dcckm38yxevDiphtgpxL/129/+doOBTHyVxEFM7Ex++tOfbjBv3sp2wQUXtP4cv01877330m8US8nk3spD2UriFzTxTIUZM2Ykhx122CZvNxpTHtr0N77xjXZ9evxS5fTTT08uvvji9AGZRZGHuoRaO+6441p/jg++iTEdx/LxDKcpU6bUdN2ov/3iaaed1q69xS/UYzuL457Y7qCIDjjggPTVdiwfH7p99dVXJz/84Q9rum60F68qPfbYY9MrYK+66qq6Gd82Sl9+7bXXplfSd7wzQi23Xa+TyfESnZjpj6dbtxV/32GHHTr9zHbbbZfcdttt6Tci8dTz+M1s7LjjLQZ6u8xyqUR5OhPP5Nt9992Tl156KcmTWMbOyh6/sYpnPsa6qdW2qUR5irRtau28885Ln5LandjmY52/8cYb7abHSyzi01O7aiNxerwsZOXKle3Ocu2qXcUzV+MtEfbdd9/M9Y63jOh4y5k8l60kfuEUB1/xTN3YAfSmLeepbM8//3zakceDqPPPPz8px3Yr1z68q7otzV/6P06LB31t54ntsDRPT+uP3qlkm+6tGK9x2a+++mq7L0byrtZ1We9xU6v9Ub2qRH121ebj34rjwHo6AG2rEsdatTx+K/J+MfYfUWxvksm1iXk2vd476tevX3pyTKWOp+t5vF/Jdl9KJP/5z39O5s2b1+6s5GqNb2vVlxd920UPPvhgeiVLvMo3T8cmvb5ncsx4x4ROvLVDyfr169Pf23471ZmYTR8xYkRayFtuuSU9Y21Tl7mpKlGezsTL1+M30G13VHkQy9i27NE999zTWvZabptKlKdI26bW4pcm8ez77l6xfcS6jcnFeL+gkthZxXZSGjB3FNtUHHS03VZxRxnvXd1xW8Xt05Mz+p955pnMbZmXsnVc76222qr1m8TetOW8lC1e4vb5z38+Oemkk5J/+7d/63Z925a/NzHYm31UVt3Gy6Vih952nnh7kXgbjtI8vak/eqeSbbq3YnuN90TrePlc3tW6Lus9bmq1P6pXlajPzixbtiw9OaSex4GVGM8X7RghL/vF2H9E9dze8h7zbHq9dxQv9V+4cGHF2nU9j/cr1e5LieT4rKh77703vbduLca3terLi7zt2t7mMy5//PjxSa6OTTbl6X2zZ89On3J5/fXXp09JPO2008LQoUPD8uXL0/dPPPHEMH369Nb5H3vssXDLLbeEpUuXhgceeCB9EuGuu+7a7infWcuspEqU57zzzgv3339/eOWVV8LDDz8cDj300LDtttuGN954o6Jleeedd8KCBQvSV9zMP/nJT9KfS0/tjOWI5Sl5+eWXw6BBg8K3vvWtsHjx4nDFFVeEzTbbLNx5550bXT9FK0+ttk09mzp1apgwYUJ4/PHHw0MPPRQ+8YlPhGnTprW+v2zZsjB27Nj0/ZIzzjgj7LzzzmHevHnhySefDAcccED66ujXv/51GDhwYLv4KolPML3tttvCiy++GBYuXJg+Lbtv377h3nvvzXXZ/vjHP4Zf/epX6TrHdb/yyivTdnvhhRf2qC3nsWyxTNttt13453/+59DS0tL6ahtf5d5uPd2Hx7hvamoKl112WVq3M2bMCP369UvXpWTWrFnpMv7whz+EZ599Nn2KbtzPv//++xtdf1Rfb9p0bJ+xX4kxGfuZ2K/H39966630/UceeSRts88880za7//nf/5n2sa/8pWv1PUmrkRdbsxyi65W+6N6Ve76jOPKb37zm+HRRx9Nx4Gx39lnn33SdvjBBx+EetbTuvzwww9bx+DDhw9P6y3+HPvujV1mo+8XX3rppTBz5sx0vBTbW4zh3XbbLRx00EE1LEXj7UMpf71fdNFF4a677krHRU899VQ47rjj0uO1RYsWVay663m8X+6yffTRR+Goo44KI0eOTMevbY/J4r692uPbWvXlRdx2JatWrUpzAVdddVXoqNbHJpuUTI4uv/zyNKHQv3//MHHixDTBWnLwwQeHk046qfX3mLgbN25cWsnbbLNNWqGvv/56j5ZZaeUuz5e//OV04BWXN2LEiPT3OKCotPvuuy89gOv4Kq1//D+Wp+Nn9t5773Rd4wDnuuuuy822qUR5arVt6llMFMQd8xZbbBGam5vDKaecku7kS+JOPm63uG1KYid95plnhq222irdUX7xi19MO7iOYqLy+OOP7/TvXnLJJWH06NHp4GXrrbcOhxxySJrkzHvZ7rjjjrSNxmUOHjw4jB8/Pvzyl78M69at63Fs5q1ssUPsLGZ32WWXim63nuzDo5tuuinsvvvu6fx77rlnmDNnTrv3169fHy644IIwbNiwdF8/ZcqUsGTJkh7VH9XXmzbdVZstxVs8SJo0aVIYMmRI2mZj//+jH/2o7hNPlajLjVluPajF/qielbM+16xZEw477LD0oCsevMW+6dRTT63b5Oem1GUpxju+Oo67a3n8lvf94muvvZYmjuNYJ8bumDFj0pMEYpKA6u1DKX+9n3vuua3zxr7piCOOCE8//XTFq7qex/vlLFtX+++2+6dqj29r0ZcXcduVXH311WHzzTcPK1euDB3V+tikT/yn8uc/AwAAAABQ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DAAAAABAJslkAAAAAADym0y+4oorklGjRiUDBw5MJk2alMyfP7/b+X/2s58lY8eOTTbffPNkp512Sr7+9a8nH3zwwSYtM8/l+cEPfpD06dOn3WuPPfbIXVk+/vjjZObMmcno0aPT+cePH5/ceeedm7TMvJenltump3pa7zfffHNaljj/pz/96eT2229v934IIbnwwguT4cOHp2330EMPTV588cV287z99tvJCSeckDQ3NydDhw5NvvrVrybvvvtu7soTt/V3vvOddPrgwYOTHXfcMfnKV76S/Pd//3e7ZcS/13F7z5o1K3fliU4++eQN1nXq1KmF3D5Rx7KUXpdeemlVtg+brjftLfaFZ511VrLNNtskW2yxRfKlL30pWbFiRbt5OmsXs2fPboh9bK3VYr9Vr3oTH4cccsgG9XXGGWdUbZ2LqtztlvLX+/XXX79B246fq7ZG3K/nhf4l//W+aNGidFxWGn/HnMamLrNa9LnVob9toD431MDs2bND//79w7XXXhsWLVoUTj311DB06NCwYsWKTue/4YYbwoABA9L/X3nllXDXXXeF4cOHh69//eu9XmbeyzNjxoyw5557hpaWltbXX/7yl9yV5dvf/nbYcccdw5w5c8LSpUvDlVdeGQYOHBiefvrpXi8z7+Wp1bapdNkffvjhsNlmm4Uf//jH4fnnnw/nn39+6NevX1i4cGHrPLNmzQpDhgwJt912W/jTn/4UjjrqqLDrrruG999/v3WeqVOnhvHjx4fHHnssPPjgg2HMmDFh2rRpuSvPypUrw6GHHhpuvPHG8MILL4RHH300TJw4Mey7777tlrPLLruEmTNnttve7777bu7KE5100klp/bdd17fffrvdcoqyfaK25YivuOw+ffqksVnp7UN59Ka9nXHGGWGnnXYKc+fODU8++WT4zGc+Ew488MB288Thy3XXXdduu7fdD9XzPraWarXfqle9iY+DDz44rfe29bVq1aqqrXMRVaLdUv56j/v05ubmdm17+fLlVa3qRtyv54X+pRj1Pn/+/PDNb34z/O53vws77LBD+OlPf7rJy6wWfW7l6W8bq8+tSTI5JmzOOuus1t/XrVuXJvAuvvjiTueP806ePLndtG984xvhs5/9bK+XmffyxIRlPMCotp6WJSbBf/GLX7Sbdswxx4QTTjih18vMe3lqtW0qXfZjjz02HHnkke2mTZo0KZx++unpz+vXr08HDZdeemnr+zEhG78YiQOKKA6kY5LniSeeaJ3njjvuSBOAr7/+eq7K09UAKa7/n//853bJys4GSpuqEuWJSZmjjz66y79Z9O0Ty9Zx31mp7cOm6017i/uUeCB+8803t05bvHhxupz4hU9J/P33v/99w+1ja60W+6161dv9cUwmn3POOVVay/pQjf6JTa/3eGAbk6611Ij79bzQvxSj3jdmDF7LY/+u6HOrQ3/bWH1u1W9z8dFHHyVPPfVUeolPSd++fdPfH3300U4/c+CBB6afKZ2m/fLLL6eXEB1xxBG9Xmaey1MSL4GKl97vtttu6WWQr732Wu7K8uGHH25wOny8hOuhhx7q9TLzXJ5abZtqlD1Obzt/dPjhh7fO/8orryTLly9vN8+QIUPSSyhK88T/46W6++23X+s8cf74tx9//PFclaczq1atSi/xiGVoK942IV5yP2HChPQWC2vXru11WSpdnvvvvz/Zfvvt09vofO1rX0veeuutdsso6vaJtzmYM2dOehl4R+XePpRHb9pbbEfxFjRt20a8fHjnnXfeoG3EW2Fsu+22ycSJE5Nrr702vZS43vextVSr/Va92pT98Q033JC2/U996lPJd7/73WTNmjVVWONiqtb4gU2v9yje5mWXXXZJbwF49NFHp5fUV0sj7tfzQv9SnHqvxTLLQZ9befrbxutzm5Iqe/PNN5N169Ylw4YNazc9/v7CCy90+pnjjz8+/dzf/d3fpQeLMVEQ7w/3ve99r9fLzHN5ojjIiPcxiQdWLS0tyUUXXZR87nOfS5577rlkyy23zE1Z4oDpJz/5SXLQQQel9xmeO3ducuutt6bL6e0y81yeWm2bapQ9DnY7mz9OL71fmtbdPDEh0FZTU1Oy9dZbt86Tl/J0dp/WeA/ladOmpfevLDn77LOTffbZJy3DI488kh64x+0e20neyhPvM3rMMccku+66a7J06dJ0n/KFL3wh7UQ222yzQm+f//iP/0jjK5avrUpsH8qjN+0tTu/fv/8GX+h0bBvx3vaTJ09OBg0alNx9993JmWeemQ6IYnuo531sLdVqv1Wvers/jmPIOPCPX2g/++yzab+1ZMmSdKxCbfonylPvcVwdvxjca6+90i/3L7vssvQEnHhwO3LkyIpXcyPu1/NC/1Kceq/FMstBn1t5+tvG63OrnkzujXjGyo9+9KPkyiuvTBN5L730UnLOOeckP/zhD5MLLrggKZqNKU88kCqJGzjOFw8ebrrppk7PzKuVn//858mpp56anjkWz+iMCdhTTjklbZhFtDHlKcq2YePFMyGPPfbY9Mudq666qt173/jGN9pt75joOv3005OLL744GTBgQK6q+bjjjmv9OT4EJq5vbMNxnzNlypSkyGIMxqsAOl45UKTtUy+mT5+eXHLJJd3Os3jx4oquQ9u+P56R/t5776VnpVcrmUz51Nt+q9Lxcdppp7Wrr/hQr1hPMREf6w2K6oADDkhfJfGgdty4ccnVV1+dHiNBo/cvbEifC7Xrc6ueTI6X5cUzTTo+mT3+vsMOO3R50HjiiScm//Iv/9LaGcQDxzig/v73v9+rZea5PPGU9I7iWVq77757mnjOU1m222675LbbbkvP6oyXpcYzZeJOPd7+obfLzHN5OlONbVONssfp3c1f+j9OiwevbefZe++9W+d544032i0jnnkfn567Kdu7EuXpmEj+85//nMybN6/dWcmdiV8exDK9+uqr6Td6eStPW7Hdxr8V22YcNBdx+0QPPvhgeubdjTfemLku5dg+dO+8885LTj755G7niW2vN+0tTo+Xaq1cubLd2clZbT1u9zjwibcqqsaXCLXax9ZSrfZbRVPJ+Oiq7UexviSTa9du2fR676hfv37pl4XVGl834n49L/Qvxan3WiyzO/rc/NDfNl6fW/V7Jsezxvbdd9/09gEl69evT39vmxlvK94LrmOCtXTpYzyTsDfLzHN5OhMv341nnbQdiJTbptRjPFtwxIgR6YHQLbfckt5zZVOXmcfy1GrbVKPscXrb+aN77rmndf54CXLcGbWdZ/Xq1em9HUvzxP9jEijes6ckJmjj3y4d8OalPG0TyfEe2Pfee296390szzzzTBq/HS9PzkN5Olq2bFn6pUipbRZt+5Rcc8016fLHjx9fle1D9+KXbvHqje5esU30pr3F7RwHM23bRvwiId6Xvru2Hrf7VlttVbWz0Wu1j62lWu23iqaS8dFV24+KWl/10m7Z9HrvKF6yu3Dhwqq17Ubcr+eF/qU49V6LZXZHn5sf+tsG7HNDDcyePTt9iu3111+fPlnztNNOC0OHDg3Lly9P3z/xxBPD9OnTW+efMWNG2HLLLdOn3r788svh7rvvDqNHj06foLuxyyxaec4777xw//33h1deeSU8/PDD4dBDDw3bbrtteOONN3JVlsceeyzccsstYenSpeGBBx4IkydPDrvuumv461//utHLLFp5arVtKl32WJampqZw2WWXhcWLF6fttF+/fmHhwoWt88yaNStdxh/+8Ifw7LPPhqOPPjqtn/fff791nqlTp4YJEyaExx9/PDz00EPhE5/4RJg2bVruyvPRRx+Fo446KowcOTI888wzoaWlpfX14YcfpvM88sgj6VOK4/uxTfznf/5n2G677cJXvvKV3JXnnXfeCd/85jfDo48+mrbNe++9N+yzzz5p/X/wwQeF2z4lq1atCoMGDQpXXXXVBn+zktuH8shqb8uWLQtjx45N3y8544wzws477xzmzZsXnnzyyXDAAQekr5I//vGP4Ve/+lXaVl588cVw5ZVXpm3kwgsvbIh9bC3Var9Vr3oaHy+99FKYOXNmGhexvmI72W233cJBBx1Uw1LkX6X6J8pb7xdddFG466670v78qaeeCscdd1wYOHBgWLRoUdWquhH363mhfylGvcdjpAULFqSv4cOHp314/DmOxzZ2mbWiz608/W1j9bk1SSZHl19+eXqw2L9//zBx4sQ0iVdy8MEHh5NOOqn1948//jj84Ac/SBOusYA77bRTOPPMM9sl+LKWWbTyfPnLX0530HF5I0aMSH+PBxF5K0tMqo4bNy5tuNtss03aSF9//fUeLbNo5anltqlk2aObbrop7L777un8e+65Z5gzZ06799evXx8uuOCCMGzYsLSOpkyZEpYsWdJunrfeeis9GN5iiy1Cc3NzOOWUU9KEQd7KEw/E4/dpnb3uu+++dJ64Y500aVIYMmRIGquxbfzoRz8qW5KjnOVZs2ZNOOyww9JkajyQ2WWXXcKpp566wcCtKNun5Oqrrw6bb755WLly5QbvVXr7sOmy2lspDksxF8UD7NgnbrXVVmmS+Itf/GL6JU/JHXfcEfbee+90mYMHDw7jx48Pv/zlL8O6desaYh9ba7XYb9WrnsbHa6+9liaOt95667R9jBkzJnzrW99Kv3Sj+v0T5a33c889t3XeuA884ogjwtNPP131am7E/Xpe6F/yX+9dHT/F+TZ2mbWiz60O/W3j9Ll94j+9OZUaAAAAAIDGUfV7JgMAAAAAUDySyQAAAAAAZJJMBgAAAAAgk2QyAAAAAACZJJMBAAAAAMgkmQwAAAAAQCbJZAAAAAAAMkkmAwAAAACQSTIZAAAAAIBMkskAAAAAAGSSTAYAAAAAIMny/wNkM3lK3GgKhgAAAABJRU5ErkJggg==", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -637,7 +637,7 @@ "\n", "#### Median value of each element of the matrix\n", "\n", - "Median values of each element of the adjacency matrix estimated on the data with missing values are as follows:" + "The following matrix shows the median of each adjacency matrix element across all bootstrap replicates. For each bootstrap replicate, its representative adjacency matrix is obtained by taking the median across its multiple imputations." ] }, { @@ -655,8 +655,8 @@ " [ 0.555, 0. , 0.381, 0. , 0. , 0. ],\n", " [ 0. , 0. , 0. , 0.918, 0. , 0. ],\n", " [ 0. , 0. , 0. , 0. , 0. , 0. ],\n", - " [ 1.025, 0. , -0.147, 0. , 0. , 0. ],\n", - " [ 0.892, 0. , 0. , 0. , 0. , 0. ]])" + " [ 1.026, 0. , -0.148, 0. , 0. , 0. ],\n", + " [ 0.893, 0. , 0. , 0. , 0. , 0. ]])" ] }, "execution_count": 17, @@ -665,7 +665,130 @@ } ], "source": [ - "np.median(adj_matrices_list, axis=(0, 1))" + "adj_median_per_bootstrap = np.median(adj_matrices_list, axis=1)\n", + "adj_median_over_bootstrap = np.median(adj_median_per_bootstrap, axis=0)\n", + "\n", + "adj_median_over_bootstrap" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "7a7e3abe", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "x0\n", + "\n", + "x0\n", + "\n", + "\n", + "\n", + "x1\n", + "\n", + "x1\n", + "\n", + "\n", + "\n", + "x0->x1\n", + "\n", + "\n", + "0.56\n", + "\n", + "\n", + "\n", + "x4\n", + "\n", + "x4\n", + "\n", + "\n", + "\n", + "x0->x4\n", + "\n", + "\n", + "1.03\n", + "\n", + "\n", + "\n", + "x5\n", + "\n", + "x5\n", + "\n", + "\n", + "\n", + "x0->x5\n", + "\n", + "\n", + "0.89\n", + "\n", + "\n", + "\n", + "x2\n", + "\n", + "x2\n", + "\n", + "\n", + "\n", + "x2->x1\n", + "\n", + "\n", + "0.38\n", + "\n", + "\n", + "\n", + "x2->x4\n", + "\n", + "\n", + "-0.15\n", + "\n", + "\n", + "\n", + "x3\n", + "\n", + "x3\n", + "\n", + "\n", + "\n", + "x3->x0\n", + "\n", + "\n", + "0.88\n", + "\n", + "\n", + "\n", + "x3->x2\n", + "\n", + "\n", + "0.92\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "make_dot(adj_median_over_bootstrap)" ] }, { @@ -964,7 +1087,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "lingam_env (3.11.9)", "language": "python", "name": "python3" }, @@ -978,7 +1101,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.11.9" }, "widgets": { "application/vnd.jupyter.widget-state+json": {