{
“cells”: [
{

“cell_type”: “code”, “execution_count”: 1, “id”: “646d6207”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:02.181392Z”, “iopub.status.busy”: “2026-02-17T15:57:02.181247Z”, “iopub.status.idle”: “2026-02-17T15:57:02.187893Z”, “shell.execute_reply”: “2026-02-17T15:57:02.187355Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“FDFI version: 0.0.5n”

]

}

], “source”: [

“import fdfin”, “print(‘FDFI version:’, fdfi.__version__)”

]

}, {

“cell_type”: “markdown”, “id”: “495b1ae3”, “metadata”: {}, “source”: [

“# Confidence Intervals and Statistical Inferencen”, “n”, “This tutorial covers statistical inference with FDFI, including confidence intervals, hypothesis testing, and feature selection.n”, “n”, “## What You’ll Learnn”, “n”, “1. Computing confidence intervals with conf_int()n”, “2. One-sided vs two-sided testsn”, “3. Variance floor for stable inferencen”, “4. Practical significance marginsn”, “5. Statistically-driven feature selection”

]

}, {

“cell_type”: “code”, “execution_count”: 2, “id”: “4b311614”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:02.190083Z”, “iopub.status.busy”: “2026-02-17T15:57:02.189929Z”, “iopub.status.idle”: “2026-02-17T15:57:02.970029Z”, “shell.execute_reply”: “2026-02-17T15:57:02.969193Z”

}

}, “outputs”: [], “source”: [

“import numpy as npn”, “import matplotlib.pyplot as pltn”, “from fdfi.explainers import OTExplainern”, “n”, “np.random.seed(42)”

]

}, {

“cell_type”: “markdown”, “id”: “7588803f”, “metadata”: {}, “source”: [

“## Setupn”, “n”, “Create a model where we know the true feature importance:”

]

}, {

“cell_type”: “code”, “execution_count”: 3, “id”: “b49a0457”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:02.971961Z”, “iopub.status.busy”: “2026-02-17T15:57:02.971789Z”, “iopub.status.idle”: “2026-02-17T15:57:03.007826Z”, “shell.execute_reply”: “2026-02-17T15:57:03.007364Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“True coefficients: [2. 1.5 0.5 0. 0. 0. 0. 0. 0. 0. ]n”, “Estimated importance: [3.641e+00 2.674e+00 2.270e-01 7.000e-03 1.200e-02 7.000e-03 4.000e-03n”, “ 1.000e-03 9.000e-03 1.500e-02]n”

]

}

], “source”: [

“n_features = 10n”, “n_train = 500n”, “n_test = 100n”, “n”, “# True importance: features 0, 1, 2 are important; rest are noisen”, “true_coefs = np.array([2.0, 1.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])n”, “n”, “def model(X):n”, “ return X @ true_coefsn”, “n”, “X_train = np.random.randn(n_train, n_features)n”, “X_test = np.random.randn(n_test, n_features)n”, “n”, “# Create explainern”, “explainer = OTExplainer(model, data=X_train, nsamples=100)n”, “results = explainer(X_test)n”, “n”, “print("True coefficients:", true_coefs)n”, “print("Estimated importance:", results["phi_X"].round(3))”

]

}, {

“cell_type”: “markdown”, “id”: “4b5e5198”, “metadata”: {}, “source”: [

“## Basic Confidence Intervalsn”, “n”, “The conf_int() method computes pointwise confidence intervals:”

]

}, {

“cell_type”: “code”, “execution_count”: 4, “id”: “b8ee9553”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:03.009874Z”, “iopub.status.busy”: “2026-02-17T15:57:03.009751Z”, “iopub.status.idle”: “2026-02-17T15:57:03.800817Z”, “shell.execute_reply”: “2026-02-17T15:57:03.800040Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“Two-sided 95% Confidence Intervals:n”, “———————————————————————-n”, “ Feature Estimate SE CI Lower CI Upper P-valuen”, “———————————————————————-n”, “ 0 3.6412 0.5222 2.6177 4.6646 0.0000 *n”, “ 1 2.6736 0.3974 1.8947 3.4524 0.0000 *n”, “ 2 0.2268 0.0410 0.1465 0.3071 0.0000 *n”, “ 3 0.0073 0.0230 -0.0378 0.0524 0.7334 n”, “ 4 0.0116 0.0230 -0.0336 0.0567 0.8771 n”, “ 5 0.0067 0.0230 -0.0384 0.0519 0.7157 n”, “ 6 0.0037 0.0230 -0.0414 0.0488 0.6186 n”, “ 7 0.0008 0.0230 -0.0443 0.0459 0.5346 n”, “ 8 0.0090 0.0230 -0.0361 0.0542 0.7910 n”, “ 9 0.0151 0.0230 -0.0300 0.0603 1.0000 n”

]

}

], “source”: [

“# Two-sided 95% confidence intervalsn”, “ci = explainer.conf_int(alpha=0.05, alternative="two-sided")n”, “n”, “print("Two-sided 95% Confidence Intervals:")n”, “print("-" * 70)n”, “print(f"{‘Feature’:>8} {‘Estimate’:>10} {‘SE’:>10} {‘CI Lower’:>10} {‘CI Upper’:>10} {‘P-value’:>10}")n”, “print("-" * 70)n”, “for i in range(n_features):n”, “ sig = "*" if ci["pvalue"][i] < 0.05 else ""n”, “ print(f"{i:>8} {ci[‘score’][i]:>10.4f} {ci[‘se’][i]:>10.4f} "n”, “ f"{ci[‘ci_lower’][i]:>10.4f} {ci[‘ci_upper’][i]:>10.4f} {ci[‘pvalue’][i]:>10.4f} {sig}")”

]

}, {

“cell_type”: “markdown”, “id”: “c08a2b30”, “metadata”: {}, “source”: [

“## Visualize Confidence Intervals”

]

}, {

“cell_type”: “code”, “execution_count”: 5, “id”: “a31af857”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:03.803324Z”, “iopub.status.busy”: “2026-02-17T15:57:03.803065Z”, “iopub.status.idle”: “2026-02-17T15:57:03.925537Z”, “shell.execute_reply”: “2026-02-17T15:57:03.924572Z”

}

}, “outputs”: [

{
“data”: {

“image/png”: “iVBORw0KGgoAAAANSUhEUgAAA90AAAHqCAYAAAAZLi26AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVv5JREFUeJzt3Ql4E9X+xvEfSyk7iIDs+yb7piIgiLiBglwVFFDABTcU9w29AqKiuOGVKyJ6ccF9Q/F/Fb0IKKCyKIqiiIqAsiu0UKDQNv/nPZiYpklp0w5p2u/nefI0mUwnJyeTybxzzpwp5vP5fAYAAAAAAPJd8fxfJAAAAAAAIHQDAAAAAOAhWroBAAAAAPAIoRsAAAAAAI8QugEAAAAA8AihGwAAAAAAjxC6AQAAAADwCKEbAAAAAACPELoBAAAAAPAIoRtAXHr22WetWLFiYW833XSTJ6+5atUqGzdunP36669W0KhMeu8PPfSQxavFixe7+t25c6cVZSeeeKK7+e3Zs8fVy/z587PMq+n63Ldv3x7167344ovWoUMHK126tFWtWtWGDBliGzZsyDJfgwYNwn7frrjiikzz6X/79u1rFStWtKOPPtreeeedLMt6/fXX7cgjj7Rt27blqqzffPONXXTRRdawYUNX3vLly1vHjh1t0qRJ9ueff5qXvvrqK+vZs6dVqlTJve/Jkye7z0T3w302oUaMGOHqMN7pfajeC9s2NLvfmXgpL4CCq2SsCwAAeTFjxgxr0aJFpmm1atXypFK1wzh+/HgXiArDznNBDN2qX+3UV65c2YqqJ554ItNjhW7ViwSH8fzw+OOP2+jRo+3SSy+1+++/33777Tf75z//aSeccIILmUcccUSm+bt165blwM5RRx2V6fHw4cMtNTXV3njjDRdGBw0a5L47jRs3ds8nJSXZtdde65ZTrVq1HJd1+vTpdtVVV1nz5s3t5ptvtpYtW9qBAwds2bJl9uSTT9pnn31mb7/9tnnl4osvtpSUFHvllVdcvWgbULZsWfe6KgsOjW0ogKKK0A0grrVu3do6d+5s8UzBQa0pJUsWzU3y3r17XaslDjpcAU7BWAG7X79+LtAGv37Xrl1dKL733nsz/Y8OhnTp0iXiMnWAQEF70aJFdvzxx9upp57qwvdHH30UCN233nqrC85qsc4pBdsrr7zSTjnlFJs1a5YlJiYGntO0G2+80T744APz0rfffmsjR460Pn36ZJqeXX3g8NB6pwMgAFBQ0b0cQKH26quvup3/cuXKuS6Rp512mmvBC6aWsvPPP9+1XJUpU8b9HTx4sK1bty5TN8OBAwe6+7169Qp0rdV00f+ohfZQXYX93VFfeOEFFxRq167tAsRPP/3knv/f//5nvXv3dl1ztROplsW5c+fmqWvkxx9/7MKCuvNqucOGDXMtdps3b3atkApSNWvWdN3ydQAgtMu6uu4qfNWrV8+FYx3kCFemhQsXurJXqFDBlV3B7f/+7//ClunDDz90LYdq6dS8t99+u2u9FHUd9tevv9uuPkcFOJVTn5G6Ld92223ufYTr+qr6VBdn3a9bt66ra4XMYHp89913u2Xpfal+9Nmqxd3P5/O5luf27du711UL57nnnmu//PJLtnX/3XffufKrG7Xf8uXL3bRWrVplmrd///7WqVOnsOuMPgN/a7Bau/31Erqubdmyxa2z6vqslmfVrVqUDxUiNY/qKZi+L1WqVLE333zTcmv//v2uzvR989NnsG/fPndfdfv888/btGnTcrXc++67z73vp556KlPg9itVqpSrR7+MjAy33qoXjOavXr26W+/Vkh9M9awDd0uXLnWt+1oXGzVq5Fr9tYzgdTYtLc2mTp0a+AwkUvdy/Y8OLOi1tX7pPUeqr3vuuSdQTn3WOhgR2u1e25czzzzTHVhQd3qti/qf//znP1mW+fvvv9tll13m1nvVi3r+aJ3VOuKXnJzsvu/6rmkebYeuu+66LN+nnMpJ+Q61Dc3p9s9/SsWXX37p3pe+kzqgo+7+mu7flgbTgR69T/9pGDoIdNZZZ1mdOnXcd79JkyZ2+eWX5+g0Df1+6L1qndJnpvo944wzsqxbABCM0A0grqWnp7ud4eBb8I66goha7l577TUXdHft2uV2rtXN0U/BRjvI2mmbM2eOPfDAA7Zp0yY75phjAjth2qnS8uTf//63a3nTTdOjoZC5fv161y129uzZbgdu5syZLlhqh/O5555zZVb40YGCaIO3qOuwwpi6xd5555320ksvuRCusrdr1861RKpL8MMPP+y6G4eaMmWK25lW/aiMxYsXd619ev9+CxYssJNOOsmFuGeeecZefvllF77ViqrAHEqhMCEhwX0men21Yl5zzTXuubfeeitQv9qBlzVr1rhw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iy66yJXhlVdesW+++cYdPDj99NNtzZo1VhTRvbwQ05czXHeVSHSkSjcAAACg0LjvvsjPNW1qNnTo348ffDBruPZr0EDNvH8/njzZbM+erPONGxdVMTMyMmzIkCFWokQJmzlzZqZLVSksd+zY0e4Lei//+c9/rG7duvbjjz9as2bN3LQmTZrYpEmTAvPccccdbp4pU6a45bVo0cI2btxot956q911111WvHh0bbBHHHGEW6bKqmWeccYZ7rzvkSNHujD+8ssv22+//Wa1atUKnBeuAwUzZszI9B6KCkJ3IaajW+PHj8/x/GPHjnXdRwAAAAAcXupO/tlnn9mSJUusYsWKmZ5bvny5a1UOd261Qq4/dHfu3DnTc99//70df/zxmQJ8t27dbPfu3S4U16tXL6qytmrVygVuPzXcrVy50t3/8ssvzefzBcrkl5qa6rqiF0WE7kLs8ssvt/79+wce792717p37+7uL1y40MqUKZNpflq5AQAAUOiMGRP5udCW3ptvjjxvUHB1rrvO8surr77qzpH+v//7P2uq1vcwreD9+vWzBx54IMtzwfvwOn86mMJvcOD2T5PQ6bmRkJCQ6bGWpTL6y6pArgMFwcFciuqAbITuQiy0u3hKSkrgvs4HCf1SAgAAAIVObkbw9mrebKxYscIuvvhiu//+++20004LO4+6lr/55pvWoEEDd852TrVs2dL9X3D4Xrx4sVWoUMENcuaFDh06WHp6um3dutVOOOEET14j3jCQGgAAAADEgEYf18BpGnn8ggsusM2bN2e6bdu2zc2n0cH//PNPGzx4sOt+/ssvv9iHH37owroCbiS65NiGDRvsmmuusR9++MHeeecdd0qpRjiP9nzuQ1G38qFDh9qwYcPsrbfesrVr19rSpUtdK/1///tfK4po6QYAAACAGFB38nXr1rlbuFM969evb7/++qsbkEyjgWsANLWG6/xoPacRwbMLz2rNVtDVJcjatWtnVapUsUsuucTuvPNOT9+XBkzTCOk33nijG0Fd53Lr3HKNpF4UFfP5O/XHoeTkZKtUqZIlJSVlGWwAWal7uf88Cg2eQPdyAAAAFAb79u1zLaoNGza00qVLx7o4KCLrVnIO8yjdywEAAAAA8AihGwAAAAAAjxC6AQAAAADwCKEbAAAAAACPELoBAAAAAPAIoRsAAAAAAI8QugEAAAAA8AihGwAAAAAAjxC6AQAAAADwCKEbAAAAAAqwYsWK2axZs/J1mePGjbP27dtnmXbUUUcFXm/EiBE2YMCAfH3doqhkrAsAAAAAAF7p93K/w1q5swfPzvX/bN261f75z3/a+++/b1u2bLEjjjjC2rVr50Lw8ccfb5s2bXLT8tNNN91k11xzTeDx999/b+PHj7e3337bunTp4l6vV69e5vP57HA68cQT3cGAyZMnW2FB6AYAAACAGDrnnHPswIED9txzz1mjRo1c8J47d679+eef7vkaNWrk+2uWL1/e3fx+/vln9/ess85yLd2SmJiY769bFNG9HAAAAABiZOfOnbZw4UJ74IEHXMty/fr17dhjj7Xbb7/dzjjjjLDdyxcvXuxag0uXLm2dO3d2z2meFStWuOfnz5/vHiu46/myZcta165dbfXq1WG7l+t+v34HewQUL148ELpDu5dnZGS4cjZp0sQF8nr16tm9994beP7WW2+1Zs2audfTwQO13h84cCDLa77wwgvWoEEDq1Spkp1//vm2a9euwOstWLDAHnvsMVcG3X799VeLd4RuAAAAAIgRf4uzgnNqauoh51dAVUBu06aNffnllzZhwgQXdsO544477OGHH7Zly5ZZyZIl7eKLL47Y1XzGjBnuvrqy6xaODgQodCtMr1q1yl566SV3DrhfhQoV7Nlnn3XPKThPnz7dHn300UzLUIu63ut7773nbgrZ999/v3tO/6Pu9CNHjgyUo27duhbv6F4OAAAAADGiMKygqqD55JNPWseOHa1nz56uBbht27ZZ5n/xxRddC7ACrVq6W7Zsab///rv7/1Bqhday5LbbbnMt5/v27XP/F0yhv3Llytl2ZVfYVyieMmWKDR8+3E1r3Lixde/ePTDPnXfeGbivluwbb7zRXn31VbvlllsytZbr/Sqgy4UXXuha5FVWtXyXKlXKtZR70aU+VmjpBgAAAIAYn9O9ceNGe/fdd+20005z3cMVvhVOQ6mLuMJ4cHBWd/RwgkN7zZo1A4O2RUMDraklvnfv3hHneeONN1wIV2BWkFeL+Pr16zPNozDuD9z+ckVbpnhB6AYAAACAGFOIPuWUU+yuu+5y52zr/OaxY8dmmU+jifvPuQ6eFk5CQkLgvv9/1NIcjTJlymT7/Oeff+5a5/v06eO6jX/11Veue/v+/fsjlslfrmjLFC8I3QAAAABQwKjbeEpKSpbpLVq0sG+++SbT+d86Z9trTZs2dcFbXcHDWbRokRsETkFbg7dp/nXr1uX6ddS9PD093QoTQjcAAAAAxMgff/xhJ510ks2cOdOF6bVr19rrr79ukyZNcpfvCjVkyBDXMnzZZZe5Lt9z5syxhx56yD0X2gKe3y3xGrBN52c///zzbkA0tW4/88wz7nmNaK6u5K+88op77l//+pe75nduqfv5F1984UYt3759e6FoBSd0AwAAAECM6Nzn4447zo3y3aNHD2vdurU7F1oDo2nQslAVK1a02bNnu8uD6fJballWl3QJHSAtv6lcGhxNr3f00UfbeeedFzgfWwcIrr/+erv66qtdudRFXvPnlkZSL1GihGvpr1atWpZzwuNRMV+kEwDiQHJyshvhLikpya18yJ66p+hLLbt377Zy5cpRZQAAAIh7GpFbLcQNGzb0PHgWRBrR/KKLLnK56FDnXiP/1q2c5lEuGQYAAAAAcUTduxs1amS1a9e2r7/+2nX7HjRoEIG7gCJ0AwAAAEAc2bx5s+virb+65NbAgQPdda5RMBG6AQAAACCOaDAz3RAfGEgNAAAAAACPELoBAAAAAPAIoRsAAAAAAI8QugEAAAAA8AgDqQEAAAAosjZt2uRuOaXRwnUDcorQDQAAAKDImjZtmo0fPz7H848dO9bGjRvnaZlQuBC6AQAAABRZl19+ufXv3z/weO/evda9e3d3f+HChVamTJlM8xf2Vu4GDRrYdddd52755dlnn3XL27lzZ2DaU089ZRMmTLDff//dHnnkEffcrFmzbMWKFVbYFPP5fD6LU8nJyVapUiVLSkqyihUrxro4BV5KSoqVL1/e3d+9e7eVK1cu1kUCAAAA8mzfvn22du1aa9iwoZUuXTqu9plHjBhhzz33nE2cONFuu+22wHQF0H/84x+Wm7iWH4F527Zt7j2XLVvW8svevXtt165dVr169UCOq1q1qgvb55xzjst0GRkZlpqaakceeaQdLqp7f9iPZt3KaR5lIDUAAAAAiCGFuQceeMB27NgR88+hWrVq+Rq4Rb0F/IFb1q9fbwcOHLAzzjjD9RzQ6+lAx+EM3IcToRsAAAAAYujkk0+2GjVquNbu7Lz55pvWqlUrS0xMdK3aDz/8cOC5E0880datW2fXX3+9FStWzN0i0Tnp9erVc8upVauWjR49OvCcljt58uTA4x9++MF1t9eBgZYtW9r//vc/t2x/6/Cvv/7qHr/11lvWq1cvF6DbtWtnn332Wabu5ZUrVw7cb9OmjbvfqFEj979ahsrUvn37TOX8z3/+E3i/CudXX3114Dm1kms5apWvW7euXXXVVa5nQuhrzpkzx44++mgX6k8//fTAoHl6PfUweOeddwL1NX/+fPMCoRsAAAAAYqhEiRJ233332eOPP26//fZb2HmWL19ugwYNsvPPP99WrlzpQuM///lPFy5FobdOnTp29913Zzsi+xtvvGGPPvqoG0BuzZo1Ljz7Q3AodfkeMGCAC9JffPGFOw/7jjvuCDuvpt90003unOxmzZrZ4MGDLS0tLct85513ngvusmTJEldOheZQU6dOtVGjRtlll13m3u+7775rTZo0CTxfvHhx+9e//mXffvutC88ff/yx3XLLLZmWsWfPHnvooYfshRdesE8++cS1sKuMor+qT38Q161r167mBQZSAwAAAIAY0/nbaunV6OjPPPNMlufVstu7d28XtEXBdtWqVfbggw+6c5OrVKniwnuFChVcq3kkCp56Xq3rCQkJrsX72GOPDTvvhx9+aD///LNrAfYv895777VTTjkly7wKseouLhoNXi3UP/30k7Vo0SJLV3N/N3J1ZY9U1nvuucduvPFGu/baawPTjjnmmMD94PPWdb61BmW78sor7YknnghMVxf2J5980ho3buweq6VcByVELd8qi84jz66+8gMt3QAAAABQAOi8brXaKkyH+v77761bt26ZpumxWqvT09Nz/BoDBw50A5upa/fIkSPt7bffDtsiLatXr3at0MGhNFJAb9u2bZYR3rdu3WrR0P9t3LjRHWSIZN68eS78165d2x1oGDZsmP3xxx9uIDw/tdD7A7e/XNGWKS8I3QAAAABQAPTo0cNOO+00GzNmTJbnNIp56Hna0VyISiFaYfrf//63a+nVudB6XbUK5+Q1I1GruZ//f9Q9PRqhl2kLpXPX+/bta61bt3bnuavrvd6PBL+P4DL5yxWLi3cRugEAAACggLj//vtt9uzZtnjx4kzTNYiZrhseTPOom7m6lUupUqVy1OqtUKtrk+ucaHUd16BnOm86lLqGqzv6li1bAtOWLl1qXqtQoYIb0G3u3Llhn1+2bJlrnddAcl26dHF1oJbx3MppfeUV53QD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vL7qN0wGDhxI3ebBAw88YE8++aTb3/r+++9t0qRJ9uCDD9rjjz9OveaDSy+91K2rL7zwgtvGap/r5JNPdgfnkHeMXl6EHHfccdaxY0fX0uV39NFHuxZEtcog73Qk++2333Z1ivy1bds21+KtMN6jRw+qNx9VqVLF7bhccskl1Gse7d69221n1avonnvucS2HkydPpl7z2NKtHkQrVqygHvPRbbfdZosWLaLH22GgBo/33nvP1qxZ4/YTEJ0zzzzTjjrqKHvmmWcC08455xzXS0NBEdHbu3ev61n4zjvv2BlnnBGYrt8w1bt+z5A3tHQXEfv373ddxnTUKpgeL168OGblAnIqKSkpEBCRP9LT0+2VV15xvQfUzRx5p94Z2mFR6wDyj8KKTuFRt9Lzzz/ffvnlF6o3j959913r3Lmza33VAc0OHTrY9OnTqVcP9r9mzpxpF198MYE7j7p3725z5861H3/80T3++uuvbeHChda3b9/8+KiKNPUm1D6BTj8Npm7mqmPkXcl8WAbiwPbt292XSUcIg+nx5s2bY1YuICd8Pp/dcMMN7ge3devWVFoeqduYQva+ffusfPnyrndGy5Ytqdc80gGML7/8knPgPOil9fzzz1uzZs1sy5YtrsVF5xrqlAidi4zo6MCFer5p2zpmzBhbsmSJjR492hITE23YsGFUaz5RL42dO3faiBEjqNM8uvXWW90B+BYtWliJEiXcfu29995rgwcPpm7zSK3c2i+YMGGC6wWrfPDyyy/bF198YU2bNqV+8wGhu4gJ7dakMENXJxR0V199tX3zzTccbc0nzZs3d111tSP45ptv2vDhw123fYJ39DZs2GDXXnutffjhh1laCpA3GnvEr02bNm7HsHHjxvbcc8+5wIjoaPAptXTfd9997rFaunUgQ0Gc0J1/1BVa67B6aiDvYxOp18BLL73kxnnQ75i67qtu9TuGvFEXffXIqF27tjuooVOlhgwZ4g4mI+8I3UVE1apV3RcotFV769atWVq/gYLkmmuucd0gNUq8BgFD3pUqVcqaNGni7munW4P+PPbYYzZt2jSqN0o6fUfbU10Vwk+tMFpvNehPamqq2wYj78qVK+fCt7qcI3o1a9bMcqBNLVw6EIf8sW7dOvvf//5nb731FlWaD26++WY3FoFOMRFtB1THGpeI0J13OpipA/A65Sw5OdltI8477zx3Wg/yjnO6i9BOtnYG/SNo+umxuukBBY16YaiFWzsrH3/8MRt9j+taoRDR6927t+u2r5YX/00HNIYOHeruE7jzj9ZVjVysHUJETyOXh16GUefK6nJByB8zZsxw58sHD0yF6O3Zs8eKF88cXbRt5ZJh+X9gU9tXXeFgzpw57gonyDtauosQdcO78MIL3Y6guufpkja6XNgVV1wR66LF/WjFP/30U+Dx2rVr3U62BvyqV69eTMsW7wNSqQuZRtLUuUb+XhqVKlVyA3sgOjp3U10d69at667JqfOQ58+fbx988AFVmgdaR0PHG9COi845ZhyCvLnpppusX79+bnuq3gQ6p1utMLRs5c3111/vDrqre/mgQYPcOd3aL9ANeacgqNCt9bRkSXa384O2AzqHW9sCdS/X5W8feeQR1yUaeaeArYPwOgVN+7XqWaD7F110EdWbH3woUv7973/76tev7ytVqpSvY8eOvgULFsS6SHFv3rx5Pn2VQm/Dhw+PddHiWrg61W3GjBmxLlpcu/jiiwPbgGrVqvl69+7t+/DDD2NdrEKpZ8+evmuvvTbWxYh75513nq9mzZq+hIQEX61atXxnn32277vvvot1sQqF2bNn+1q3bu1LTEz0tWjRwvfUU0/FukiFxpw5c9xv1urVq2NdlEIjOTnZbVPr1avnK126tK9Ro0a+O+64w5eamhrrohUKr776qqtT7R/UqFHDN2rUKN/OnTtjXaxCg+t0AwAAAADgEc7pBgAAAADAI4RuAAAAAAA8QugGAAAAAMAjhG4AAAAAADxC6AYAAAAAwCOEbgAAAAAAPELoBgAAAADAI4RuAAAAAAA8QugGAAAAAMAjhG4AAAqoESNGWLFixbLcfvrppzwv+9lnn7XKlSvnSzkBAEBkJbN5DgAAxNjpp59uM2bMyDStWrVqVpAcOHDAEhISYl0MAAAKJFq6AQAowBITE61GjRqZbiVKlLDZs2dbp06drHTp0taoUSMbP368paWlBf7vkUcesTZt2li5cuWsbt26dtVVV9nu3bvdc/Pnz7eLLrrIkpKSAq3n48aNc8/p/qxZszKVQS3iahmXX3/91c3z2muv2Yknnuhef+bMme45HRw4+uij3bQWLVrYE088cRhrCgCAgomWbgAA4sycOXPsggsusH/96192wgkn2M8//2yXXXaZe27s2LHub/Hixd3zDRo0sLVr17rQfcstt7gg3LVrV5s8ebLdddddtnr1ajd/+fLlc1WGW2+91R5++GEXtHVgYPr06e61p0yZYh06dLCvvvrKRo4c6UL/8OHDPagFAADiA6EbAIAC7L333ssUiPv06WNbtmyx2267LRBm1dI9YcIEF6r9ofu6664L/E/Dhg3d81deeaUL3aVKlbJKlSq5Fmu1nEdDyz/77LMDj7V8hXD/NL3mqlWrbNq0aYRuAECRRugGAKAA69Wrl02dOjXwWC3HTZo0saVLl9q9994bmJ6enm779u2zPXv2WNmyZW3evHl23333ueCbnJzsup7r+ZSUFLeMvOrcuXPg/rZt22zDhg12ySWXuNZtP72mwj0AAEUZoRsAgALMH7KDZWRkuHO4g1ua/XQ+9bp166xv3752xRVXuBboKlWq2MKFC10o1qBn2VHrt8/nyzQt3P8EB3eVR9TF/Ljjjss0n84/BwCgKCN0AwAQZzp27OjOxQ4N437Lli1zrczq7q1zu0UDnwVTF3O1jofSyOibNm0KPF6zZo1rPc/OUUcdZbVr17ZffvnFhg4dGuW7AgCgcCJ0AwAQZzQA2plnnulGJR84cKAL1t98842tXLnS7rnnHmvcuLEL3Y8//rj169fPFi1aZE8++WSmZWiANY1mPnfuXGvXrp3rkq7bSSed5AZD69Kli2vB1oBpObkcmEY/Hz16tFWsWNGdd56amurC/44dO+yGG27wsDYAACjYuGQYAABx5rTTTnMDrH300Ud2zDHHuICsS4TVr1/fPd++fXv3+IEHHrDWrVvbiy++aBMnTsy0DI1gru7n5513nmvdnjRpkpuu1nGF+R49etiQIUPspptucmH8UC699FJ7+umn3aXFdKmynj17uvsaUA0AgKKsmC/0xC0AAAAAAJAvaOkGAAAAAMAjhG4AAAAAADxC6AYAAAAAwCOEbgAAAAAAPELoBgAAAADAI4RuAAAAAAA8QugGAAAAAMAjhG4AAAAAADxC6AYAAAAAwCOEbgAAAAAAPELoBgAAAADAI4RuAAAAAADMG/8PAckIK93EI9QAAAAASUVORK5CYII=”, “text/plain”: [

“<Figure size 1000x500 with 1 Axes>”

]

}, “metadata”: {}, “output_type”: “display_data”

}

], “source”: [

“fig, ax = plt.subplots(figsize=(10, 5))n”, “n”, “x = np.arange(n_features)n”, “colors = [‘green’ if ci[‘reject_null’][i] else ‘gray’ for i in range(n_features)]n”, “n”, “ax.bar(x, ci[‘score’], color=colors, alpha=0.7)n”, “ax.errorbar(x, ci[‘score’], n”, “ yerr=[ci[‘score’] - ci[‘ci_lower’], ci[‘ci_upper’] - ci[‘score’]],n”, “ fmt=’none’, color=’black’, capsize=4)n”, “ax.axhline(y=0, color=’red’, linestyle=’–’, alpha=0.5)n”, “ax.set_xlabel(‘Feature’)n”, “ax.set_ylabel(‘Importance’)n”, “ax.set_title(‘Feature Importance with 95% Confidence Intervals’)n”, “ax.set_xticks(x)n”, “ax.legend([‘Zero line’, ‘Significant’, ‘Not significant’], loc=’upper right’)n”, “plt.tight_layout()n”, “plt.show()”

]

}, {

“cell_type”: “markdown”, “id”: “6b1529ef”, “metadata”: {}, “source”: [

“## One-Sided Testsn”, “n”, “For feature importance, we often care if a feature has positive importance. Use alternative="greater":”

]

}, {

“cell_type”: “code”, “execution_count”: 6, “id”: “7377545b”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:03.928335Z”, “iopub.status.busy”: “2026-02-17T15:57:03.928142Z”, “iopub.status.idle”: “2026-02-17T15:57:03.935594Z”, “shell.execute_reply”: “2026-02-17T15:57:03.935161Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“One-sided test (phi > 0):n”, “————————————————————n”, “ Feature Estimate CI Lower P-value Significantn”, “————————————————————n”, “ 0 3.6412 2.7822 0.0000 Yesn”, “ 1 2.6736 2.0199 0.0000 Yesn”, “ 2 0.2268 0.1594 0.0000 Yesn”, “ 3 0.0073 -0.0306 0.6333 Non”, “ 4 0.0116 -0.0263 0.5614 Non”, “ 5 0.0067 -0.0311 0.6421 Non”, “ 6 0.0037 -0.0342 0.6907 Non”, “ 7 0.0008 -0.0370 0.7327 Non”, “ 8 0.0090 -0.0289 0.6045 Non”, “ 9 0.0151 -0.0228 0.5000 Non”

]

}

], “source”: [

“# One-sided test: H0: phi <= 0 vs H1: phi > 0n”, “ci_greater = explainer.conf_int(alpha=0.05, alternative="greater")n”, “n”, “print("One-sided test (phi > 0):")n”, “print("-" * 60)n”, “print(f"{‘Feature’:>8} {‘Estimate’:>10} {‘CI Lower’:>10} {‘P-value’:>10} {‘Significant’:>12}")n”, “print("-" * 60)n”, “for i in range(n_features):n”, “ sig = "Yes" if ci_greater["reject_null"][i] else "No"n”, “ print(f"{i:>8} {ci_greater[‘score’][i]:>10.4f} "n”, “ f"{ci_greater[‘ci_lower’][i]:>10.4f} {ci_greater[‘pvalue’][i]:>10.4f} {sig:>12}")”

]

}, {

“cell_type”: “markdown”, “id”: “685f2536”, “metadata”: {}, “source”: [

“## Variance Floorn”, “n”, “When some features have very small variance in their importance estimates, confidence intervals can become too narrow. The variance floor adds a minimum standard error.n”, “n”, “Two methods are available:n”, “- fixed: Use a constant floor valuen”, “- mixture: Fit a two-component mixture to estimate the floor”

]

}, {

“cell_type”: “code”, “execution_count”: 7, “id”: “50f51917”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:03.937919Z”, “iopub.status.busy”: “2026-02-17T15:57:03.937721Z”, “iopub.status.idle”: “2026-02-17T15:57:03.950213Z”, “shell.execute_reply”: “2026-02-17T15:57:03.949589Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“Standard errors comparison:n”, “——————————————————-n”, “ Feature No Floor Fixed Mixturen”, “——————————————————-n”, “ 0 0.5222 0.5218 0.5222n”, “ 1 0.3974 0.3968 0.3974n”, “ 2 0.0410 0.0353 0.0410n”, “ 3 0.0230 0.0100 0.0230n”, “ 4 0.0230 0.0101 0.0230n”, “ 5 0.0230 0.0100 0.0230n”, “ 6 0.0230 0.0100 0.0230n”, “ 7 0.0230 0.0100 0.0230n”, “ 8 0.0230 0.0100 0.0230n”, “ 9 0.0230 0.0101 0.0230n”

]

}

], “source”: [

“# Without variance floorn”, “ci_no_floor = explainer.conf_int(alpha=0.05, var_floor_c=0)n”, “n”, “# With fixed variance floorn”, “ci_fixed = explainer.conf_int(alpha=0.05, var_floor_method="fixed", var_floor_c=0.1)n”, “n”, “# With mixture-based floorn”, “ci_mixture = explainer.conf_int(alpha=0.05, var_floor_method="mixture", var_floor_quantile=0.95)n”, “n”, “print("Standard errors comparison:")n”, “print("-" * 55)n”, “print(f"{‘Feature’:>8} {‘No Floor’:>12} {‘Fixed’:>12} {‘Mixture’:>12}")n”, “print("-" * 55)n”, “for i in range(n_features):n”, “ print(f"{i:>8} {ci_no_floor[‘se’][i]:>12.4f} {ci_fixed[‘se’][i]:>12.4f} {ci_mixture[‘se’][i]:>12.4f}")”

]

}, {

“cell_type”: “markdown”, “id”: “4d77b0ce”, “metadata”: {}, “source”: [

“## Practical Significance Marginn”, “n”, “Instead of testing $H_0: \phi = 0$, you can test against a practical threshold $\delta$:n”, “n”, “$$H_0: \phi \leq \delta \quad \text{vs} \quad H_1: \phi > \delta$$n”, “n”, “This identifies features that are not just statistically different from zero, but also practically meaningful.”

]

}, {

“cell_type”: “code”, “execution_count”: 8, “id”: “a6839f90”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:03.952062Z”, “iopub.status.busy”: “2026-02-17T15:57:03.951922Z”, “iopub.status.idle”: “2026-02-17T15:57:03.959663Z”, “shell.execute_reply”: “2026-02-17T15:57:03.959071Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“Testing H0: phi <= 0.5n”, “————————————————–n”, “ Feature Estimate P-value Significantn”, “————————————————–n”, “ 0 3.6412 0.0000 Yesn”, “ 1 2.6736 0.0000 Yesn”, “ 2 0.2268 0.0000 Yesn”, “ 3 0.0073 0.6333 Non”, “ 4 0.0116 0.5614 Non”, “ 5 0.0067 0.6421 Non”, “ 6 0.0037 0.6907 Non”, “ 7 0.0008 0.7327 Non”, “ 8 0.0090 0.6045 Non”, “ 9 0.0151 0.5000 Non”

]

}

], “source”: [

“# Test with practical margin of 0.5n”, “margin = 0.5n”, “ci_margin = explainer.conf_int(n”, “ alpha=0.05, n”, “ alternative="greater",n”, “ margin=marginn”, “)n”, “n”, “print(f"Testing H0: phi <= {margin}")n”, “print("-" * 50)n”, “print(f"{‘Feature’:>8} {‘Estimate’:>10} {‘P-value’:>10} {‘Significant’:>12}")n”, “print("-" * 50)n”, “for i in range(n_features):n”, “ sig = "Yes" if ci_margin["reject_null"][i] else "No"n”, “ print(f"{i:>8} {ci_margin[‘score’][i]:>10.4f} {ci_margin[‘pvalue’][i]:>10.4f} {sig:>12}")”

]

}, {

“cell_type”: “markdown”, “id”: “8e159ea1”, “metadata”: {}, “source”: [

“## Automatic Margin via Mixture Modeln”, “n”, “Use margin_method="mixture" to automatically estimate a practical margin:”

]

}, {

“cell_type”: “code”, “execution_count”: 9, “id”: “c949b1f4”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:03.961710Z”, “iopub.status.busy”: “2026-02-17T15:57:03.961569Z”, “iopub.status.idle”: “2026-02-17T15:57:03.968353Z”, “shell.execute_reply”: “2026-02-17T15:57:03.967789Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“Automatically selected margin: 0.1545n”, “Significant features: [0 1 2]n”

]

}

], “source”: [

“ci_auto_margin = explainer.conf_int(n”, “ alpha=0.05,n”, “ alternative="greater",n”, “ margin_method="mixture",n”, “ margin_quantile=0.95,n”, “)n”, “n”, “print(f"Automatically selected margin: {ci_auto_margin[‘margin’]:.4f}")n”, “print(f"Significant features: {np.where(ci_auto_margin[‘reject_null’])[0]}")”

]

}, {

“cell_type”: “markdown”, “id”: “5f318952”, “metadata”: {}, “source”: [

“## Feature Selection with Statistical Guaranteesn”, “n”, “Use the confidence intervals to select features with controlled false discovery:”

]

}, {

“cell_type”: “code”, “execution_count”: 10, “id”: “139638b5”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:03.969932Z”, “iopub.status.busy”: “2026-02-17T15:57:03.969821Z”, “iopub.status.idle”: “2026-02-17T15:57:03.984574Z”, “shell.execute_reply”: “2026-02-17T15:57:03.983834Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“Selected Features (sorted by importance):n”, “—————————————-n”, “ 1. Feature 0 (importance = 3.6412)n”, “ 2. Feature 1 (importance = 2.6736)n”, “ 3. Feature 2 (importance = 0.2268)n”, “n”, “True important features: 0, 1, 2n”, “Correctly identified: {0, 1, 2}n”

]

}

], “source”: [

“def statistical_feature_selection(explainer, X_test, alpha=0.05, margin=0.0):n”, “ """Select features with statistical significance."""n”, “ # Compute importancen”, “ results = explainer(X_test)n”, “ n”, “ # Get confidence intervalsn”, “ ci = explainer.conf_int(n”, “ alpha=alpha,n”, “ alternative="greater",n”, “ margin=margin,n”, “ var_floor_method="mixture",n”, “ )n”, “ n”, “ # Select significant featuresn”, “ selected = np.where(ci["reject_null"])[0]n”, “ n”, “ # Sort by importancen”, “ sorted_idx = np.argsort(ci["score"][selected])[::-1]n”, “ n”, “ return selected[sorted_idx], cin”, “n”, “# Run feature selectionn”, “selected_features, ci_result = statistical_feature_selection(n”, “ explainer, X_test, alpha=0.05, margin=0.0n”, “)n”, “n”, “print("Selected Features (sorted by importance):")n”, “print("-" * 40)n”, “for i, feat in enumerate(selected_features):n”, “ print(f" {i+1}. Feature {feat} (importance = {ci_result[‘score’][feat]:.4f})")n”, “n”, “print(f"\nTrue important features: 0, 1, 2")n”, “print(f"Correctly identified: {set(selected_features) & {0, 1, 2}}")”

]

}, {

“cell_type”: “markdown”, “id”: “6c94e254”, “metadata”: {}, “source”: [

“## The summary() Methodn”, “n”, “For a quick formatted view, use the built-in summary() method:”

]

}, {

“cell_type”: “code”, “execution_count”: 11, “id”: “42d7fc37”, “metadata”: {

“execution”: {

“iopub.execute_input”: “2026-02-17T15:57:03.987040Z”, “iopub.status.busy”: “2026-02-17T15:57:03.986880Z”, “iopub.status.idle”: “2026-02-17T15:57:03.994439Z”, “shell.execute_reply”: “2026-02-17T15:57:03.993724Z”

}

}, “outputs”: [

{

“name”: “stdout”, “output_type”: “stream”, “text”: [

“==============================================================================n”, “Feature Importance Resultsn”, “==============================================================================n”, “Method: OTExplainern”, “Number of features: 10n”, “Significance level: 0.05n”, “Alternative: greatern”, “Margin method: gapn”, “Practical margin: 0.0151n”, “——————————————————————————n”, “ Feature Estimate Std Err CI Lower CI Upper P-value Sign”, “——————————————————————————n”, “ 0 3.6412 0.5222 2.7822 inf 0.0000 *n”, “ 1 2.6736 0.3974 2.0199 inf 0.0000 *n”, “ 2 0.2268 0.0410 0.1594 inf 0.0000 *n”, “ 3 0.0073 0.0230 -0.0306 inf 0.6333 n”, “ 4 0.0116 0.0230 -0.0263 inf 0.5614 n”, “ 5 0.0067 0.0230 -0.0311 inf 0.6421 n”, “ 6 0.0037 0.0230 -0.0342 inf 0.6907 n”, “ 7 0.0008 0.0230 -0.0370 inf 0.7327 n”, “ 8 0.0090 0.0230 -0.0289 inf 0.6045 n”, “ 9 0.0151 0.0230 -0.0228 inf 0.5000 n”, “==============================================================================n”, “Significant features: 3 / 10n”, “—n”, “Signif. codes: 0 ‘*’ 0.01 ‘**’ 0.05 ‘*’ 0.1 ‘ ‘ 1n”, “==============================================================================n”

]

}, {

“data”: {
“text/plain”: [

“"==============================================================================\nFeature Importance Results\n==============================================================================\nMethod: OTExplainer\nNumber of features: 10\nSignificance level: 0.05\nAlternative: greater\nMargin method: gap\nPractical margin: 0.0151\n——————————————————————————\n Feature Estimate Std Err CI Lower CI Upper P-value Sig\n——————————————————————————\n 0 3.6412 0.5222 2.7822 inf 0.0000 *\n 1 2.6736 0.3974 2.0199 inf 0.0000 *\n 2 0.2268 0.0410 0.1594 inf 0.0000 *\n 3 0.0073 0.0230 -0.0306 inf 0.6333 \n 4 0.0116 0.0230 -0.0263 inf 0.5614 \n 5 0.0067 0.0230 -0.0311 inf 0.6421 \n 6 0.0037 0.0230 -0.0342 inf 0.6907 \n 7 0.0008 0.0230 -0.0370 inf 0.7327 \n 8 0.0090 0.0230 -0.0289 inf 0.6045 \n 9 0.0151 0.0230 -0.0228 inf 0.5000 \n==============================================================================\nSignificant features: 3 / 10\n—\nSignif. codes: 0 ‘*’ 0.01 ‘**’ 0.05 ‘*’ 0.1 ‘ ‘ 1\n=============================================================================="”

]

}, “execution_count”: 11, “metadata”: {}, “output_type”: “execute_result”

}

], “source”: [

“# Print formatted summaryn”, “explainer.summary(n”, “ alpha=0.05,n”, “ alternative="greater",n”, “ var_floor_method="mixture",n”, “)”

{

“cell_type”: “markdown”, “id”: “e67b2d1c”, “metadata”: {}, “source”: [

“## Multiple Testing Correctionn”, “n”, “When explaining models with many features, it is important to control the false discovery rate (FDR). You can specify a multitest_method in both conf_int() and summary():”

]

}, {

“cell_type”: “code”, “execution_count”: 12, “id”: “f8d3c5e4”, “metadata”: {}, “outputs”: [], “source”: [

“# Summary with FDR control (Benjamini-Hochberg)n”, “explainer.summary(n”, “ alpha=0.05,n”, “ alternative="greater",n”, “ multitest_method="fdr_bh"n”, “)”

]

}, {

“cell_type”: “markdown”, “id”: “b40341e9”, “metadata”: {}, “source”: [

“## Summary”

]

}

“n”, “Key takeaways:n”, “n”, “1. conf_int() provides confidence intervals and p-values for feature importancen”, “2. Use alternative="greater" for one-sided tests of positive importancen”, “3. Variance floor (var_floor_method) stabilizes inference for small effectsn”, “4. Practical margin (margin) tests against meaningful thresholdsn”, “5. Use summary() for quick formatted output”

]

}

], “metadata”: {

“kernelspec”: {

“display_name”: “Python 3”, “language”: “python”, “name”: “python3”

}, “language_info”: {

“codemirror_mode”: {

“name”: “ipython”, “version”: 3

}, “file_extension”: “.py”, “mimetype”: “text/x-python”, “name”: “python”, “nbconvert_exporter”: “python”, “pygments_lexer”: “ipython3”, “version”: “3.10.19”

}

}, “nbformat”: 4, “nbformat_minor”: 5

}