{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Using `create_missingness_prop_matrix`: A Complete Guide\n", "\n", "The `create_missingness_prop_matrix()` function creates a matrix showing the proportion of missing values for each sample–feature combination across multiple timepoints. This matrix can then be used for **sample clustering** with `cluster_on_missing_prop()` or as input to the complete CISS-VAE pipeline via `run_cissvae()`.\n", "\n", "## Overview\n", "\n", "The function returns a **n_samples × n_features** matrix where each cell contains a value between 0 and 1 representing:\n", "\n", "```\n", "proportion = (number of missing timepoints) / (total timepoints)\n", "```\n", "\n", "- **0.0** = no missing values for that sample-feature combination\n", "- **1.0** = all timepoints missing for that sample-feature combination\n", "\n", "## Data Format Support\n", "\n", "The function supports two input formats:\n", "\n", "### 1. **Wide Format** (default)\n", "Columns represent feature×timepoint combinations, rows represent samples.\n", "\n", "### 2. **Long Format** \n", "Each row represents one sample/feature/timepoint observation.\n", "\n", "---\n", "\n", "## Wide Format Examples\n", "\n", "### Example 1: Basic Wide Format with Regex Parsing" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data: \n", " sample_id glucose_t0 glucose_t1 glucose_t2 insulin_t0 insulin_t1 \\\n", "0 mouse1 100.0 110.0 NaN 5.2 NaN \n", "1 mouse2 95.0 NaN 100.0 4.8 NaN \n", "2 mouse3 NaN 105.0 115.0 5.0 5.5 \n", "\n", " insulin_t2 \n", "0 6.0 \n", "1 5.1 \n", "2 NaN \n", "\n", "\n", "Output: \n", " glucose insulin\n", "mouse1 0.333333 0.333333\n", "mouse2 0.333333 0.333333\n", "mouse3 0.333333 0.333333\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "from ciss_vae.utils.matrix import create_missingness_prop_matrix\n", "\n", "# Create sample wide-format data\n", "# Columns follow pattern: feature_timepoint\n", "data_wide = pd.DataFrame({\n", " 'sample_id': ['mouse1', 'mouse2', 'mouse3'],\n", " 'glucose_t0': [100, 95, np.nan],\n", " 'glucose_t1': [110, np.nan, 105],\n", " 'glucose_t2': [np.nan, 100, 115],\n", " 'insulin_t0': [5.2, 4.8, 5.0],\n", " 'insulin_t1': [np.nan, np.nan, 5.5],\n", " 'insulin_t2': [6.0, 5.1, np.nan]\n", "})\n", "\n", "print(f\"Data: \\n{data_wide}\\n\\n\")\n", "\n", "# Basic usage - regex automatically extracts features\n", "prop_matrix = create_missingness_prop_matrix(\n", " data_wide,\n", " index_col=\"sample_id\",\n", " repeat_feature_names = [\"glucose\", \"insulin\"],\n", " timepoint_prefix = \"t\"\n", ")\n", "\n", "print(f\"Output: \\n{prop_matrix}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 2: Custom Regex Pattern" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Output: \n", " weight height\n", "A 0.0 0.0\n", "B 0.5 0.5\n", "C 0.5 0.5\n" ] } ], "source": [ "# Data with different naming convention: feature.timepoint\n", "data_custom = pd.DataFrame({\n", " 'ID': ['A', 'B', 'C'],\n", " 'weight_day1': [25.0, np.nan, 27.0],\n", " 'weight_day7': [24.5, 26.0, np.nan],\n", " 'height_day1': [10.0, 9.5, np.nan],\n", " 'height_day7': [10.2, np.nan, 9.8]\n", "})\n", "\n", "prop_matrix = create_missingness_prop_matrix(\n", " data_custom,\n", " index_col=\"ID\",\n", " repeat_feature_names = [\"weight\", \"height\"],\n", " timepoint_prefix = \"day\"\n", ")\n", "\n", "print(f\"Output: \\n{prop_matrix}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 3: Explicit Column Mapping" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " subject baseline_glucose followup_glucose glucose_final insulin_start \\\n", "0 S1 90.0 95 NaN 4.0 \n", "1 S2 NaN 88 92.0 3.8 \n", "\n", " insulin_end \n", "0 4.5 \n", "1 NaN \n", "Output: \n", " glucose insulin\n", "S1 0.333333 0.0\n", "S2 0.333333 0.5\n" ] } ], "source": [ "data_mixed = pd.DataFrame({\n", " 'subject': ['S1', 'S2'],\n", " 'baseline_glucose': [90, np.nan],\n", " 'followup_glucose': [95, 88],\n", " 'glucose_final': [np.nan, 92],\n", " 'insulin_start': [4.0, 3.8],\n", " 'insulin_end': [4.5, np.nan]\n", "})\n", "\n", "# Explicitly map columns to features\n", "column_mapping = {\n", " \"glucose\": [\"baseline_glucose\", \"followup_glucose\", \"glucose_final\" ],\n", " \"insulin\": [\"insulin_start\", \"insulin_end\"]\n", "}\n", "\n", "print(data_mixed)\n", "\n", "prop_matrix = create_missingness_prop_matrix(\n", " data = data_mixed,\n", " index_col=\"subject\",\n", " column_mapping=column_mapping\n", ")\n", "\n", "print(f\"Output: \\n{prop_matrix}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Integration with sample clustering " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " sample_id glucose_t0 glucose_t1 glucose_t2 insulin_t0 insulin_t1 \\\n", "0 mouse1 100.0 110.0 115 5.2 NaN \n", "1 mouse2 95.0 NaN 100 4.8 NaN \n", "2 mouse3 NaN 105.0 107 NaN 5.5 \n", "3 mouse4 102.0 108.0 118 NaN 5.3 \n", "4 mouse5 98.0 NaN 112 5.1 5.4 \n", "\n", " insulin_t2 \n", "0 6.0 \n", "1 5.1 \n", "2 NaN \n", "3 NaN \n", "4 NaN \n", " glucose_t0 glucose_t1 glucose_t2 insulin_t0 insulin_t1 insulin_t2\n", "mouse1 0.0 0.0 0.0 0.0 1.0 0.0\n", "mouse2 0.0 1.0 0.0 0.0 1.0 0.0\n", "mouse3 1.0 0.0 0.0 1.0 0.0 1.0\n", "mouse4 0.0 0.0 0.0 1.0 0.0 1.0\n", "mouse5 0.0 1.0 0.0 0.0 0.0 1.0\n", "Clusters: [1 1 0 0 1]\n", "Silhouette score: 0.4639966826516685\n" ] } ], "source": [ "from ciss_vae.utils.clustering import cluster_on_missing_prop\n", "\n", "data_wide = pd.DataFrame({\n", " 'sample_id': ['mouse1', 'mouse2', 'mouse3', 'mouse4', 'mouse5'],\n", " 'glucose_t0': [100, 95, np.nan, 102, 98 ],\n", " 'glucose_t1': [110, np.nan, 105, 108, np.nan ],\n", " 'glucose_t2': [115, 100, 107, 118, 112 ],\n", " 'insulin_t0': [5.2, 4.8, np.nan, np.nan, 5.1 ],\n", " 'insulin_t1': [np.nan, np.nan, 5.5, 5.3, 5.4 ],\n", " 'insulin_t2': [6.0, 5.1, np.nan, np.nan, np.nan ],\n", "})\n", "\n", "print(data_wide)\n", "\n", "# Create missingness proportion matrix\n", "prop_matrix = create_missingness_prop_matrix(\n", " data_wide, \n", " index_col=\"sample_id\"\n", ")\n", "\n", "print(prop_matrix)\n", "\n", "# Cluster samples based on similar missingness patterns across features\n", "clusters, silhouette = cluster_on_missing_prop(\n", " prop_matrix,\n", " n_clusters=2,\n", " metric=\"cosine\",\n", " scale_features=True\n", ")\n", "\n", "print(\"Clusters:\", clusters)\n", "print(\"Silhouette score:\", silhouette)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Integration w/ CISS-VAE pipeline\n", "The proportion matrix can be used directly in the complete CISS-VAE pipeline via the `missingness_proportion_matrix` parameter:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Warning] 3 feature(s) had zero std after masking. Replaced with 1.0 to avoid div-by-zero. Features: ['glucose_t1', 'insulin_t1', 'insulin_t2']\n", "Cluster dataset:\n", " ClusterDataset(n_samples=5, n_features=6, n_clusters=2)\n", " • Original missing: 10 / 30 (33.33%)\n", " • Validation held-out: 10 (50.00% of non-missing)\n", " • .data shape: (5, 6)\n", " • .masks shape: (5, 6)\n", " • .val_data shape: (5, 6)\n", " • Validation units: {'glucose_t0': {'kind': 'continuous', 'cols': ['glucose_t0']}, 'glucose_t1': {'kind': 'continuous', 'cols': ['glucose_t1']}, 'glucose_t2': {'kind': 'continuous', 'cols': ['glucose_t2']}, 'insulin_t0': {'kind': 'continuous', 'cols': ['insulin_t0']}, 'insulin_t1': {'kind': 'continuous', 'cols': ['insulin_t1']}, 'insulin_t2': {'kind': 'continuous', 'cols': ['insulin_t2']}}\n" ] }, { "data": { "image/png": "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kFD1a9Gihbzzzjs6SfFfc3T8+++/eigCNSyBeq66kw8AAACOEyOPGjVK5syZI1u3btW9NCy++uormT9//jXFloraP3bsWOnUqZOOe9WQV1WqVNHbX3zxxUXHr1+/Xu677z5dFxX7qnOom5FU/HvkyJFCz6Hq3qtXLylfvrxe1HtTiZr/omLbd999V8f9Kt5VdQsJCdHD1G7fvv0/5+g4ffq0/h2g4nNXV1cZP378f54TAOCEcgEA+A+LFi3KVf9lWJYJEyZc9vgDBw5YHd+hQwerbcty3XXX5aanp1s997vvvsv18PAo9Hi1fPzxx8axKSkpuTfccMMlj7WcOzk52eocL774YqHHhoeH51auXNnYfv31162eN27cuFw3N7dLnqthw4a5x48ft3pOzZo1jcfbtm2b6+rqavWchIQE2h8AAICDxshr1qyxOqZbt27XFFvu27dPx9CXek6zZs2sjlexs4uLyyWP9/Pz0++joLVr1+b6+PhcdKyXl1duly5djG0V5xa0Z8+e3Fq1al3yXJ6enrm//vqr1XNUvG15vGLFirn169e/ZOwPAIAFw08BAK6ausMsLi6u0C73wcHBF+1XvRNatWolt9xyiyxatEiWL1+u9+/du1dmzZqle2Aoq1atkscee8wYb9jNzU336Khfv76+i+zCO9uefvppWbp0qbHdrVs3adu2rX4d1d3fcm51nOrNoaxdu1bee+894znqrjZ151pKSoq+EywzM7PQ97xixQoZOnSoUbc2bdroO9ZU744ffvhBfx47duzQrxUVFVXoa6xcuVL3OrnnnnukevXqsnHjRn0HGgAAAByTioGbNWume2QoKnZVPY1Xr1591bGlet5tt92mY+iCr696LFtes2AvYHWu5557Tt3MqrdVj4lBgwbpuHfChAmSlpamh8q64447JDo6WvemVseqniPqGEX1oBg8eLDuRTF9+nQ9T0hh1Plvv/123WNbCQoK0s8LDAzUcbmKpVWcrd5Py5YtdS/sC6n3rBbVq7l9+/Zy6tQpqVy5cjH+NQAADsNIbwAAcIV3oV1qsdzldWFPjYiIiNysrCz9mFpXqlTJeOy5554zztOvXz9jv7qjbOnSpVb1yMzMzI2JidHluLg4q14PAwYMsDpWbVseU8ep45XHH3/cav/u3buN50yaNMmq3gV7atx+++3G/s6dO+dmZ2df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DQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIApCDQAAAAAAIMTgvwFVWNPmBeiXGQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from ciss_vae.training.run_cissvae import run_cissvae\n", "from ciss_vae.utils.helpers import plot_vae_architecture\n", "\n", "prop_matrix = create_missingness_prop_matrix(\n", " data_wide,\n", " index_col=\"sample_id\"\n", ")\n", "\n", "imputed_data, model = run_cissvae(\n", " data=data_wide.drop('sample_id', axis=1),\n", " missingness_proportion_matrix=prop_matrix, # Use custom matrix\n", " n_clusters=2,\n", " scale_features=True, # Scale the proportion matrix features\n", " verbose=False,\n", " epochs = 50\n", ")\n", "\n", "plot_vae_architecture(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Full workflow\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Missingness Proportion Matrix: \n", " glucose hba1c\n", "P001 0.25 0.25\n", "P002 0.50 0.25\n", "P003 0.50 0.25\n", "P004 0.00 0.50\n", "P005 0.00 0.25\n", "Cluster dataset:\n", " ClusterDataset(n_samples=100, n_features=8, n_clusters=2)\n", " • Original missing: 169 / 800 (21.12%)\n", " • Validation held-out: 56 (8.87% of non-missing)\n", " • .data shape: (100, 8)\n", " • .masks shape: (100, 8)\n", " • .val_data shape: (100, 8)\n", " • Validation units: {'glucose_baseline': {'kind': 'continuous', 'cols': ['glucose_baseline']}, 'glucose_month1': {'kind': 'continuous', 'cols': ['glucose_month1']}, 'glucose_month3': {'kind': 'continuous', 'cols': ['glucose_month3']}, 'glucose_month6': {'kind': 'continuous', 'cols': ['glucose_month6']}, 'hba1c_baseline': {'kind': 'continuous', 'cols': ['hba1c_baseline']}, 'hba1c_month1': {'kind': 'continuous', 'cols': ['hba1c_month1']}, 'hba1c_month3': {'kind': 'continuous', 'cols': ['hba1c_month3']}, 'hba1c_month6': {'kind': 'continuous', 'cols': ['hba1c_month6']}}\n", "\n", "Original Data: \n", " glucose_baseline glucose_month1 glucose_month3 glucose_month6 \\\n", "0 99.967142 92.156023 NaN 87.339202 \n", "1 93.617357 NaN 78.972177 NaN \n", "2 101.476885 NaN NaN 81.481639 \n", "3 110.230299 124.642030 86.824755 88.473987 \n", "4 92.658466 99.508008 93.549904 79.395866 \n", "\n", " hba1c_baseline hba1c_month1 hba1c_month3 hba1c_month6 \n", "0 NaN 5.859505 6.079557 5.634611 \n", "1 6.819309 7.239745 NaN 5.757494 \n", "2 6.469892 NaN 6.534880 5.492823 \n", "3 NaN 7.962037 NaN 5.189670 \n", "4 6.591382 6.825535 NaN 5.445506 \n", "\n", "Imputed Data:\n", " glucose_baseline glucose_month1 glucose_month3 glucose_month6 \\\n", "0 99.967140 92.156021 97.108841 87.339203 \n", "1 93.617355 107.307274 78.972176 92.720222 \n", "2 101.476883 82.597275 98.518005 81.481636 \n", "3 110.230301 124.642029 86.824753 88.473984 \n", "4 92.658463 99.508011 93.549904 79.395866 \n", "\n", " hba1c_baseline hba1c_month1 hba1c_month3 hba1c_month6 \n", "0 6.375147 5.859505 6.079557 5.634611 \n", "1 6.819309 7.239745 6.351654 5.757494 \n", "2 6.469892 6.724995 6.534880 5.492823 \n", "3 8.114622 7.962037 7.808603 5.189670 \n", "4 6.591382 6.825535 4.805406 5.445506 \n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "from ciss_vae.utils.matrix import create_missingness_prop_matrix\n", "from ciss_vae.utils.clustering import cluster_on_missing_prop\n", "from ciss_vae.training.run_cissvae import run_cissvae\n", "\n", "# 1. Create longitudinal data with complex missingness patterns\n", "np.random.seed(42)\n", "data = pd.DataFrame({\n", " 'patient_id': [f'P{i:03d}' for i in range(1, 101)],\n", " # Glucose measurements - some patients miss early timepoints\n", " 'glucose_baseline': np.random.normal(95, 10, 100),\n", " 'glucose_month1': np.where(np.random.random(100) < 0.3, np.nan, np.random.normal(92, 12, 100)),\n", " 'glucose_month3': np.where(np.random.random(100) < 0.2, np.nan, np.random.normal(90, 11, 100)),\n", " 'glucose_month6': np.where(np.random.random(100) < 0.1, np.nan, np.random.normal(88, 10, 100)),\n", " # HbA1c - different missingness pattern\n", " 'hba1c_baseline': np.where(np.random.random(100) < 0.1, np.nan, np.random.normal(6.5, 0.8, 100)),\n", " 'hba1c_month1': np.where(np.random.random(100) < 0.4, np.nan, np.random.normal(6.3, 0.9, 100)),\n", " 'hba1c_month3': np.where(np.random.random(100) < 0.3, np.nan, np.random.normal(6.1, 0.8, 100)),\n", " 'hba1c_month6': np.where(np.random.random(100) < 0.2, np.nan, np.random.normal(5.9, 0.7, 100)),\n", "})\n", "\n", "# 2. Create missingness proportion matrix\n", "prop_matrix = create_missingness_prop_matrix(\n", " data,\n", " index_col = \"patient_id\",\n", " repeat_feature_names = [\"glucose\", \"hba1c\"],\n", " nonint_timepoint=True\n", ")\n", "\n", "print(f\"Missingness Proportion Matrix: \\n{prop_matrix.head()}\")\n", "\n", "# 3. Run complete CISS-VAE pipeline\n", "main_data = data.drop('patient_id', axis=1)\n", "\n", "imputed_data, model, history = run_cissvae(\n", " data=main_data,\n", " missingness_proportion_matrix=prop_matrix,\n", " n_clusters=2,\n", " scale_features=True,\n", " epochs=100,\n", " verbose=False,\n", " return_history=True\n", ")\n", "\n", "print(f\"\\nOriginal Data: \\n{main_data.head()} \\n\\nImputed Data:\\n{imputed_data.head()}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extra tips\n", "\n", "1. **Sample Clustering**: `cluster_on_missing_prop` clusters **samples (rows)** based on their missingness profiles across features. This groups subjects with similar patterns of missing data.\n", "2. **Data format**: Provide the input as a matrix or DataFrame with **rows = samples** and **columns = features**. The data must be in **wide** format.\n", "3. **Scaling**: Use `scale_features=True` if features differ greatly in their overall missingness rates. This standardizes the columns so no single feature dominates the clustering." ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 2 }