From 6d7324214f83227fe94636fce3f1634ff6367974 Mon Sep 17 00:00:00 2001 From: juaristi22 Date: Fri, 27 Feb 2026 12:30:03 +0530 Subject: [PATCH 1/5] paper review --- paper/main.pdf | Bin 547662 -> 543392 bytes paper/sections/abstract.tex | 2 +- paper/sections/appendix_benchmarking.tex | 2 +- paper/sections/appendix_robustness.tex | 2 +- paper/sections/background.tex | 16 ++++---- paper/sections/conclusion.tex | 6 +-- paper/sections/data.tex | 6 +-- paper/sections/discussion.tex | 48 ++++++++--------------- paper/sections/introduction.tex | 16 ++++---- paper/sections/methodology.tex | 26 ++++++------ paper/sections/results.tex | 18 ++++----- 11 files changed, 64 insertions(+), 78 deletions(-) diff --git a/paper/main.pdf b/paper/main.pdf index e4042bc0d1444cfe32af2f7d9ce52f44b52d48ee..daeda5ed18b7a8b59e63d6e6d095536603be5529 100644 GIT binary patch delta 124108 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 diff --git a/paper/sections/abstract.tex b/paper/sections/abstract.tex index dd447ee..4dcb08e 100644 --- a/paper/sections/abstract.tex +++ b/paper/sections/abstract.tex @@ -1,3 +1,3 @@ \section*{Abstract} -Microdata surveys often lack variables critical for policy analysis, requiring imputation from richer donor surveys, yet researchers have lacked standardized tools for systematically comparing imputation methods and selecting the best approach for a given dataset. We introduce $\texttt{microimpute}$, an open-source Python package that provides a unified framework for benchmarking, tuning, and automatically selecting among multiple imputation methods. We apply it to impute U.S. household wealth from the Survey of Consumer Finances (SCF) onto the Current Population Survey (CPS). Evaluating five methods---Quantile Random Forests (QRF), Ordinary Least Square (OLS), Quantile Regression, Hot Deck Matching, and Mixture Density Networks, we find that QRF achieves the lowest quantile loss and Wasserstein distance, reflecting its capacity to model the non-linear relationships between demographic predictors and wealth. A simulation of the Supplemental Security Income Savings Penalty Elimination Act demonstrates the practical stakes of method choice for downstream analysis. Without imputed wealth, the microsimulation overestimates SSI recipients by 167\%, and the SSI policy reform would be entirely un-simulable. Cross-dataset benchmarking across six additional domains reveals, however, that no single method dominates universally. Although QRF proves best at capturing complex, non-linear relationships, Hot Deck Matching better preserves marginal distributions by drawing directly from the donor pool, while OLS remains competitive for approximately linear relationships. These findings underscore that imputation method selection should be empirically driven rather than prescribed, motivating standardized benchmarking tools, like $\texttt{microimpute}$, that enable researchers to identify the best approach for their specific data characteristics and research objectives. \ No newline at end of file +Microdata surveys often lack variables needed for policy analysis, requiring imputation from richer donor surveys, yet no standardized tools exist for comparing imputation methods and selecting the best approach for a given dataset. We introduce $\texttt{microimpute}$, an open-source Python package for benchmarking, tuning, and automatically selecting among multiple imputation methods. We apply it to impute U.S. household wealth from the Survey of Consumer Finances (SCF) onto the Current Population Survey (CPS). Evaluating five methods (Quantile Random Forests, Ordinary Least Squares, Quantile Regression, Hot Deck Matching, and Mixture Density Networks) through a 5-fold cross-validation, we find that QRF reduces average quantile loss by 76\% relative to the worst-performing method and by 7\% relative to the next-best method (Hot Deck Matching), owing to its ability to model non-linear relationships between demographic predictors and wealth. Its Wasserstein distance to the donor distribution is 24\% lower than Matching's. A simulation of the Supplemental Security Income Savings Penalty Elimination Act shows what is at stake: without imputed wealth, the microsimulation overestimates SSI recipients by 167\%, and the reform is entirely un-simulable. Cross-dataset benchmarking across six additional domains, however, revealsthat no single method dominates universally. QRF performs best when relationships are non-linear, Hot Deck Matching better preserves marginal distributions by drawing directly from the donor pool, and OLS remains competitive when relationships are approximately linear. Imputation method selection should therefore be empirically driven rather than prescribed, which motivates tools like $\texttt{microimpute}$ for systematic comparison. \ No newline at end of file diff --git a/paper/sections/appendix_benchmarking.tex b/paper/sections/appendix_benchmarking.tex index 3f23738..d546fae 100644 --- a/paper/sections/appendix_benchmarking.tex +++ b/paper/sections/appendix_benchmarking.tex @@ -73,4 +73,4 @@ \subsection{Results} Matching achieves the best Wasserstein distance on four of six datasets and the lowest mean rank overall (1.67), followed closely by QRF (1.83). QRF performs best on space\_ga and brazilian\_houses, the latter of which exhibits complex nonlinear relationships between predictors and house prices. OLS and Quantile Regression occupy middle ranks, while MDN consistently ranks last, likely reflecting a combination of the relatively small sample sizes in these datasets and the hyperparameter sensitivity of neural network-based approaches. -With only six datasets, the rank differences between methods---particularly the narrow gap between Matching (1.67) and QRF (1.83)---should be interpreted cautiously, as they are not statistically robust to the inclusion or exclusion of individual datasets. Notably, the relative rankings here differ from the main SCF-CPS analysis, where QRF achieves the lowest quantile loss. This is consistent with the expectation that method performance depends on dataset characteristics, and reinforces the value of \texttt{microimpute}'s method comparison framework, which allows researchers to empirically determine the best approach for their specific data rather than relying on a single method. +With only six datasets, the rank differences between methods, particularly the narrow gap between Matching (1.67) and QRF (1.83), should be interpreted cautiously; they are not statistically robust to the inclusion or exclusion of individual datasets. The relative rankings here also differ from the main SCF-CPS analysis, where QRF achieves the lowest quantile loss. This is consistent with the expectation that method performance depends on dataset characteristics, and it supports the case for empirically comparing methods on each new dataset rather than relying on a single approach. diff --git a/paper/sections/appendix_robustness.tex b/paper/sections/appendix_robustness.tex index f143f0e..fb840e0 100644 --- a/paper/sections/appendix_robustness.tex +++ b/paper/sections/appendix_robustness.tex @@ -54,4 +54,4 @@ \subsection{Progressive inclusion analysis} \subsection{Implications for the Conditional Independence Assumption} -The strong predictive power of the shared financial variables, particularly interest and dividend income, employment income, and pension income, is consistent with, though not sufficient evidence for, the plausibility of the CIA in the SCF-CPS matching context. These variables capture key dimensions of household financial position that are available in both surveys. The fact that they collectively explain a large share of the variation in net worth suggests that the common variables $X$ may be sufficient to render the target variable $Y$ (wealth) approximately conditionally independent of variables $Z$ unique to the CPS, though this assumption remains fundamentally untestable as discussed in Section~2.2. +The strong predictive power of the shared financial variables, particularly interest and dividend income, employment income, and pension income, is consistent with, though not sufficient evidence for, the plausibility of the CIA in the SCF-CPS matching context. These variables capture the main dimensions of household financial position available in both surveys. The fact that they collectively explain a large share of the variation in net worth suggests that the common variables $X$ may be sufficient to render the target variable $Y$ (wealth) approximately conditionally independent of variables $Z$ unique to the CPS, though this assumption remains fundamentally untestable as discussed in Section~2.2. diff --git a/paper/sections/background.tex b/paper/sections/background.tex index 73b77fd..ef7cbe0 100644 --- a/paper/sections/background.tex +++ b/paper/sections/background.tex @@ -1,6 +1,6 @@ \section{Background} -This section establishes the theoretical foundations for statistical matching and reviews the imputation methods implemented in \texttt{microimpute}. We begin with the formal problem definition and the key assumption underlying all statistical matching procedures, then discuss the relationship to missing data mechanisms, and finally describe each of the five imputation methods. +This section defines the statistical matching problem and describes the imputation methods in \texttt{microimpute}. We begin with the formal problem definition and the assumption underlying all statistical matching procedures, then discuss the relationship to missing data mechanisms, and finally describe each of the five imputation methods. \subsection{The Statistical Matching Problem} @@ -56,7 +56,7 @@ \subsection{Imputation Methods} \subsubsection{Hot Deck Matching} -Hot deck imputation replaces missing values in a receiver record with observed values from ``similar'' donor records \citep{andridge2010review}. The \texttt{microimpute} implementation uses the unconstrained distance hot deck approach from the StatMatch R package \citep{dorazio2021statistical}. To identify the best match, the method computes distances between each receiver observation and all donor observations based on the common variables $X$, selects donor records within a specified distance threshold, and randomly samples from the eligible donors, with optional weighting by survey weights. For continuous and mixed covariates, Mahalanobis or Gower distance metrics can capture similarity across different variable types. The donated value will thus be an actual observed value from the donor file, ensuring plausibility. +Hot deck imputation replaces missing values in a receiver record with observed values from ``similar'' donor records \citep{andridge2010review}. The \texttt{microimpute} implementation uses the unconstrained distance hot deck approach from the StatMatch R package \citep{dorazio2021statistical}. To identify the best match, the method computes distances between each receiver observation and all donor observations based on the common variables $X$, selects donor records within a specified distance threshold, and randomly samples from the eligible donors, with optional weighting by survey weights. For continuous and mixed covariates, Mahalanobis or Gower distance metrics can capture similarity across different variable types. The donated value is therefore always an actual observed value from the donor file. Hot deck methods are nonparametric and avoid distributional assumptions, making them robust when the true conditional distribution is unknown or complex \citep{dorazio2006statistical}. However, they face limitations: \begin{itemize} @@ -186,18 +186,18 @@ \subsection{Current Practice in Microsimulation} Statistical matching and data fusion are fundamental operations in microsimulation modeling, yet the methods employed in practice have remained relatively unchanged for decades. A review of major tax-benefit microsimulation models reveals a strong reliance on traditional imputation approaches, primarily hot deck matching and OLS-based regression. -Hot deck matching remains the dominant approach in European microsimulation. EUROMOD, the EU-wide tax-benefit model, employs a multi-stage imputation procedure combining predictive mean matching with distance-based hot deck methods to integrate consumption data from Household Budget Surveys into its EU-SILC input data \citep{sutherland2013euromod}. The appeal of hot deck methods lies in their simplicity and the guarantee that imputed values are observed values from the donor file, ensuring plausibility. However, as discussed above, these methods struggle with tail behavior and may not adequately capture the full conditional distribution of the target variable. +Hot deck matching remains the dominant approach in European microsimulation. EUROMOD, the EU-wide tax-benefit model, employs a multi-stage imputation procedure combining predictive mean matching with distance-based hot deck methods to integrate consumption data from Household Budget Surveys into its EU-SILC input data \citep{sutherland2013euromod}. Hot deck methods are simple to implement and guarantee that imputed values are actual observed values from the donor file. However, as discussed above, these methods struggle with tail behavior and may not adequately capture the full conditional distribution of the target variable. -In U.S. tax policy microsimulation, regression-based approaches are more common. The Tax Policy Center employs a two-stage probit and OLS procedure for wealth imputation, first predicting the probability of holding each asset type, then predicting amounts conditional on positive holdings \citep{nunns2012tax}. Similarly, the Institute on Taxation and Economic Policy (ITEP) model relies on statistical matching between tax return data and the American Community Survey, supplemented with regression-based imputations from the Survey of Consumer Finances \citep{itep2023model}. These regression approaches assume linear relationships and normally distributed errors; assumptions that are frequently violated by economic variables with heavy tails and heteroscedastic relationships. +In U.S. tax policy microsimulation, regression-based approaches are more common. The Tax Policy Center employs a two-stage probit and OLS procedure for wealth imputation, first predicting the probability of holding each asset type, then predicting amounts conditional on positive holdings \citep{nunns2012tax}. Similarly, the Institute on Taxation and Economic Policy (ITEP) model relies on statistical matching between tax return data and the American Community Survey, supplemented with regression-based imputations from the Survey of Consumer Finances \citep{itep2023model}. These regression approaches assume linear relationships and normally distributed errors, assumptions frequently violated by economic variables with heavy tails and heteroscedasticity. -More recent microsimulation efforts have begun incorporating administrative data through record linkage rather than statistical matching \citep{abowd2019census}, but this approach requires access to restricted data and raises privacy concerns. For researchers working with publicly available survey data, statistical matching remains essential, creating a need for methods that can better capture complex distributional features. +More recent microsimulation efforts have begun incorporating administrative data through record linkage rather than statistical matching \citep{abowd2019census}, but this approach requires access to restricted data and raises privacy concerns. For researchers working with publicly available survey data, statistical matching remains the primary option, and there is room for methods that capture distributional features more effectively. -The limitations of traditional approaches can be particularly acute for heavily-tailed variables where relationships with predictors vary across the distribution. Machine learning methods such as Quantile Random Forests offer a promising alternative, as they can capture nonlinear relationships, model the entire conditional distribution, and handle heavy-tailed data without restrictive parametric assumptions. Despite these advantages, QRF and similar methods have seen limited adoption in mainstream microsimulation practice. The \texttt{microimpute} package aims to lower barriers to adopting these more flexible methods by providing a unified framework for comparing traditional and machine learning approaches, enabling researchers to empirically evaluate which method best suits their specific data characteristics. +These limitations are especially pronounced for heavy-tailed variables where the relationship with predictors varies across the distribution. Machine learning methods such as Quantile Random Forests can capture nonlinear relationships, model the entire conditional distribution, and handle heavy-tailed data without restrictive parametric assumptions, yet they have seen limited adoption in microsimulation practice. The \texttt{microimpute} package provides a common framework for comparing traditional and machine learning approaches, so that researchers can empirically evaluate which method works best for their data. \subsection{Supplemental Security Income as a Validation Case} -The limitations of traditional imputation approaches in microsimulation have concrete consequences on downstream policy analysis. The impact of wealth imputation quality for U.S. households can be illustrated through the Supplemental Security Income (SSI) program. SSI is a federal means-tested program for aged, blind, and disabled individuals with strict resource limits (\$2,000 for individuals, \$3,000 for couples) that have remained unchanged since 1989 \citep{ssa2023ssi}. The resource test requires household wealth and asset data that the CPS does not collect, making SSI eligibility determination dependent on imputed or heuristic wealth values. +The limitations of traditional imputation approaches have concrete consequences for downstream policy analysis. The Supplemental Security Income (SSI) program illustrates this well. SSI is a federal means-tested program for aged, blind, and disabled individuals with strict resource limits (\$2,000 for individuals, \$3,000 for couples) that have remained unchanged since 1989 \citep{ssa2023ssi}. The resource test requires household wealth and asset data that the CPS does not collect, making SSI eligibility determination dependent on imputed or heuristic wealth values. In 2024, SSI served approximately 7.4 million recipients with \$59.6 billion in federal payments \citep{ssa2024ssi}. Because different wealth imputation methods produce different wealth distributions, they directly affect which simulated households pass the resource test and therefore the resulting estimates of SSI recipient counts and expenditure. This makes SSI a particularly informative case for comparing imputation approaches, as described in Section~\ref{sec:policy_validation}. -The frozen resource limits also make SSI a compelling case for policy reform analysis. In 2024 dollars, the original 1989 thresholds of \$2,000/\$3,000 are worth approximately \$4,800/\$7,200, meaning the resource test has become substantially more restrictive over time without any legislative change. The SSI Savings Penalty Elimination Act (S.~1234 / H.R.~2540), a bipartisan bill introduced in April 2025, proposes raising these limits to \$10,000 for individuals and \$20,000 for couples, with future CPI indexing \citep{ssi_spea_2025}. Simulating the impact of this reform, and determining which additional households would gain eligibility under the higher thresholds requires household-level wealth data, making it a natural application for cross-survey imputation. As we demonstrate in Section~\ref{sec:policy_validation}, the choice of imputation method produces meaningfully different estimates of this reform's impact, underscoring that imputation is not merely a data preprocessing step but a consequential modeling choice for policy analysis. +The frozen resource limits also make SSI a compelling case for policy reform analysis. In 2024 dollars, the original 1989 thresholds of \$2,000/\$3,000 are worth approximately \$4,800/\$7,200, meaning the resource test has become substantially more restrictive over time without any legislative change. The SSI Savings Penalty Elimination Act (S.~1234 / H.R.~2540), a bipartisan bill introduced in April 2025, proposes raising these limits to \$10,000 for individuals and \$20,000 for couples, with future CPI indexing \citep{ssi_spea_2025}. Simulating the impact of this reform, and determining which additional households would gain eligibility under the higher thresholds requires household-level wealth data, making it a natural application for cross-survey imputation. As we show in Section~\ref{sec:policy_validation}, the choice of imputation method produces meaningfully different estimates of this reform's impact, meaning that imputation is not merely a data preprocessing step but a modeling choice with real consequences for policy analysis. diff --git a/paper/sections/conclusion.tex b/paper/sections/conclusion.tex index 3d9a412..362be7b 100644 --- a/paper/sections/conclusion.tex +++ b/paper/sections/conclusion.tex @@ -1,7 +1,7 @@ \section{Conclusion} -This paper has introduced $\texttt{microimpute}$, an open-source Python package for cross-survey imputation, and applied it to a substantive policy problem: imputing household wealth from the SCF onto the CPS. Through systematic comparison of five imputation methods using an inverse hyperbolic sine transformation to accommodate negative and zero net worth values, we find that Quantile Random Forests achieve the strongest conditional accuracy among the five methods evaluated for wealth imputation, driven by their capacity to model the complex non-linear relationships between demographic predictors and wealth. A downstream SSI simulation validates the practical importance of imputation method choice: without wealth data, the microsimulation overestimates SSI recipients by 167\%, while imputation-based approaches substantially narrow this gap. Simulating the SSI Savings Penalty Elimination Act, which would raise resource limits from \$2,000/\$3,000 to \$10,000/\$20,000, further demonstrates that method choice directly affects policy estimates. Reform impact estimates range from 0.1 to 4.2 million additional recipients and \$1.0 to \$24.1 billion in additional expenditure depending on the imputation method. Without imputed wealth, this reform is entirely un-simulable. +This paper has introduced $\texttt{microimpute}$, an open-source Python package for cross-survey imputation, and applied it to a substantive policy problem: imputing household wealth from the SCF onto the CPS. Comparing five imputation methods with an inverse hyperbolic sine transformation to accommodate negative and zero net worth values, we find that Quantile Random Forests achieve the strongest conditional accuracy for wealth imputation, owing to their ability to model the non-linear relationships between demographic predictors and wealth. A downstream SSI simulation confirms the practical importance of method choice. Without wealth data, the microsimulation overestimates SSI recipients by 167\%, while imputation-based approaches substantially narrow this gap. Simulating the SSI Savings Penalty Elimination Act, which would raise resource limits from \$2,000/\$3,000 to \$10,000/\$20,000, further shows that method choice directly affects policy estimates. Reform impact estimates range from 0.1 to 4.2 million additional recipients and \$1.0 to \$24.1 billion in additional expenditure depending on the imputation method. Without imputed wealth, this reform cannot be simulated at all. -Our findings also reveal important nuances about method selection. Cross-dataset benchmarking shows that QRF's advantage reflects the specific characteristics of the wealth imputation problem rather than a universal superiority, and predictor importance analysis confirms that financial variables drive the majority of imputation accuracy. +The findings also reveal nuances about method selection. Cross-dataset benchmarking shows that QRF's advantage reflects the specific characteristics of the wealth imputation problem rather than a universal superiority, and predictor importance analysis confirms that financial variables drive the majority of imputation accuracy. -These results carry two broader implications. First, imputation method selection should be empirically driven rather than prescribed; the optimal approach depends on dataset characteristics, and standardized comparison tools are essential for enabling this data-driven selection. Second, the gap between statistical and policy-relevant evaluation metrics---QRF achieves the best quantile loss yet not the closest SSI estimates to administrative totals---highlights the importance of validating imputation quality through downstream applications, not only through statistical benchmarks. Future work should expand $\texttt{microimpute}$'s method library to include gradient boosting and deep learning approaches \citep{alaa2024deep}, explore ensemble strategies that combine methods across different parts of the distribution, and address the terminal node sparsity challenge that limits tree-based methods at extreme quantiles. \ No newline at end of file +Two broader implications follow. First, imputation method selection should be empirically driven rather than prescribed; the optimal approach depends on dataset characteristics, and standardized comparison tools are needed to support this. Second, the gap between statistical and policy-relevant evaluation metrics (QRF achieves the best quantile loss yet not the closest SSI estimates to administrative totals) points to the importance of validating imputation quality through downstream applications, not only through statistical benchmarks. Future work should expand $\texttt{microimpute}$'s method library to include gradient boosting and deep learning approaches \citep{alaa2024deep}, explore ensemble strategies that combine methods across different parts of the distribution, and address the terminal node sparsity problem that limits tree-based methods at extreme quantiles. \ No newline at end of file diff --git a/paper/sections/data.tex b/paper/sections/data.tex index de0f564..d51902a 100644 --- a/paper/sections/data.tex +++ b/paper/sections/data.tex @@ -4,16 +4,16 @@ \section{Data}\label{sec:data} \subsection{Survey of Consumer Finances} -The Survey of Consumer Finances, sponsored by the Federal Reserve Board, is a triennial survey providing detailed information on U.S. households' assets, liabilities, income, and demographic characteristics. Its dual-frame sample design includes a standard national area-probability sample and a list sample deliberately oversampling wealthy households to better capture the skewed wealth distribution \citep{barcelo2006imputation}. The SCF is a benchmark for wealth imputation research due to its detailed financial data and the known complexities arising from its design and the nature of wealth. Item nonresponse in public-use SCF datasets is addressed by the Federal Reserve through a multiple imputation approach that generates five complete datasets with different imputed values, using sequential regression-based procedures that incorporate range constraints, logical data structures, and empirical residuals to preserve the complex multivariate relationships inherent in wealth data \citep{kennickell1998multiple}. +The Survey of Consumer Finances, sponsored by the Federal Reserve Board, is a triennial survey providing detailed information on U.S. households' assets, liabilities, income, and demographic characteristics. Its dual-frame sample design includes a standard national area-probability sample and a list sample that deliberately oversamples wealthy households to better capture the skewed wealth distribution \citep{barcelo2006imputation}. The SCF is a standard reference for wealth imputation research because of its detailed financial data and the known complexities arising from its design and the nature of wealth. Item nonresponse in public-use SCF datasets is addressed by the Federal Reserve through a multiple imputation approach that generates five complete datasets with different imputed values, using sequential regression-based procedures that incorporate range constraints, logical data structures, and empirical residuals to preserve the complex multivariate relationships inherent in wealth data \citep{kennickell1998multiple}. Specifically, we use the 2022 summarized SCF as our donor dataset. \subsection{Current Population Survey} -The Current Population Survey, conducted jointly by the U.S. Census Bureau and the Bureau of Labor Statistics, is a monthly survey of approximately 60,000 U.S. households that serves as the primary source of labor force statistics for the United States. The CPS uses a multistage probability-based sample designed to represent the civilian non-institutional population; on average, each sampled household represents approximately 2,500 households in the population. The Annual Social and Economic Supplement (ASEC) extends the core survey with detailed annual income data, including earnings, unemployment compensation, Social Security, pension income, interest, dividends, and other income sources. However, despite its comprehensive coverage of income and employment, the CPS does not collect information on household wealth, assets, or liabilities, which are key variables needed for wealth-based policy analysis. This omission motivates the need for statistical matching to transfer wealth information from the SCF onto the CPS. +The Current Population Survey, conducted jointly by the U.S. Census Bureau and the Bureau of Labor Statistics, is a monthly survey of approximately 60,000 U.S. households and is the primary source of labor force statistics for the United States. The CPS uses a multistage probability-based sample designed to represent the civilian non-institutional population; on average, each sampled household represents approximately 2,500 households in the population. The Annual Social and Economic Supplement (ASEC) extends the core survey with detailed annual income data, including earnings, unemployment compensation, Social Security, pension income, interest, dividends, and other income sources. However, despite its broad coverage of income and employment, the CPS does not collect information on household wealth, assets, or liabilities, which are needed for wealth-based policy analysis. This omission motivates the need for statistical matching to transfer wealth information from the SCF onto the CPS. Specifically, we use the Enhanced CPS 2024 produced by PolicyEngine \citep{policyengine_us} as our receiver dataset. The Enhanced CPS extends the base CPS ASEC microdata through survey reweighting and calibration to administrative totals, improving its representativeness for tax-benefit microsimulation. The SCF 2022 financial variables are uprated to 2024 dollars using CPI adjustment factors to ensure consistency with the receiver dataset's reference year. \subsection{Comparative analysis and characteristics for imputation} -The SCF and CPS differ fundamentally in sampling design: the SCF employs a dual-frame approach combining a standard area-probability sample with a list sample that deliberately oversamples wealthy households, while the CPS uses a multistage area-probability household design representative of the civilian non-institutional population. This difference means that the donor and receiver surveys weight different parts of the wealth distribution differently, making proper survey weight integration during model training essential for unbiased imputation. The two surveys share a core set of demographic and income variables---age, sex, race, number of children, employment income, interest and dividend income, and pension income---but differ in their detailed variable coverage: the SCF collects granular asset and liability data absent from the CPS, while the CPS captures labor force dynamics and program participation variables not available in the SCF. This partial overlap constrains the conditioning set available for imputation and underscores the importance of the conditional independence assumption discussed in Section~\ref{sec:cia}. Together, the contrasting designs, the heavy-tailed nature of wealth, and the variable overlap constraints make the SCF-to-CPS imputation a particularly informative test case for comparing methods, while also being directly relevant to U.S. policy microsimulation, where researchers require comprehensive microdata combining income, demographics, and wealth to analyze the distributional effects of tax and benefit reforms. \ No newline at end of file +The SCF and CPS differ fundamentally in sampling design: the SCF employs a dual-frame approach combining a standard area-probability sample with a list sample that deliberately oversamples wealthy households, while the CPS uses a multistage area-probability household design representative of the civilian non-institutional population. This difference means that the donor and receiver surveys weight different parts of the wealth distribution differently, making proper survey weight integration during model training essential for unbiased imputation. The two surveys share a core set of demographic and income variables (age, sex, race, number of children, employment income, interest and dividend income, and pension income) but differ in detailed coverage: the SCF collects granular asset and liability data absent from the CPS, while the CPS captures labor force dynamics and program participation variables not available in the SCF. This partial overlap constrains the conditioning set available for imputation and reinforces the importance of the conditional independence assumption discussed in Section~\ref{sec:cia}. The contrasting survey designs, the heavy-tailed nature of wealth, and the limited variable overlap make the SCF-to-CPS imputation an informative test case for comparing methods. It is also directly relevant to U.S. policy microsimulation, where analyzing the distributional effects of tax and benefit reforms requires microdata that combine income, demographics, and wealth. \ No newline at end of file diff --git a/paper/sections/discussion.tex b/paper/sections/discussion.tex index 6e9627a..3600d45 100644 --- a/paper/sections/discussion.tex +++ b/paper/sections/discussion.tex @@ -1,56 +1,42 @@ \section{Discussion} -This paper has evaluated five imputation methods within the \texttt{microimpute} framework, finding that Quantile Random Forests offer meaningful advantages for the SCF-to-CPS wealth imputation application. By preserving the full conditional distribution of wealth, QRF maintains the key statistical properties of wealth data that traditional methods struggle to capture. +This paper has evaluated five imputation methods within the \texttt{microimpute} framework, finding that Quantile Random Forests offer meaningful advantages for the SCF-to-CPS wealth imputation application. By preserving the full conditional distribution of wealth, QRF captures statistical properties of wealth data that traditional methods miss. -\subsection{Strengths powered by $\texttt{microimpute}$} +\subsection{The role of \texttt{microimpute} in the analysis} -The $\texttt{microimpute}$ package's design philosophy and implementation choices provide several key advantages that contributed to the success of our wealth imputation analysis, and will extend to future model comparisons across applications: +Several design choices in \texttt{microimpute} shaped the analysis and its results. Wrapping all five methods behind a consistent API meant that performance differences in the benchmarking reflect the methods themselves, not differences in how they were implemented or tuned \citep{policyengine2025microimpute}. The \texttt{autoimpute} function automated hyperparameter tuning and method selection based on quantile loss, removing a subjective step that could otherwise bias the comparison. Using quantile loss rather than RMSE as the evaluation metric was itself consequential: its asymmetric penalty structure prioritizes accuracy at distribution tails, where symmetric metrics are insensitive to the kinds of errors that matter most for skewed variables like wealth. -\begin{enumerate} - \item \textbf{Unified interface for method comparison}: $\texttt{microimpute}$'s consistent API across all imputation methods enabled systematic benchmarking without implementation-specific biases. This standardization ensures that performance differences reflect genuine methodological advantages rather than implementation artifacts \citep{policyengine2025microimpute}. - - \item \textbf{Automated method selection}: The package's \texttt{autoimpute} function streamlines the imputation workflow by automatically comparing methods and selecting the best performer based on quantile loss metrics. This feature proved particularly valuable given the wealth data's complexity, as it removed subjective method selection and ensured optimal performance. - - \item \textbf{Survey weight integration}: $\texttt{microimpute}$'s native support for survey weights through stratified sampling ensures that imputation models properly represent population distributions. This capability is crucial when transferring information between surveys with different sampling designs, such as the SCF's oversampling of wealthy households. - - \item \textbf{Quantile-aware evaluation}: By implementing quantile loss as the primary evaluation metric, $\texttt{microimpute}$ directly addresses the challenges of skewed distributions. This metric's asymmetric penalty structure naturally prioritizes accurate imputation at distribution tails, where traditional metrics like Root Mean Squared Error (RMSE) often fail. - - \item \textbf{Computational efficiency}: The package's optimized implementation enables processing of large microdata files while maintaining reasonable computation times. Cross-validation on the full SCF dataset, including QRF hyperparameter tuning, was completed in under 30 minutes on standard hardware, making iterative experimentation feasible. - - \item \textbf{Open-source transparency}: As an open-source tool, $\texttt{microimpute}$ allows full inspection and modification of imputation algorithms, promoting reproducibility and enabling custom extensions for specific research needs \citep{policyengine2025microimpute}. -\end{enumerate} +Two practical aspects also mattered. First, native survey weight support through stratified sampling allowed the models to train on data representative of the U.S. population despite the SCF's deliberate oversampling of wealthy households. Second, the full cross-validation pipeline, including hyperparameter tuning on the SCF for the QRF, MDN, and Matching models ran in under 45 minutes on standard hardware, making iterative experimentation practical. The package is open-source, so all algorithms and evaluation procedures can be inspected and modified \citep{policyengine2025microimpute}. \subsection{Generalizability and predictor sensitivity} -The main SCF-CPS results are complemented by two supplementary analyses that inform the broader applicability of these findings. +Two supplementary analyses help contextualize the main SCF-CPS results. -The cross-dataset benchmarking exercise (Appendix~\ref{app:benchmarking}) reveals that method performance is context-dependent, with each method's strengths mapping to different data characteristics. QRF achieves the best Wasserstein distance on datasets exhibiting complex non-linear relationships, such as the Brazilian houses dataset and the SCF wealth imputation, where its ability to model flexible conditional distributions provides a clear advantage. Matching, by contrast, achieves the lowest Wasserstein distance on four of six benchmarking datasets and the best mean rank overall (1.67 vs.\ QRF's 1.83). This strong marginal distributional performance reflects Matching's core mechanism: by drawing imputed values directly from the donor pool, it inherently preserves the shape, skewness, and tail behavior of the original distribution, yielding low Wasserstein distances even when it may not optimally condition on predictor values. However, as the main SCF-CPS results demonstrate, Matching's distributional fidelity does not guarantee accurate conditional imputation. Households may receive plausible-looking wealth values that do not correctly reflect their individual characteristics. Thus, understanding the trade-offs between marginal and conditional accuracy, and evaluating how differences in survey design affect record matching becomes very important. +The cross-dataset benchmarking exercise (Appendix~\ref{app:benchmarking}) shows that method performance is context-dependent. QRF achieves the best Wasserstein distance on datasets with complex non-linear relationships, such as the Brazilian houses dataset and the SCF wealth imputation. Matching, by contrast, achieves the lowest Wasserstein distance on four of six benchmarking datasets and the best mean rank overall (1.67 vs.\ QRF's 1.83). This strong marginal performance follows from Matching's mechanism: drawing imputed values directly from the donor pool inherently preserves the shape and tail behavior of the original distribution, yielding low Wasserstein distances even when the conditioning on predictor values is suboptimal. But as the main SCF-CPS results show, good marginal distributions do not guarantee accurate conditional imputation. Households may receive plausible-looking wealth values that do not correctly reflect their individual characteristics. The trade-off between marginal and conditional accuracy, and the effect of differing survey designs on record matching, deserve careful attention in any application. -Meanwhile, OLS performs competitively on datasets where the predictor-target relationship is approximately linear (e.g., abalone, space\_ga), highlighting that simpler parametric methods remain effective when their structural assumptions are met. MDN consistently ranks last across the benchmarking datasets, likely reflecting a combination of the relatively small sample sizes in these datasets and the hyperparameter sensitivity of neural network-based approaches, which require larger training sets to realize their flexibility advantage. +OLS performs competitively on datasets where the predictor-target relationship is approximately linear (e.g., abalone, space\_ga), confirming that simpler parametric methods remain effective when their structural assumptions hold. MDN consistently ranks last across the benchmarking datasets, likely reflecting a combination of the relatively small sample sizes in these datasets and the hyperparameter sensitivity of neural network-based approaches, which require larger training sets to realize their flexibility advantage. -These findings reinforce the value of \texttt{microimpute}'s automated method comparison framework: no single method dominates across all settings, and the optimal choice depends on dataset size, the complexity of the predictor-target relationship, and whether the research objective prioritizes conditional accuracy or marginal distributional fidelity. Researchers should leverage the package's comparison tools to empirically determine the best approach for their specific data rather than defaulting to any single method. +No single method dominates across all settings. The best choice depends on dataset size, the complexity of the predictor-target relationship, and whether the research question calls for conditional accuracy or marginal distributional fidelity. This is precisely why automated comparison matters: researchers should test methods on their own data rather than defaulting to any one approach. -The predictor importance analysis (Appendix~\ref{app:robustness}) reveals a clear hierarchy among the variables shared between the SCF and CPS. Financial predictors, particularly interest and dividend income, employment income, and age, account for the vast majority of imputation accuracy, with interest and dividend income alone more than doubling the quantile loss when removed. Demographic variables such as race and gender contribute relatively little to imputation quality. This concentration of predictive power in financial variables has two practical implications. First, the quality of wealth imputation rests primarily on the availability and accuracy of income-related variables in both surveys; researchers lacking financial predictors would see substantially degraded results. Second, diminishing returns from additional demographic predictors suggest that a parsimonious set of well-chosen financial variables can achieve most of the attainable accuracy, as confirmed by the progressive inclusion analysis showing that the first three predictors capture the majority of achievable performance. Nonetheless, the inclusion of demographic variables still provides incremental improvements, and their contribution to capturing nuanced wealth variation should not be overlooked. +The predictor importance analysis (Appendix~\ref{app:robustness}) reveals a clear hierarchy among the variables shared between the SCF and CPS. Financial predictors, particularly interest and dividend income, employment income, and age, account for the vast majority of imputation accuracy, with interest and dividend income alone more than doubling the quantile loss when removed. Demographic variables such as race and gender contribute relatively little to imputation quality. This concentration of predictive power in financial variables has two practical implications. First, the quality of wealth imputation rests primarily on the availability and accuracy of income-related variables in both surveys; researchers lacking financial predictors would see substantially degraded results. Second, diminishing returns from additional demographic predictors suggest that a parsimonious set of well-chosen financial variables can achieve most of the attainable accuracy, as confirmed by the progressive inclusion analysis showing that the first three predictors capture the majority of achievable performance. That said, demographic variables still provide incremental improvements and should not be excluded without reason. -\texttt{microimpute}'s support for predictor importance analysis and progressive inclusion experiments allows researchers to systematically assess which variables are driving imputation performance in their specific context, and to make informed decisions about variable selection when faced with data limitations. +The predictor importance and progressive inclusion tools in \texttt{microimpute} let researchers assess which variables drive imputation performance in their specific context and make informed decisions about variable selection when data are limited. -Together, these supplementary analyses contextualize the main results: QRF's strong performance in the SCF-CPS setting reflects the particular characteristics of the wealth imputation problem---a large donor dataset, highly non-linear relationships, and informative financial predictors available in both surveys. Researchers applying \texttt{microimpute} to other settings should expect method rankings to vary with dataset characteristics and should leverage the package's comparison tools accordingly. +Together, these supplementary analyses put the main results in perspective. QRF's strong performance in the SCF-CPS setting reflects the particular characteristics of the wealth imputation problem, namely a large donor dataset, highly non-linear relationships, and informative financial predictors available in both surveys. Researchers applying \texttt{microimpute} to other settings should expect method rankings to vary with dataset characteristics. \subsection{Reform analysis and policy uncertainty} -The SSI Savings Penalty Elimination Act simulation demonstrates that imputation is not merely a data preprocessing step but a consequential modeling choice for policy analysis. The variation in estimated reform impact across the five methods represents practical policy uncertainty: policymakers relying on different imputation approaches would reach different conclusions about the budgetary and coverage effects of raising SSI resource limits. This finding extends beyond SSI to any means-tested program where eligibility depends on wealth or asset data not collected in the primary survey. +The SSI Savings Penalty Elimination Act simulation shows that imputation is not merely a data preprocessing step but a modeling choice with direct consequences for policy analysis. The variation in estimated reform impact across the five methods represents practical policy uncertainty: policymakers relying on different imputation approaches would reach different conclusions about the budgetary and coverage effects of raising SSI resource limits. This finding extends beyond SSI to any means-tested program where eligibility depends on wealth or asset data not collected in the primary survey. -The difference-in-differences approach, by comparing current-law and reform outcomes within each method, partially mitigates the limitation that SCF net worth serves as a proxy for SSI countable resources. Since the systematic bias affects both scenarios similarly, the reform impact estimates are less sensitive to this proxy than the level estimates. Nonetheless, future work could improve these estimates by imputing asset-specific components (e.g., excluding primary residence equity) rather than total net worth, and by extending the analysis to demographic subgroups (aged vs.\ disabled recipients) to better characterize the reform's distributional effects. +By comparing current-law and reform outcomes within each method, the microsimulation approach (under ceteris paribus) partially mitigates the limitation that SCF net worth is only a proxy for SSI countable resources. Since the systematic bias affects both scenarios similarly, the reform impact estimates are less sensitive to this proxy than the level estimates. Nonetheless, future work could improve these estimates by imputing asset-specific components (e.g., excluding primary residence equity) rather than total net worth, and by extending the analysis to demographic subgroups (aged vs.\ disabled recipients) to better characterize the reform's distributional effects. -A practical path to resolving the variation in aggregate estimates across imputation methods is survey weight calibration. Rather than choosing a method based on proximity to administrative totals, which conflates imputation accuracy with policy function artifacts, researchers can select the method with the best conditional accuracy (here, QRF) for record-level imputation and then calibrate survey weights to match known administrative aggregates such as SSI recipient counts and total expenditure to ensure national-level representativeness \citep{woodruff2024enhancing}. This two-stage approach achieves the best of both worlds: accurate household-level wealth distributions that preserve the conditional relationships needed for reform simulation, combined with aggregate estimates that align with administrative benchmarks. +A practical path to resolving the variation in aggregate estimates across imputation methods is survey weight calibration. Rather than choosing a method based on proximity to administrative totals, which conflates imputation accuracy with policy function artifacts, researchers can select the method with the best conditional accuracy (here, QRF) for record-level imputation and then calibrate survey weights to match known administrative aggregates such as SSI recipient counts and total expenditure to ensure national-level representativeness \citep{woodruff2024enhancing}. This two-stage approach combines accurate household-level wealth distributions that preserve the conditional relationships needed for reform simulation with aggregate estimates that align with administrative benchmarks. \subsection{Limitations and future improvements}\label{sec:limitations} -Despite the demonstrated advantages, there remain limitations worth considering for future development: - \subsubsection{Current package limitations} -While $\texttt{microimpute}$ currently supports five imputation methods, expanding to include additional modern machine learning approaches such as more complex neural networks, gradient boosting machines, or deep learning architectures could further improve performance, particularly for complex multivariate relationships \citep{alaa2024deep}. The package would benefit from implementing ensemble methods that combine multiple imputation approaches, potentially leveraging the strengths of different methods across different parts of the distribution. Moreover, model selection and assessment could be enhanced with evaluation metrics additional to quantile loss, ensuring a thorough understanding of each model's behavior at every step. +The current method library of five approaches could be expanded with gradient boosting machines, deeper neural architectures, or other modern machine learning methods, which may improve performance for complex multivariate relationships \citep{alaa2024deep}. Ensemble methods that combine multiple imputation approaches across different parts of the distribution are another natural extension. Model selection and assessment could also benefit from evaluation metrics beyond quantile loss, giving a more complete picture of each model's behavior. \subsubsection{QRF-specific challenges} @@ -58,6 +44,6 @@ \subsubsection{QRF-specific challenges} \subsubsection{Missing data assumptions} -All imputation methods in this study operate under the assumption that wealth is missing at random (MAR) conditional on the shared predictors $X$, as formalized in Section~\ref{sec:cia}. This assumption may be violated in practice: wealthy individuals may be less likely to participate in surveys or may underreport assets, introducing missing-not-at-random (MNAR) patterns that the conditioning variables cannot fully account for \citep{andridge2010review}. The predictor exclusion analysis in Appendix~\ref{app:robustness} provides a partial sensitivity check on the plausibility of the MAR assumption. The substantial degradation in imputation quality when financial predictors are removed, particularly the 116\% increase in quantile loss when interest and dividend income is excluded, demonstrates that the conditioning set is doing meaningful work in explaining wealth variation, which is consistent with MAR plausibility. However, this analysis cannot rule out residual dependence on unobserved factors. More formal MNAR sensitivity analyses, such as pattern-mixture models or selection models applied to the imputation framework, represent an important direction for future work. Researchers applying \texttt{microimpute} to settings where nonresponse or selection effects are suspected should consider supplementary diagnostics to assess the sensitivity of their results to departures from MAR. +All imputation methods in this study operate under the assumption that wealth is missing at random (MAR) conditional on the shared predictors $X$, as formalized in Section~\ref{sec:cia}. This assumption may be violated in practice: wealthy individuals may be less likely to participate in surveys or may underreport assets, introducing missing-not-at-random (MNAR) patterns that the conditioning variables cannot fully account for \citep{andridge2010review}. The predictor exclusion analysis in Appendix~\ref{app:robustness} provides a partial sensitivity check on the plausibility of the MAR assumption. The substantial degradation in imputation quality when financial predictors are removed, particularly the 116\% increase in quantile loss when interest and dividend income is excluded, indicates that the conditioning set is doing meaningful work in explaining wealth variation, consistent with MAR plausibility. However, this analysis cannot rule out residual dependence on unobserved factors. More formal MNAR sensitivity analyses, such as pattern-mixture models or selection models applied to the imputation framework, are a natural next step. Researchers applying \texttt{microimpute} to settings where nonresponse or selection effects are suspected should consider supplementary diagnostics to assess the sensitivity of their results to departures from MAR. -These enhancements would position $\texttt{microimpute}$ further as a comprehensive solution for survey data imputation challenges while maintaining its current strengths in ease of use and methodological rigor. \ No newline at end of file +These extensions would broaden the range of problems \texttt{microimpute} can address while preserving its current simplicity. \ No newline at end of file diff --git a/paper/sections/introduction.tex b/paper/sections/introduction.tex index 8228cbc..864fe41 100644 --- a/paper/sections/introduction.tex +++ b/paper/sections/introduction.tex @@ -1,19 +1,19 @@ \section{Introduction} -Statistical matching, also known as data fusion or full variable imputation, addresses the challenge of combining information from multiple data sources that share common variables but contain different samples of units \citep{dorazio2006statistical}, which is commonly found across fields in empirical research. In its simplest form, the problem involves a donor dataset containing both shared and unique variables and a receiver dataset containing only the shared variables, where the goal is to impute the missing variables for observations in the receiver file based on their shared characteristics \citep{dorazio2021statistical}. This framework generalizes traditional missing data imputation by recognizing that ``missingness'' can arise not only from nonresponse within a single survey but also from the structural absence of variables across distinct data sources. +Statistical matching, also known as data fusion or full variable imputation, combines information from multiple data sources that share common variables but contain different samples of units \citep{dorazio2006statistical}, a situation common across empirical research fields. In its simplest form, the problem involves a donor dataset containing both shared and unique variables and a receiver dataset containing only the shared variables, where the goal is to impute the missing variables for observations in the receiver file based on their shared characteristics \citep{dorazio2021statistical}. This framework generalizes traditional missing data imputation by recognizing that ``missingness'' can arise not only from nonresponse within a single survey but also from the structural absence of variables across distinct data sources. -The relevance of statistical matching extends across the social sciences, particularly in microsimulation modeling where policy analysis requires combining detailed demographic information from one survey with economic variables from another \citep{bourguignon2006microsimulation}. For instance, household surveys may capture income and consumption patterns but lack wealth data, while financial surveys provide wealth information for different samples. Constructing synthetic files that combine these variables enables richer policy analysis than either source alone permits. +Statistical matching is widely applicable in the social sciences, particularly in microsimulation modeling, where policy analysis often requires combining detailed demographic information from one survey with economic variables from another \citep{bourguignon2006microsimulation}. For instance, household surveys may capture income and consumption patterns but lack wealth data, while financial surveys provide wealth information for different samples. Constructing synthetic files that combine these variables allows more detailed policy analysis than either source alone. -The central methodological challenge is accurately modeling the conditional distribution of the target variable given shared predictors, as different approaches make different assumptions about this relationship. Parametric methods may be too restrictive for economic variables exhibiting heavy tails and heteroscedasticity, while nonparametric and machine learning approaches offer greater flexibility at the cost of additional complexity \citep{meinshausen2006quantile, andridge2010review}. Section~2 reviews these trade-offs in detail. +The main methodological difficulty is accurately modeling the conditional distribution of the target variable given shared predictors, as different approaches make different assumptions about this relationship. Parametric methods may be too restrictive for economic variables with heavy tails and heteroscedasticity, while nonparametric and machine learning approaches are more flexible but also more complex \citep{meinshausen2006quantile, andridge2010review}. Section~2 reviews these trade-offs in detail. -This paper presents the \texttt{microimpute} package, a Python library implementing five statistical matching methods: Hot Deck Matching, Ordinary Least Squares, Quantile Regression, Mixture Density Networks, and Quantile Random Forests. The package provides a comprehensive framework for comparing these methods through systematic benchmarking, with automated model selection based on quantile loss performance. We demonstrate the methodology through an application to wealth imputation, transferring net worth data from the Survey of Consumer Finances to the Current Population Survey. This task exemplifies the challenges of statistical matching for heavy-tailed distributions. +This paper presents the \texttt{microimpute} package, a Python library implementing five statistical matching methods: Hot Deck Matching, Ordinary Least Squares, Quantile Regression, Mixture Density Networks, and Quantile Random Forests. The package provides a framework for comparing these methods through systematic benchmarking, with automated model selection based on quantile loss performance. We demonstrate the methodology through an application to wealth imputation, transferring net worth data from the Survey of Consumer Finances to the Current Population Survey. This task exemplifies the challenges of statistical matching for heavy-tailed distributions. This work provides the following contributions: \begin{itemize} - \item An open-source implementation of a unified framework for five imputation methods, facilitating systematic comparison across methods and support statistical matching through accessible, user-friendly software - \item An automated benchmarking pipeline that evaluates distributional accuracy using quantile loss, enabling researchers to select the most appropriate method for their specific data characteristics - \item Empirical evidence on the relative performance of these methods for wealth imputation, suggesting that Quantile Random Forests are well-suited to heavy-tailed distributions while highlighting the context-dependence of method choice - \item A policy reform simulation of the SSI Savings Penalty Elimination Act demonstrating that imputation method choice produces meaningfully different estimates of reform impact, and that without imputed wealth data, such reforms are entirely un-simulable + \item An open-source implementation of five imputation methods under a common interface, allowing systematic comparison across methods + \item An automated benchmarking pipeline that evaluates distributional accuracy using quantile loss, so that researchers can select the most appropriate method for their data + \item Empirical evidence on the relative performance of these methods for wealth imputation, suggesting that Quantile Random Forests are well-suited to heavy-tailed distributions, though method choice remains context-dependent + \item A policy reform simulation of the SSI Savings Penalty Elimination Act, showing that imputation method choice produces meaningfully different estimates of reform impact, and that without imputed wealth data, such reforms cannot be simulated at all \end{itemize} The remainder of this paper is organized as follows. Section 2 reviews the statistical matching problem, including its formal definition, the conditional independence assumption that underlies all matching methods, and the five imputation approaches implemented in \texttt{microimpute}. Section 3 describes our data sources. Section 4 presents the package architecture and benchmarking methodology. Section 5 reports empirical results from the wealth imputation application. Section 6 discusses implications and limitations, and Section 7 concludes. \ No newline at end of file diff --git a/paper/sections/methodology.tex b/paper/sections/methodology.tex index d41a552..6623906 100644 --- a/paper/sections/methodology.tex +++ b/paper/sections/methodology.tex @@ -2,22 +2,22 @@ \section{Methodology}\label{sec:methodology} \subsection{$\texttt{microimpute}$ package implementation} -$\texttt{microimpute}$\footnote{Complete documentation, implementation details, and usage examples are available at https://policyengine.github.io/microimpute/.} is an open-source Python framework for statistical matching that provides a unified interface for imputing variables across survey datasets using multiple methods. The package addresses a gap in the microsimulation and microdata research community: while several imputation approaches exist, researchers have lacked a standardized tool for systematically comparing their distributional performance on a given dataset and automatically selecting the best approach. In this study, \texttt{microimpute} serves both as a methodological contribution to the broader research community and as the analytical engine powering the wealth imputation experiments described below. +$\texttt{microimpute}$\footnote{Documentation, implementation details, and usage examples are available at https://policyengine.github.io/microimpute/.} is an open-source Python framework for statistical matching that provides a common interface for imputing variables across survey datasets using multiple methods. While several imputation approaches exist individually, researchers have lacked a standardized tool for comparing their distributional performance on a given dataset and automatically selecting the best approach. In this study, \texttt{microimpute} is both a methodological contribution and the analytical engine behind the wealth imputation experiments described below. \subsubsection{Core capabilities} -The package currently supports five imputation methods: Hot Deck Matching, Ordinary Least Squares Linear Regression (OLS), Quantile Regression, Quantile Random Forests (QRF), and Mixture Density Networks (MDN). This approach allows researchers to systematically evaluate which technique provides the most accurate results for their specific dataset and research objectives. Additionally, the package is designed to be modular, allowing for easy extension with additional imputation methods in the future. +The package currently supports five imputation methods: Hot Deck Matching, Ordinary Least Squares Linear Regression (OLS), Quantile Regression, Quantile Random Forests (QRF), and Mixture Density Networks (MDN). The package is modular, so additional imputation methods can be added without modifying the existing codebase. \subsubsection{Key features} -The package provides several capabilities designed for the challenges of cross-survey imputation, each of which plays a specific role in the wealth imputation experiments presented in this paper: +Several features are relevant to the cross-survey imputation experiments presented in this paper: \begin{enumerate} - \item \textbf{Survey data weights integration}: Handles survey data weights through sampling to ensure that models are trained on a donor data set representative of the true distribution. - \item \textbf{Method comparison and benchmarking}: Allows researchers to easily compare different approaches and automatically determine the method providing the most accurate results. - \item \textbf{Flexible methodological set-up}: Enables advanced usage through specified hyperparameter setting and tuning. - \item \textbf{Quantile-based evaluation}: Uses quantile loss calculations to assess imputation quality across different parts of the distribution. - \item \textbf{Autoimputation}: Provides an integrated imputation pipeline that tunes method hyperparameters to the specific datasets, compares methods, and selects the best-performing to conduct the requested imputation in a single function call. + \item \textbf{Survey weight integration}: Incorporates survey weights through sampling so that models are trained on data representative of the true population distribution. + \item \textbf{Method comparison and benchmarking}: Compares different approaches and automatically identifies the method with the lowest quantile loss. + \item \textbf{Hyperparameter tuning}: Supports user-specified hyperparameters as well as automated tuning. + \item \textbf{Quantile-based evaluation}: Assesses imputation quality across different parts of the distribution using quantile loss. + \item \textbf{Autoimputation}: Tunes hyperparameters, compares methods, and selects the best-performing one to impute onto the receiver dataset, all in a single function call. \end{enumerate} \subsection{Evaluation framework} @@ -29,7 +29,7 @@ \subsection{Evaluation framework} \mathcal{L}_\tau = \rho_\tau(y - \hat{Q}_\tau(y|x)) = (y - \hat{Q}_\tau(y|x)) \cdot (\tau - \mathbf{1}_{y < \hat{Q}_\tau(y|x)}) \end{equation} -Under-prediction of an upper-tail quantile is penalized at rate $\tau$, whereas over-prediction is penalized at rate $1 - \tau$. This asymmetric structure captures directional bias---a crucial feature when imputing highly skewed variables like wealth, where large under-estimates in the right tail must be discouraged more strongly than equal-sized over-estimates \citep{koenker1978regression}. Compared with mean-squared or mean-absolute error, which penalize errors symmetrically, quantile loss directly targets the conditional distribution and remains robust to outliers \citep{ghenis2018quantile}. Averaging over multiple quantiles $\tau \in \{0.1, 0.2, \ldots, 0.9\}$ provides a comprehensive measure of how well the method estimates the conditional distribution across its entire range. Lower average quantile loss indicates better distributional calibration. Because quantile loss is not scale-invariant, the absolute values reported in Section~5 reflect the scale transformation applied; we supplement raw values with relative improvement percentages to aid interpretability. +Under-prediction of an upper-tail quantile is penalized at rate $\tau$, whereas over-prediction is penalized at rate $1 - \tau$. This asymmetric structure captures directional bias, which matters when imputing highly skewed variables like wealth, where large under-estimates in the right tail must be discouraged more strongly than equal-sized over-estimates \citep{koenker1978regression}. Compared with mean-squared or mean-absolute error, which penalize errors symmetrically, quantile loss directly targets the conditional distribution and remains robust to outliers \citep{ghenis2018quantile}. Averaging over multiple quantiles $\tau \in \{0.1, 0.2, \ldots, 0.9\}$ summarizes how well the method estimates the conditional distribution across its entire range. Lower average quantile loss indicates better distributional calibration. Because quantile loss is not scale-invariant, the absolute values reported in Section~5 reflect the scale transformation applied; we supplement raw values with relative improvement percentages to aid interpretability. As a complementary metric, we use the Wasserstein distance (also known as the earth mover's distance) to measure overall distributional similarity between imputed and reference distributions. Formally, for one-dimensional distributions $P$ and $Q$: \begin{equation} @@ -42,11 +42,11 @@ \subsection{Evaluation framework} \subsection{Experimental setup}\label{sec:experimental_setup} -The \texttt{autoimpute} function orchestrates the full imputation pipeline in a single call: it tunes hyperparameters for applicable methods using the Optuna framework \citep{akiba2019optuna}, evaluates all methods through $k$-fold cross-validation on the donor data, and automatically selects the best-performing one to impute onto the receiver dataset. Using this pipeline, we evaluate all five imputation methods---QRF, OLS, Quantile Regression, Hot Deck Matching, and MDN---for net worth imputation from the SCF to the CPS. +The \texttt{autoimpute} function orchestrates the full imputation pipeline in a single call: it tunes hyperparameters for applicable methods using the Optuna framework \citep{akiba2019optuna}, evaluates all methods through $k$-fold cross-validation on the donor data, and automatically selects the best-performing one to impute onto the receiver dataset. Using this pipeline, we evaluate all five imputation methods (QRF, OLS, Quantile Regression, Hot Deck Matching, and MDN) for net worth imputation from the SCF to the CPS. Prior to model training, we apply an inverse hyperbolic sine (asinh) transformation to the net worth target variable. The asinh function, $\operatorname{asinh}(x) = \ln(x + \sqrt{x^2 + 1})$, approximates the natural logarithm for large positive values while remaining well-defined for zero and negative values. This is particularly important for wealth data, where a meaningful fraction of households report negative net worth (i.e., debts exceeding assets), making a standard logarithmic transformation infeasible. The transformation compresses the extreme right tail of the wealth distribution, stabilizing variance and improving model performance across all methods. After imputation, predictions are back-transformed via the inverse function $\sinh(\cdot)$ to recover values on the original dollar scale. -This experimental design implicitly assumes that wealth is missing at random (MAR) conditional on the shared predictors $X$---that is, the probability of observing wealth in the donor survey does not depend on wealth itself once we condition on the demographic and financial variables available in both datasets, as formalized in Section~\ref{sec:cia}. This assumption is standard in statistical matching but may be violated in practice: wealthy households may be less likely to participate in surveys or may underreport assets, creating MNAR-like patterns that the shared predictors cannot fully capture. We return to this limitation and discuss partial sensitivity checks in Section~\ref{sec:limitations}. +This experimental design implicitly assumes that wealth is missing at random (MAR) conditional on the shared predictors $X$, i.e., that the probability of observing wealth in the donor survey does not depend on wealth itself once we condition on the demographic and financial variables available in both datasets, as formalized in Section~\ref{sec:cia}. This assumption is standard in statistical matching but may be violated in practice: wealthy households may be less likely to participate in surveys or may underreport assets, creating MNAR-like patterns that the shared predictors cannot fully capture. We return to this limitation and discuss partial sensitivity checks in Section~\ref{sec:limitations}. To create a ground truth for evaluation, we employ cross-validation, splitting the SCF into 5 folds. For each method, \texttt{autoimpute} performs the following steps: @@ -82,7 +82,7 @@ \subsection{Downstream policy analysis}\label{sec:policy_validation} While distributional metrics such as quantile loss and Wasserstein distance assess how well an imputation method recovers the statistical properties of the target variable, they do not directly capture whether differences between methods matter for downstream policy analysis. To address this, we introduce a policy analysis layer that evaluates imputation quality through its effect on a concrete policy simulation, under both current law and a proposed reform. -We use the Supplemental Security Income (SSI) program as the policy case. SSI is a federal means-tested program that provides cash assistance to aged, blind, and disabled individuals with limited income and resources \citep{ssa2023ssi}. Critically, SSI eligibility includes a resource test with limits of \$2,000 for individuals and \$3,000 for couples, which directly depends on household wealth data that the CPS does not collect. +We use the Supplemental Security Income (SSI) program as the policy case. SSI is a federal means-tested program that provides cash assistance to aged, blind, and disabled individuals with limited income and resources \citep{ssa2023ssi}. SSI eligibility includes a resource test with limits of \$2,000 for individuals and \$3,000 for couples, which depends on household wealth data that the CPS does not collect. In current practice, PolicyEngine's microsimulation model \citep{policyengine_us} handles the missing wealth data by defaulting \texttt{ssi\_countable\_resources} to zero for all CPS households, meaning every categorically eligible individual passes the resource test. This produces a substantial overestimate of SSI participation. For each imputation method, we feed the model's imputed net worth values into PolicyEngine as \texttt{ssi\_countable\_resources}, replacing the default zero-resource assumption with household-level wealth data. We then simulate SSI eligibility and benefits under each imputation scenario and compare the resulting recipient counts and total expenditure against SSA administrative totals (7.4 million recipients and \$59.6 billion in federal payments for 2024). @@ -90,4 +90,4 @@ \subsection{Downstream policy analysis}\label{sec:policy_validation} \subsection{Additional methodological analyses} -Two supplementary analyses complement the main experimental framework described above. Appendix~\ref{app:robustness} presents a predictor importance analysis using leave-one-out and progressive inclusion experiments on the QRF model, identifying the relative contribution of each predictor variable to wealth imputation quality and informing the plausibility of the conditional independence assumption. Meanwhile, to understand how the superiority of certain models over others generalize to other contexts and datasets, appendix~\ref{app:benchmarking} reports a cross-dataset benchmarking exercise that evaluates \texttt{microimpute}'s five methods across six publicly available datasets from diverse domains, assessing the generalizability of method performance beyond the SCF-CPS use case. +Two supplementary analyses complement the main experimental framework. Appendix~\ref{app:robustness} presents a predictor importance analysis using leave-one-out and progressive inclusion experiments on the QRF model, measuring the relative contribution of each predictor to wealth imputation quality and informing the plausibility of the conditional independence assumption. To test whether the relative performance of methods generalizes beyond this particular application, Appendix~\ref{app:benchmarking} reports a cross-dataset benchmarking exercise that evaluates \texttt{microimpute}'s five methods across six publicly available datasets from different domains. diff --git a/paper/sections/results.tex b/paper/sections/results.tex index 4396ce5..6c1f130 100644 --- a/paper/sections/results.tex +++ b/paper/sections/results.tex @@ -2,9 +2,9 @@ \section{Results} \subsection{Imputation results} -The cross-validation results demonstrate QRF's strong performance across the wealth distribution. With the asinh transformation applied to the net worth target variable, QRF achieved the lowest average quantile loss across all quantiles, outperforming OLS, Hot Deck Matching, Quantile Regression, and MDN. QRF's overall consistency across the entire distribution made it the best-performing method for wealth imputation in this setting. +The cross-validation results show that QRF performs well across the wealth distribution. With the asinh transformation applied to the net worth target variable, QRF achieved the lowest average quantile loss across all quantiles, outperforming OLS, Hot Deck Matching, Quantile Regression, and MDN. QRF's overall consistency across the entire distribution made it the best-performing method for wealth imputation in this setting. -$\texttt{microimpute}$'s automated hyperparameter tuning via the Optuna framework contributed to these results. The optimal QRF configuration identified through cross-validation included 202 trees, a minimum of 1 sample per leaf, a split threshold of 5 samples, approximately 95\% of features considered at each split, and bootstrap sampling enabled. These parameters balanced model complexity with generalization capability, preventing overfitting while capturing the non-linear relationships between demographic predictors and wealth outcomes. +Automated hyperparameter tuning via the Optuna framework contributed to these results. The optimal QRF configuration identified through cross-validation included 202 trees, a minimum of 1 sample per leaf, a split threshold of 5 samples, approximately 95\% of features considered at each split, and bootstrap sampling enabled. These parameters balance model complexity with generalization, preventing overfitting while still capturing non-linear relationships between demographic predictors and wealth. \subsubsection{Quantile loss} @@ -42,7 +42,7 @@ \subsubsection{Quantile loss} \subsubsection{Imputed wealth distribution comparisons} -By visually comparing the wealth distributions resulting from imputing with each method, and comparing them to the weighted donor distribution, we gain a more comprehensive understanding of imputation performance, moving past the test quantile loss average measured on the SCF. The distribution of wealth values imputed by QRF closely resembles the original SCF distribution, suggesting that QRF is not only the best method in terms of quantile loss but also strong when achieving distributional estimates close to the true wealth distribution in the United States. Because Matching directly takes values from the donor distribution and imputes them onto the receiver, it is unsurprising that its distribution closely resembles the donor distribution. However, Matching may struggle to uncover the non-linear relationship between the different predictors and wealth values, resulting in a seemingly correct marginal distribution but inaccurate imputation given certain household characteristics. Meanwhile, OLS, QuantReg, and MDN fail to capture the variability across the distribution and impute most values at the lower or higher ends of the distribution. +Comparing the imputed wealth distributions against the weighted donor distribution gives a fuller picture of imputation performance beyond the quantile loss averages measured on the SCF. The distribution of wealth values imputed by QRF closely matches the original SCF distribution, suggesting that QRF performs well not only in quantile loss but also in reproducing the overall shape of the U.S. wealth distribution. Because Matching directly takes values from the donor distribution and imputes them onto the receiver, it is unsurprising that its distribution closely resembles the donor distribution. However, Matching may fail to capture the non-linear relationship between predictors and wealth, producing a marginal distribution that looks correct while assigning inaccurate values to individual households. OLS, QuantReg, and MDN fail to capture variability across the distribution and concentrate imputed values at the lower or higher ends. \begin{figure}[H] \centering @@ -76,7 +76,7 @@ \subsubsection{Wasserstein distance} \subsubsection{Distribution of wealth by disposable income decile} -Beyond the statistical metrics reported above, we perform a plausibility check by examining whether imputed wealth exhibits economically expected relationships with observable variables. Household wealth should increase monotonically with disposable income, reflecting the well-documented positive correlation between income and wealth accumulation. This check is particularly important for wealth imputation: a method that achieves competitive quantile loss but produces wealth-income patterns that violate basic economic relationships would be unreliable for downstream policy analysis, where the joint distribution of income and wealth drives eligibility and benefit calculations. +Beyond the statistical metrics reported above, we check whether imputed wealth exhibits economically expected relationships with observable variables. Household wealth should increase monotonically with disposable income, given the well-documented positive correlation between income and wealth accumulation. This check matters because a method that achieves competitive quantile loss but produces wealth-income patterns that violate basic economic relationships would be unreliable for downstream policy analysis, where eligibility and benefit calculations depend on the joint distribution of income and wealth. \begin{figure}[H] \centering @@ -85,11 +85,11 @@ \subsubsection{Distribution of wealth by disposable income decile} \label{fig:imputation_comparison_by_income_decile} \end{figure} -These results support the observations above, with QRF presenting the most consistent and plausible relationship to disposable income, with a monotonically increasing average wealth as deciles increase---a pattern consistent with economic expectations and serving as a plausibility check on the imputation. This plot also demonstrates the caveats of the other models, for example showing the lower variability in OLS's predictions, and Matching's consistent underprediction across deciles. +These results are consistent with the observations above. QRF produces a monotonically increasing average wealth across income deciles, as economic theory would predict. The plot also exposes weaknesses in the other models: OLS shows little variability in its predictions, and Matching consistently underpredicts across deciles. \subsection{Policy analysis: SSI simulation} -Following the downstream policy analysis framework described in Section~\ref{sec:policy_validation}, we feed each model's imputed net worth into PolicyEngine as \texttt{ssi\_countable\_resources} and simulate SSI eligibility and benefits. Table~\ref{tab:ssi_results} compares simulated recipient counts and total expenditure against SSA administrative totals for 2024. +As described in Section~\ref{sec:policy_validation}, we feed each model's imputed net worth into PolicyEngine as \texttt{ssi\_countable\_resources} and simulate SSI eligibility and benefits. Table~\ref{tab:ssi_results} compares simulated recipient counts and total expenditure against SSA administrative totals for 2024. \begin{table}[H] \centering @@ -115,7 +115,7 @@ \subsection{Policy analysis: SSI simulation} \subsubsection{Policy reform: SSI Savings Penalty Elimination Act} -To demonstrate why wealth imputation matters for policy analysis and not just model calibration, we simulate the SSI Savings Penalty Elimination Act \citep{ssi_spea_2025}, which would raise resource limits from \$2,000/\$3,000 to \$10,000/\$20,000. Table~\ref{tab:ssi_reform} reports SSI outcomes under both current law and the reformed thresholds for each imputation method. +To show why wealth imputation matters for policy analysis, not just model calibration, we simulate the SSI Savings Penalty Elimination Act \citep{ssi_spea_2025}, which would raise resource limits from \$2,000/\$3,000 to \$10,000/\$20,000. Table~\ref{tab:ssi_reform} reports SSI outcomes under both current law and the reformed thresholds for each imputation method. \begin{table}[H] \centering @@ -140,9 +140,9 @@ \subsubsection{Policy reform: SSI Savings Penalty Elimination Act} The reform raises the resource threshold from \$2,000 to \$10,000 (individual), so the relevant question is how dense each method's imputed wealth distribution is in the \$2,000--\$10,000 range. Households with imputed net worth in this interval fail the current-law resource test but would pass under the reform, gaining SSI eligibility. The estimated number of additional recipients ranges from 0.1 million (QuantReg) to 4.2 million (OLS), with corresponding additional expenditure from \$1.0 billion to \$24.1 billion. This range reflects how differently each imputation approach populates this critical region of the wealth distribution. -QRF estimates a modest reform impact (0.6 million additional recipients, \$3.4 billion additional expenditure), consistent with its faithful reproduction of the SCF wealth distribution. Most households with near-zero wealth are already below the \$2,000 threshold, so raising it to \$10,000 captures relatively few additional households. OLS, by contrast, produces the largest reform impact (4.2 million additional recipients), because its compressed, normally distributed imputations place a substantial mass of households in the \$2,000--\$10,000 range. QuantReg's near-zero reform impact (0.1 million) reflects its tendency to push imputed values away from this intermediate range. These differences underscore that the choice of imputation method is not merely a technical detail but a modeling decision that directly shapes policy impact estimates. +QRF estimates a modest reform impact (0.6 million additional recipients, \$3.4 billion additional expenditure), consistent with its faithful reproduction of the SCF wealth distribution. Most households with near-zero wealth are already below the \$2,000 threshold, so raising it to \$10,000 captures relatively few additional households. OLS, by contrast, produces the largest reform impact (4.2 million additional recipients), because its compressed, normally distributed imputations place a substantial mass of households in the \$2,000--\$10,000 range. QuantReg's near-zero reform impact (0.1 million) reflects its tendency to push imputed values away from this intermediate range. These differences show that the choice of imputation method is not merely a technical detail but a modeling decision that directly shapes policy impact estimates. -The baseline (no wealth data) scenario starkly illustrates why imputation is essential: because all resources default to zero, every categorically eligible individual already passes the current-law resource test, so raising the thresholds has zero effect. Without wealth data, this reform is literally un-simulable. The microsimulation would not be able to distinguish between the status quo and a fivefold increase in resource limits. +The baseline (no wealth data) scenario shows plainly why imputation is necessary. Because all resources default to zero, every categorically eligible individual already passes the current-law resource test, so raising the thresholds has zero effect. Without wealth data, the microsimulation cannot distinguish between the status quo and a fivefold increase in resource limits. \begin{figure}[H] \centering From a1f5b19c9c51341ad785a652c55b18232ed7a4ed Mon Sep 17 00:00:00 2001 From: juaristi22 Date: Fri, 27 Feb 2026 12:46:51 +0530 Subject: [PATCH 2/5] updating readme with paper --- README.md | 50 +++++++++++++++++-------------------- paper/main.pdf | Bin 543392 -> 543552 bytes paper/sections/results.tex | 2 +- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 8b055cf..a5a817f 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,31 @@ # Microimpute -Microimpute enables variable imputation through a variety of statistical methods. By providing a consistent interface across different imputation techniques, it allows researchers and data scientists to easily compare and benchmark different approaches using quantile loss and log loss calculations to determine the method providing most accurate results. +Microimpute is a Python package for imputing variables from one survey dataset onto another. It wraps five imputation methods behind a common interface so you can benchmark them on your data and pick the one that works best, rather than defaulting to a single approach. -## Features +## Methods -### Multiple imputation methods -- **Statistical Matching**: Distance-based matching for finding similar observations -- **Ordinary Least Squares (OLS)**: Linear regression-based imputation -- **Quantile Regression**: Distribution-aware regression imputation -- **Quantile Random Forests (QRF)**: Non-parametric forest-based approach -- **Mixture Density Networks (MDN)**: Neural network with Gaussian mixture approximation head +- **Statistical Matching**: distance-based matching to find similar donor observations +- **Ordinary Least Squares (OLS)**: linear regression imputation +- **Quantile Regression**: models conditional quantiles instead of the conditional mean +- **Quantile Random Forests (QRF)**: non-parametric, tree-based quantile estimation +- **Mixture Density Networks (MDN)**: neural network with a Gaussian mixture output -### Automated method selection -- **AutoImpute**: Automatically compares and selects the best imputation method for your data -- **Cross-validation**: Built-in evaluation using quantile loss (numerical) and log loss (categorical) -- **Variable type support**: Handles numerical, categorical, and boolean variables +## Autoimpute -### Developer-friendly design -- **Consistent API**: Standardized `fit()` and `predict()` interface across all models -- **Extensible architecture**: Easy to implement custom imputation methods -- **Weighted data handling**: Preserve data distributions with sample weights -- **Input validation**: Automatic parameter and data validation +The `autoimpute` function tunes hyperparameters, runs cross-validation across all five methods, and selects the best performer based on quantile loss (for numerical targets) or log loss (for categorical targets). It handles numerical, categorical, and boolean variables. -### Interactive dashboard -- **Visual exploration**: Analyze imputation results through interactive charts at https://microimpute-dashboard.vercel.app/ -- **GitHub integration**: Load artifacts directly from CI/CD workflows -- **Multiple data sources**: File upload, URL loading and sample data +## API + +All models follow a `fit()` / `predict()` interface. The package supports sample weights to account for survey design, and validates inputs automatically. Adding a custom imputation method is straightforward since new models just need to implement the same interface. + +## Documentation and paper + +- [Documentation](https://policyengine.github.io/microimpute/) with examples and interactive notebooks +- [Paper](https://github.com/PolicyEngine/microimpute/blob/main/paper/main.pdf) presenting microimpute and demonstrating it for SCF-to-CPS net worth imputation + +## Dashboard + +An interactive dashboard for exploring imputation results is available at https://microimpute-dashboard.vercel.app/. It supports file upload, URL loading, direct GitHub artifact integration, and sample data. ## Installation @@ -33,16 +33,12 @@ Microimpute enables variable imputation through a variety of statistical methods pip install microimpute ``` -For image export functionality (PNG/JPG), install with: +For image export (PNG/JPG): ```bash pip install microimpute[images] ``` -## Examples and documentation - -For detailed examples and interactive notebooks, see the [documentation](https://policyengine.github.io/microimpute/). - ## Contributing -Contributions are welcome to the project. Please feel free to submit a Pull Request with your improvements. +Pull requests are welcome. If you find a bug or have a feature idea, open an issue or submit a PR. diff --git a/paper/main.pdf b/paper/main.pdf index daeda5ed18b7a8b59e63d6e6d095536603be5529..6eb6047d2d8c920d321ab4a2d3eaed270b9a82f7 100644 GIT binary patch delta 4558 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 Date: Fri, 27 Feb 2026 14:39:57 +0530 Subject: [PATCH 3/5] documentation updating --- docs/_toc.yml | 2 - docs/autoimpute/autoimpute.ipynb | 1592 ++++++++--------- docs/autoimpute/index.md | 4 +- .../benchmarking-methods.ipynb | 170 +- .../cross-validation.md | 9 +- docs/imputation-benchmarking/index.md | 4 +- docs/imputation-benchmarking/metrics.md | 82 +- docs/imputation-benchmarking/preprocessing.md | 4 +- .../imputation-benchmarking/visualizations.md | 4 +- docs/index.md | 18 +- docs/models/imputer/implement-new-model.md | 54 +- docs/models/imputer/index.md | 8 +- docs/models/matching/index.md | 20 +- .../models/matching/matching-imputation.ipynb | 366 ++-- docs/models/mdn/index.md | 4 +- docs/models/mdn/mdn-imputation.ipynb | 781 ++++---- docs/models/ols/index.md | 10 +- docs/models/ols/ols-imputation.ipynb | 188 +- docs/models/qrf/index.md | 14 +- docs/models/qrf/qrf-imputation.ipynb | 154 +- docs/models/quantreg/index.md | 16 +- .../models/quantreg/quantreg-imputation.ipynb | 78 +- docs/myst.yml | 2 - docs/use_cases/index.md | 96 +- .../autoimpute_best_model_imputations.png | Bin 56963 -> 0 bytes .../autoimpute_model_comparison.png | Bin 53000 -> 0 bytes .../by_income_decile_comparisons.png | Bin 55602 -> 0 bytes .../imputations_model_comparison.png | Bin 90532 -> 0 bytes .../scf_to_cps/imputing-from-scf-to-cps.md | 924 ---------- 29 files changed, 1997 insertions(+), 2607 deletions(-) delete mode 100644 docs/use_cases/scf_to_cps/autoimpute_best_model_imputations.png delete mode 100644 docs/use_cases/scf_to_cps/autoimpute_model_comparison.png delete mode 100644 docs/use_cases/scf_to_cps/by_income_decile_comparisons.png delete mode 100644 docs/use_cases/scf_to_cps/imputations_model_comparison.png delete mode 100644 docs/use_cases/scf_to_cps/imputing-from-scf-to-cps.md diff --git a/docs/_toc.yml b/docs/_toc.yml index dc6d677..cffb6d3 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -38,5 +38,3 @@ parts: - caption: Use cases chapters: - file: use_cases/index - sections: - - file: use_cases/scf_to_cps/imputing-from-scf-to-cps diff --git a/docs/autoimpute/autoimpute.ipynb b/docs/autoimpute/autoimpute.ipynb index 988a9aa..59fde5a 100644 --- a/docs/autoimpute/autoimpute.ipynb +++ b/docs/autoimpute/autoimpute.ipynb @@ -68,7 +68,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -293,13 +293,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0fb0cd8da8ad4d65bf84cb943ebaf1c8", + "model_id": "08c1a0e8ab514a84a14be53225051e6b", "version_major": 2, "version_minor": 0 }, @@ -315,18 +315,11 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 7.3s finished\n", "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 1.0s finished\n", "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "R callback write-console: Warning: \n", - "R callback write-console: failed to download mirrors file (cannot open URL 'https://cran.r-project.org/CRAN_mirrors.csv'); using local file '/opt/homebrew/Cellar/r/4.5.0/lib/R/doc/CRAN_mirrors.csv'\n", - " \n", - "[Parallel(n_jobs=1)]: Done 1 tasks | elapsed: 1.6min\n", - "R callback write-console: Warning: \n", - "R callback write-console: failed to download mirrors file (cannot open URL 'https://cran.r-project.org/CRAN_mirrors.csv'); using local file '/opt/homebrew/Cellar/r/4.5.0/lib/R/doc/CRAN_mirrors.csv'\n", - " \n", - "R callback write-console: Warning: \n", - "R callback write-console: failed to download mirrors file (cannot open URL 'https://cran.r-project.org/CRAN_mirrors.csv'); using local file '/opt/homebrew/Cellar/r/4.5.0/lib/R/doc/CRAN_mirrors.csv'\n", - " \n" + "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 0.8s finished\n" ] }, { @@ -341,7 +334,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 5.2min finished\n" + "[Parallel(n_jobs=1)]: Done 1 tasks | elapsed: 1.1s\n", + "[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 1.2s finished\n" ] } ], @@ -375,7 +369,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -384,17 +378,17 @@ "text": [ "Cross-validation results for different imputation methods:\n", "\n", - "Model: QRF\n", - "quantile loss results: 0.0155\n", - "\n", "Model: OLS\n", - "quantile loss results: 0.0124\n", + "quantile loss results: 0.0126\n", "\n", "Model: QuantReg\n", - "quantile loss results: 0.0125\n", + "quantile loss results: 0.0126\n", + "\n", + "Model: QRF\n", + "quantile loss results: 0.0160\n", "\n", "Model: Matching\n", - "quantile loss results: 0.0231\n" + "quantile loss results: 0.0233\n" ] } ], @@ -415,14 +409,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Best performing method: \n" + "Best performing method: \n" ] } ], @@ -442,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -454,307 +448,285 @@ "data": [ { "alignmentgroup": "True", - "hovertemplate": "Method=QRF
Quantiles=%{x}
Test Quantile loss=%{y}", - "legendgroup": "QRF", + "error_y": { + "array": [ + 0.0000367764891179606, + 0.00005051876144414505, + 0.00018829257114425592, + 0.00037848750942190044, + 0.0005477958061141973, + 0.0006245017815431527, + 0.0006789805698947316, + 0.0007155653018236752, + 0.0007295643674175897, + 0.0007569494312623643, + 0.0008639491258964105, + 0.0009801026362712217, + 0.0010518961452707697, + 0.0010297648072906266, + 0.0009590446159744011, + 0.0008660289152915666, + 0.0007846310723713395, + 0.00065956869485099, + 0.0003346140844985172 + ] + }, + "hovertemplate": "Method=OLS
Quantiles=%{x}
Quantile loss=%{y}", + "legendgroup": "OLS", "marker": { - "color": "#636EFA", + "color": "#88CCEE", "pattern": { "shape": "" } }, - "name": "QRF", - "offsetgroup": "QRF", + "name": "OLS", + "offsetgroup": "OLS", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0.05", - "0.05", - "0.1", "0.1", "0.15", - "0.15", - "0.2", "0.2", "0.25", - "0.25", "0.3", - "0.3", - "0.35", "0.35", "0.4", - "0.4", - "0.45", "0.45", "0.5", - "0.5", "0.55", - "0.55", - "0.6", "0.6", "0.65", - "0.65", "0.7", - "0.7", - "0.75", "0.75", "0.8", - "0.8", "0.85", - "0.85", - "0.9", "0.9", - "0.95", "0.95" ], "xaxis": "x", "y": [ - 0.004631754564085741, - 0.004631754564085741, - 0.007341856096256823, - 0.007341856096256823, - 0.010956305360759139, - 0.010956305360759139, - 0.013853899253214152, - 0.013853899253214152, - 0.016765778862585467, - 0.016765778862585467, - 0.018170938524875734, - 0.018170938524875734, - 0.020431459700043803, - 0.020431459700043803, - 0.021268421552075877, - 0.021268421552075877, - 0.02152068721079699, - 0.02152068721079699, - 0.02150832954854852, - 0.02150832954854852, - 0.019861473819837334, - 0.019861473819837334, - 0.01995636925773867, - 0.01995636925773867, - 0.01894943399516724, - 0.01894943399516724, - 0.017987324791786673, - 0.017987324791786673, - 0.016858787546663905, - 0.016858787546663905, - 0.014928394018716465, - 0.014928394018716465, - 0.012899519430338449, - 0.012899519430338449, - 0.009831864043753134, - 0.009831864043753134, - 0.006811614968932836, - 0.006811614968932836 + 0.0037857585632115076, + 0.0064035381731015984, + 0.008682116948116709, + 0.010637028223496603, + 0.01228354449019281, + 0.013704743173963509, + 0.014829116089757849, + 0.01572984140710315, + 0.01635768192573994, + 0.016757835444730255, + 0.01698876716674359, + 0.016908544804384324, + 0.016466981551585432, + 0.01573902508984663, + 0.014655697638186978, + 0.013182752515157806, + 0.011274496133844888, + 0.008723043411546087, + 0.005424527941128667 ], "yaxis": "y" }, { "alignmentgroup": "True", - "hovertemplate": "Method=OLS
Quantiles=%{x}
Test Quantile loss=%{y}", - "legendgroup": "OLS", + "error_y": { + "array": [ + 0.00011053862485353776, + 0.00013152308789946208, + 0.00007328304807248766, + 0.00013761220727722502, + 0.000225390831825253, + 0.0002387781342265084, + 0.0003690300025792442, + 0.0004971448458544792, + 0.0006841372848715391, + 0.0007855762966044914, + 0.0008657286666497124, + 0.0009609612674453248, + 0.0010760799108166322, + 0.0011252152270869854, + 0.0012113725779785698, + 0.0011552041991586672, + 0.0008205546613073608, + 0.0006875490202660445, + 0.000559862252788657 + ] + }, + "hovertemplate": "Method=QuantReg
Quantiles=%{x}
Quantile loss=%{y}", + "legendgroup": "QuantReg", "marker": { - "color": "#EF553B", + "color": "#CC6677", "pattern": { "shape": "" } }, - "name": "OLS", - "offsetgroup": "OLS", + "name": "QuantReg", + "offsetgroup": "QuantReg", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ - "0.05", "0.05", "0.1", - "0.1", - "0.15", "0.15", "0.2", - "0.2", - "0.25", "0.25", "0.3", - "0.3", "0.35", - "0.35", - "0.4", "0.4", "0.45", - "0.45", "0.5", - "0.5", - "0.55", "0.55", "0.6", - "0.6", "0.65", - "0.65", - "0.7", "0.7", "0.75", - "0.75", - "0.8", "0.8", "0.85", - "0.85", "0.9", - "0.9", - "0.95", "0.95" ], "xaxis": "x", "y": [ - 0.003808647070946412, - 0.003808647070946412, - 0.006490379484883273, - 0.006490379484883273, - 0.008807739971118509, - 0.008807739971118509, - 0.010699017371221815, - 0.010699017371221815, - 0.012339891153334075, - 0.012339891153334075, - 0.013697475098254898, - 0.013697475098254898, - 0.014736873094883992, - 0.014736873094883992, - 0.015550928634621153, - 0.015550928634621153, - 0.016134574039820177, - 0.016134574039820177, - 0.016485493155635602, - 0.016485493155635602, - 0.016654564673178742, - 0.016654564673178742, - 0.016593511197972737, - 0.016593511197972737, - 0.016203732622264988, - 0.016203732622264988, - 0.015451587766895878, - 0.015451587766895878, - 0.014415220561443473, - 0.014415220561443473, - 0.013044914508801573, - 0.013044914508801573, - 0.011156959998495038, - 0.011156959998495038, - 0.008585027733878748, - 0.008585027733878748, - 0.005229999830606041, - 0.005229999830606041 + 0.003648297363886403, + 0.006220739206137793, + 0.008560805562643258, + 0.010594467066356217, + 0.012137407181277772, + 0.013580247763948514, + 0.014709634995905748, + 0.015584271813924223, + 0.01615515457661314, + 0.01660627579116468, + 0.016924948899226498, + 0.017013821272759678, + 0.016792947494266755, + 0.01604088566988471, + 0.01484899400756596, + 0.01347829835941078, + 0.011713354867882659, + 0.008831687333185652, + 0.005731739757859993 ], "yaxis": "y" }, { "alignmentgroup": "True", - "hovertemplate": "Method=QuantReg
Quantiles=%{x}
Test Quantile loss=%{y}", - "legendgroup": "QuantReg", + "error_y": { + "array": [ + 0.0002099742280199984, + 0.0005577204009778338, + 0.0005913787202045731, + 0.0006465761742329032, + 0.0006427657425320314, + 0.0009665112262689732, + 0.0004039564380447954, + 0.00046810196513831623, + 0.000920067680617316, + 0.0004569072602015561, + 0.0007209820742233905, + 0.0009019129537077271, + 0.000654822071277212, + 0.0002964891583124209, + 0.0008697756394143753, + 0.000869354334057907, + 0.0007434922481074839, + 0.0008949128843092795, + 0.0005736016727487648 + ] + }, + "hovertemplate": "Method=QRF
Quantiles=%{x}
Quantile loss=%{y}", + "legendgroup": "QRF", "marker": { - "color": "#00CC96", + "color": "#DDCC77", "pattern": { "shape": "" } }, - "name": "QuantReg", - "offsetgroup": "QuantReg", + "name": "QRF", + "offsetgroup": "QRF", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0.05", - "0.05", - "0.1", "0.1", "0.15", - "0.15", - "0.2", "0.2", "0.25", - "0.25", "0.3", - "0.3", - "0.35", "0.35", "0.4", - "0.4", "0.45", - "0.45", - "0.5", "0.5", "0.55", - "0.55", - "0.6", "0.6", "0.65", - "0.65", "0.7", - "0.7", - "0.75", "0.75", "0.8", - "0.8", "0.85", - "0.85", - "0.9", "0.9", - "0.95", "0.95" ], "xaxis": "x", "y": [ - 0.0037797191400323325, - 0.0037797191400323325, - 0.0065355258283926075, - 0.0065355258283926075, - 0.00877891950537431, - 0.00877891950537431, - 0.010730211151855228, - 0.010730211151855228, - 0.012356819692361727, - 0.012356819692361727, - 0.013725116901874718, - 0.013725116901874718, - 0.014793067048809186, - 0.014793067048809186, - 0.015515637986475386, - 0.015515637986475386, - 0.015911871896009084, - 0.015911871896009084, - 0.016247057308316024, - 0.016247057308316024, - 0.016486402970914003, - 0.016486402970914003, - 0.016660653134295333, - 0.016660653134295333, - 0.016356605390546602, - 0.016356605390546602, - 0.015780547245353785, - 0.015780547245353785, - 0.014807938631402215, - 0.014807938631402215, - 0.01340137722886329, - 0.01340137722886329, - 0.01153643264671414, - 0.01153643264671414, - 0.009016559672302424, - 0.009016559672302424, - 0.005650809365013223, - 0.005650809365013223 + 0.004958981353614306, + 0.007709876078177458, + 0.010610160150823023, + 0.013147576784275966, + 0.016230808947783, + 0.01765523354548008, + 0.020390817639546265, + 0.021631607060529953, + 0.022142205928372478, + 0.022393833653832424, + 0.021357150137205804, + 0.020907723382855792, + 0.019930544841328238, + 0.019095495355673266, + 0.01816255322567264, + 0.016320905888505866, + 0.01317617842711581, + 0.010650497941205097, + 0.0072062531829631795 ], "yaxis": "y" }, { "alignmentgroup": "True", - "hovertemplate": "Method=Matching
Quantiles=%{x}
Test Quantile loss=%{y}", + "error_y": { + "array": [ + 0.0019368529298846857, + 0.001756890524910662, + 0.0015769649797891588, + 0.0013970905356792654, + 0.0012172898458174732, + 0.0010376012524176477, + 0.0008580951787241413, + 0.0006789164152700594, + 0.0005004166749212909, + 0.0003237211525341078, + 0.00015512287742088833, + 0.00009066430412933424, + 0.0002393033878359685, + 0.0004137649009508685, + 0.0005916298348888364, + 0.0007705449475824869, + 0.0009499170265880006, + 0.0011295283905246845, + 0.0013092805654417116 + ] + }, + "hovertemplate": "Method=Matching
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "Matching", "marker": { - "color": "#AB63FA", + "color": "#117733", "pattern": { "shape": "" } @@ -766,85 +738,47 @@ "textposition": "auto", "type": "bar", "x": [ - "0.05", "0.05", "0.1", - "0.1", - "0.15", "0.15", "0.2", - "0.2", "0.25", - "0.25", - "0.3", "0.3", "0.35", - "0.35", "0.4", - "0.4", - "0.45", "0.45", "0.5", - "0.5", "0.55", - "0.55", - "0.6", "0.6", "0.65", - "0.65", - "0.7", "0.7", "0.75", - "0.75", "0.8", - "0.8", - "0.85", "0.85", "0.9", - "0.9", - "0.95", "0.95" ], "xaxis": "x", "y": [ - 0.023393616982767946, - 0.023393616982767946, - 0.02335740713728864, - 0.02335740713728864, - 0.023321197291809342, - 0.023321197291809342, - 0.02328498744633005, - 0.02328498744633005, - 0.023248777600850746, - 0.023248777600850746, - 0.02321256775537145, - 0.02321256775537145, - 0.023176357909892153, - 0.023176357909892153, - 0.023140148064412853, - 0.023140148064412853, - 0.023103938218933556, - 0.023103938218933556, - 0.02306772837345426, - 0.02306772837345426, - 0.02303151852797496, - 0.02303151852797496, - 0.022995308682495663, - 0.022995308682495663, - 0.022959098837016367, - 0.022959098837016367, - 0.022922888991537067, - 0.022922888991537067, - 0.02288667914605777, - 0.02288667914605777, - 0.022850469300578474, - 0.022850469300578474, - 0.022814259455099174, - 0.022814259455099174, - 0.022778049609619877, - 0.022778049609619877, - 0.02274183976414058, - 0.02274183976414058 + 0.02420659950459554, + 0.02410222421800216, + 0.023997848931408782, + 0.023893473644815394, + 0.023789098358222013, + 0.023684723071628624, + 0.023580347785035247, + 0.023475972498441865, + 0.02337159721184848, + 0.02326722192525509, + 0.02316284663866171, + 0.023058471352068326, + 0.022954096065474938, + 0.02284972077888156, + 0.022745345492288172, + 0.022640970205694794, + 0.02253659491910141, + 0.022432219632508025, + 0.022327844345914644 ], "yaxis": "y" } @@ -858,51 +792,51 @@ }, "tracegroupgap": 0 }, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "shapes": [ { "line": { - "color": "#636EFA", + "color": "#88CCEE", "dash": "dot", "width": 2 }, - "name": "QRF Mean", + "name": "OLS Mean", "type": "line", "x0": -0.5, "x1": 18.5, - "y0": 0.015501800660325096, - "y1": 0.015501800660325096 + "y0": 0.012554475825886228, + "y1": 0.012554475825886228 }, { "line": { - "color": "#EF553B", + "color": "#CC6677", "dash": "dot", "width": 2 }, - "name": "OLS Mean", + "name": "QuantReg Mean", "type": "line", "x0": -0.5, "x1": 18.5, - "y0": 0.012425607261487217, - "y1": 0.012425607261487217 + "y0": 0.01258810415704739, + "y1": 0.01258810415704739 }, { "line": { - "color": "#00CC96", + "color": "#DDCC77", "dash": "dot", "width": 2 }, - "name": "QuantReg Mean", + "name": "QRF Mean", "type": "line", "x0": -0.5, "x1": 18.5, - "y0": 0.012530066986573978, - "y1": 0.012530066986573978 + "y0": 0.01598307386973477, + "y1": 0.01598307386973477 }, { "line": { - "color": "#AB63FA", + "color": "#117733", "dash": "dot", "width": 2 }, @@ -910,8 +844,8 @@ "type": "line", "x0": -0.5, "x1": 18.5, - "y0": 0.02306772837345426, - "y1": 0.02306772837345426 + "y0": 0.023267221925255092, + "y1": 0.023267221925255092 } ], "template": { @@ -1743,7 +1677,11 @@ 0, 1 ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", "showgrid": false, + "showline": true, "title": { "font": { "size": 12 @@ -1758,12 +1696,16 @@ 0, 1 ], - "showgrid": false, + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true, "title": { "font": { "size": 12 }, - "text": "Test Quantile loss" + "text": "Quantile loss" }, "zeroline": false } @@ -1806,7 +1748,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -1844,28 +1786,28 @@ " \n", " \n", " 0\n", - " 0.020909\n", - " 0.036174\n", + " 0.015232\n", + " 0.013791\n", " \n", " \n", " 1\n", - " 0.004626\n", - " -0.021702\n", + " -0.015421\n", + " -0.006742\n", " \n", " \n", " 2\n", - " -0.018766\n", - " -0.004827\n", + " -0.005829\n", + " 0.008123\n", " \n", " \n", " 3\n", - " -0.025080\n", - " -0.045854\n", + " -0.027782\n", + " -0.007257\n", " \n", " \n", " 4\n", - " 0.000522\n", - " 0.021657\n", + " -0.029530\n", + " -0.002555\n", " \n", " \n", "\n", @@ -1873,14 +1815,14 @@ ], "text/plain": [ " s1 s4\n", - "0 0.020909 0.036174\n", - "1 0.004626 -0.021702\n", - "2 -0.018766 -0.004827\n", - "3 -0.025080 -0.045854\n", - "4 0.000522 0.021657" + "0 0.015232 0.013791\n", + "1 -0.015421 -0.006742\n", + "2 -0.005829 0.008123\n", + "3 -0.027782 -0.007257\n", + "4 -0.029530 -0.002555" ] }, - "execution_count": 23, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -1896,7 +1838,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -1942,68 +1884,68 @@ " \n", " \n", " 0\n", - " 0.085299\n", + " 0.063504\n", " 0.050680\n", - " 0.044451\n", - " -0.005670\n", - " -0.034194\n", - " -0.032356\n", - " 0.002861\n", - " -0.025930\n", - " 0.020909\n", - " 0.036174\n", + " -0.001895\n", + " 0.066629\n", + " 0.108914\n", + " 0.022869\n", + " -0.035816\n", + " 0.003064\n", + " 0.015232\n", + " 0.013791\n", " \n", " \n", " 1\n", - " 0.005383\n", + " -0.070900\n", " -0.044642\n", - " -0.036385\n", - " 0.021872\n", - " 0.015596\n", - " 0.008142\n", - " -0.031988\n", - " -0.046641\n", - " 0.004626\n", - " -0.021702\n", + " 0.039062\n", + " -0.033213\n", + " -0.034508\n", + " -0.024993\n", + " 0.067737\n", + " -0.013504\n", + " -0.015421\n", + " -0.006742\n", " \n", " \n", " 2\n", - " -0.045472\n", + " 0.005383\n", " 0.050680\n", - " -0.047163\n", - " -0.015999\n", - " -0.024800\n", - " 0.000779\n", - " -0.062917\n", - " -0.038357\n", - " -0.018766\n", - " -0.004827\n", + " -0.001895\n", + " 0.008101\n", + " -0.015719\n", + " -0.002903\n", + " 0.038394\n", + " -0.013504\n", + " -0.005829\n", + " 0.008123\n", " \n", " \n", " 3\n", - " -0.096328\n", - " -0.044642\n", - " -0.083808\n", - " 0.008101\n", - " -0.090561\n", - " -0.013948\n", - " -0.062917\n", - " -0.034215\n", - " -0.025080\n", - " -0.045854\n", + " -0.085430\n", + " 0.050680\n", + " -0.022373\n", + " 0.001215\n", + " -0.026366\n", + " 0.015505\n", + " -0.072133\n", + " -0.017646\n", + " -0.027782\n", + " -0.007257\n", " \n", " \n", " 4\n", - " 0.027178\n", + " -0.067268\n", " 0.050680\n", - " 0.017506\n", - " -0.033213\n", - " 0.045972\n", - " -0.065491\n", - " -0.096435\n", - " -0.059067\n", - " 0.000522\n", - " 0.021657\n", + " -0.012673\n", + " -0.040099\n", + " 0.004636\n", + " -0.058127\n", + " 0.019196\n", + " -0.034215\n", + " -0.029530\n", + " -0.002555\n", " \n", " \n", "\n", @@ -2011,14 +1953,14 @@ ], "text/plain": [ " age sex bmi bp s2 s3 s5 s6 s1 s4\n", - "0 0.085299 0.050680 0.044451 -0.005670 -0.034194 -0.032356 0.002861 -0.025930 0.020909 0.036174\n", - "1 0.005383 -0.044642 -0.036385 0.021872 0.015596 0.008142 -0.031988 -0.046641 0.004626 -0.021702\n", - "2 -0.045472 0.050680 -0.047163 -0.015999 -0.024800 0.000779 -0.062917 -0.038357 -0.018766 -0.004827\n", - "3 -0.096328 -0.044642 -0.083808 0.008101 -0.090561 -0.013948 -0.062917 -0.034215 -0.025080 -0.045854\n", - "4 0.027178 0.050680 0.017506 -0.033213 0.045972 -0.065491 -0.096435 -0.059067 0.000522 0.021657" + "0 0.063504 0.050680 -0.001895 0.066629 0.108914 0.022869 -0.035816 0.003064 0.015232 0.013791\n", + "1 -0.070900 -0.044642 0.039062 -0.033213 -0.034508 -0.024993 0.067737 -0.013504 -0.015421 -0.006742\n", + "2 0.005383 0.050680 -0.001895 0.008101 -0.015719 -0.002903 0.038394 -0.013504 -0.005829 0.008123\n", + "3 -0.085430 0.050680 -0.022373 0.001215 -0.026366 0.015505 -0.072133 -0.017646 -0.027782 -0.007257\n", + "4 -0.067268 0.050680 -0.012673 -0.040099 0.004636 -0.058127 0.019196 -0.034215 -0.029530 -0.002555" ] }, - "execution_count": 24, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -2040,7 +1982,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -2194,138 +2136,138 @@ 132 ], "y": [ - -0.04559945128264711, - 0.003934851612593237, - -0.04009563984984263, - -0.10338947132709418, - -0.007072771253015731, + 0.09061988167926385, + -0.012576582685820214, -0.004320865536613489, - 0.017694380194604446, - 0.024574144485610048, - 0.0342058144930179, - -0.0029449126784123676, - -0.0029449126784123676, - -0.04284754556624487, + -0.037343734133440394, + -0.015328488402222454, + -0.04009563984984263, -0.038719686991641515, - -0.04422349842444599, - -0.0249601584096303, - -0.04972730985725048, - 0.020446285911006685, + -0.0579830270064572, + 0.0025588987543921156, + -0.046975404140848234, 0.0025588987543921156, - -0.04147159270804375, 0.01219056876179996, - -0.0318399227006359, - 0.06447677737344255, + 0.020446285911006685, + -0.007072771253015731, + -0.08962994274508297, + 0.01219056876179996, -0.04422349842444599, - -0.011200629827619093, - -0.02083229983502694, + 0.005310804470794357, -0.005696818394814609, - -0.033215875558837024, 0.03833367306762126, + -0.011200629827619093, -0.12678066991651324, - -0.06761469701386505, - 0.0025588987543921156, 0.010814615903598841, -0.05935897986465832, + -0.051103262715451604, + 0.06310082451524143, -0.0318399227006359, -0.030463969842434782, - -0.00019300696201012598, - 0.06034891879883919, - 0.001182945896190995, - -0.019456346976825818, - 0.0080627101871966, + 0.005310804470794357, + 0.02182223876920781, + 0.041085578784023497, + -0.04559945128264711, + 0.014942474478202204, + 0.06447677737344255, + 0.02319819162740893, 0.04383748450042574, - -0.033215875558837024, - -0.0029449126784123676, - -0.019456346976825818, - 0.01219056876179996, + 0.03833367306762126, + -0.005696818394814609, + 0.00943866304539772, -0.015328488402222454, - -0.0318399227006359, - -0.030463969842434782, + -0.034591828417038145, + 0.0342058144930179, 0.020446285911006685, 0.014942474478202204, - -0.02083229983502694, - 0.027326050202012293, - 0.02182223876920781, - -0.09650970703608859, - 0.02319819162740893, - -0.07587041416307178, - -0.07999827273767514, - -0.051103262715451604, + -0.008448724111216851, + 0.039709625925822375, + 0.001182945896190995, + -0.037343734133440394, + 0.03833367306762126, + -0.0318399227006359, + -0.011200629827619093, + -0.019456346976825818, + 0.039709625925822375, + 0.0741084473808504, + 0.06998058880624704, 0.03282986163481677, 0.05209320164963247, - 0.01219056876179996, + 0.126394655992493, + -0.027712064126032544, + 0.024574144485610048, 0.017694380194604446, + -0.051103262715451604, + 0.04934129593323023, + -0.001568959820211247, + 0.04658939021682799, + -0.005696818394814609, + -0.04835135699904936, + -0.015328488402222454, + -0.04009563984984263, -0.0249601584096303, - 0.053469154507833586, - -0.05385516843185383, -0.00019300696201012598, 0.15391371315651542, - 0.039709625925822375, - -0.02358420555142918, - 0.07961225881365488, + 0.006686757328995478, + -0.05935897986465832, -0.035967781275239266, - -0.04972730985725048, - 0.0025588987543921156, - 0.04934129593323023, - -0.007072771253015731, - -0.013952535544021335, - 0.04246153164222462, - -0.04284754556624487, - -0.02220825269322806, - 0.12501870313429186, - -0.05385516843185383, - 0.053469154507833586, - 0.06172487165704031, - -0.04972730985725048, - -0.016704441260423575, + 0.1277706088506941, + 0.006686757328995478, + 0.03558176735121902, + 0.016318427336403322, + 0.020446285911006685, + 0.0741084473808504, -0.026336111267831423, + 0.08786797596286161, + -0.04422349842444599, + -0.06623874415566393, + 0.04383748450042574, + -0.04972730985725048, + 0.020446285911006685, + -0.005696818394814609, 0.07686035309725264, - -0.07311850844666953, - -0.009824676969417972, - 0.030077955918414535, + -0.008448724111216851, + 0.03282986163481677, + 0.03145390877661565, 0.05484510736603471, - 0.07823630595545376, - -0.007072771253015731, - -0.027712064126032544, + 0.024574144485610048, + 0.06034891879883919, + 0.07273249452264928, + 0.024574144485610048, + -0.029088016984233665, + -0.0029449126784123676, + -0.011200629827619093, 0.001182945896190995, - 0.09199583453746497, - 0.07548440023905152, -0.007072771253015731, - 0.1277706088506941, - -0.012576582685820214, + 0.04246153164222462, + -0.004320865536613489, 0.10988322169407955, - 0.0080627101871966, - -0.013952535544021335, - -0.04284754556624487, - -0.046975404140848234, + -0.037343734133440394, + -0.016704441260423575, + 0.006686757328995478, 0.00943866304539772, 0.041085578784023497, - 0.030077955918414535, - 0.02182223876920781, + -0.001568959820211247, -0.06623874415566393, - 0.11951489170148738, + 0.03558176735121902, + 0.017694380194604446, + 0.02182223876920781, + 0.041085578784023497, + -0.034591828417038145, + -0.037343734133440394, + 0.03145390877661565, + 0.05622106022423583, 0.014942474478202204, - -0.005696818394814609, - -0.060734932722859444, - -0.02358420555142918, - -0.06348683843926169, - -0.04972730985725048, - -0.011200629827619093, - -0.046975404140848234, - 0.016318427336403322, - -0.018080394118624697, 0.010814615903598841, - -0.0029449126784123676, - -0.06623874415566393, + 0.10988322169407955, + 0.09887559882847057, + 0.001182945896190995, 0.07823630595545376, - 0.03833367306762126, -0.10063756561069194, - 0.03558176735121902, 0.04658939021682799, + 0.02182223876920781, 0.05759701308243695, - -0.005696818394814609, - -0.037343734133440394, + 0.04658939021682799, 0.08374011738825825 ] }, @@ -2473,139 +2415,139 @@ 132 ], "y": [ - 0.02090924803691378, - 0.004626123494339312, - -0.018766371041145515, - -0.025079773212822724, - 0.0005221962276462163, - 0.0023782190339952007, - 0.008649160755021803, - 0.014061356781762173, - 0.0254923032629858, - -0.011912383665013354, - -0.018407832152535906, - 0.024214427396466377, - -0.02256780214714429, - 0.004919903247914598, - -0.008170622618974065, - -0.018548330310735238, - -0.007105185961827832, - 0.012008661347633834, - 0.018618084713260215, - 0.011580347815175038, - -0.007449829402368672, - 0.01264639252518127, - -0.019867269093045897, - -0.015250402274648698, - -0.010913040915993408, - 0.003691389849940784, - -0.0024928165805605546, - -0.0007776304487895633, - 0.006325872630235647, - -0.005115114618450097, - -0.028534716572419568, - -0.005768925548395457, - -0.013047736065762188, - -0.028820647738861192, - -0.0035482860212044933, - -0.018530818319814676, - 0.004165370131410912, - 0.006749368070504823, - 0.0019226569832983451, - 0.02264996119206698, - 0.020792167630816705, - -0.0038184998660977126, - 0.011053015302265596, - -0.037005112578249275, - -0.01585513668744488, - 0.02560374181865984, - 0.02982157455613024, - 0.016710154185276348, - 0.006970480052674291, - -0.004867785078419127, - -0.021188768112257218, - 0.015228956794648838, - 0.031766761148240404, - -0.004424832962744514, - 0.012040504341003278, - -0.021868959740455263, - -0.014030859836463884, - -0.012065482400146238, - -0.012421658895909645, - 0.008993450695372609, - 0.014045154218359003, - 0.026886444708028364, - 0.03098052571069148, - 0.013277525924978313, - -0.0016929388165091135, - 0.02107173313979645, - -0.013609680442188583, - -0.0005291128611427387, - 0.012633195111147563, - 0.01585177092183963, - 0.01592201625116141, - -0.013505588816878359, - -0.029989934542940452, - 0.024035107762849686, - -0.0036208937433724725, - 0.00986821795135186, - -0.0025563066174634427, - 0.015401158704997121, - -0.0017121976478600984, - 0.0191111920844166, - -0.010060858295794301, - -0.020294974572644696, - 0.03240917262316084, - -0.002681574554502042, - 0.00011636986553689114, - 0.005574322230719957, - 0.013739407286284734, - -0.0066654621851517035, - -0.001037285439235573, - 0.028032372378139492, - 0.04316051018347186, - 0.012379703775175534, - 0.002297693317367038, - -0.0097459261449615, - -0.002440354209744388, - -0.00032389027157234823, - -0.00040304651144529, - 0.023079074995717545, - 0.0069802916130410056, - -0.008488594622839591, - 0.0011337923289514538, - -0.00845554673950999, - 0.012251890585047658, - 0.016676498249086746, - -0.01474459352050577, - 0.0050141833128581155, - -0.0021218581167275433, - 0.014514906599180545, - -0.0023141889635125527, - -0.01592533089818831, - 0.007626497719330275, - 0.007189881329180314, - 0.0014891685535230936, - 0.019136067420616056, - 0.015459647789467304, - 0.010780314394988014, - -0.019002304466773874, - -0.017332340171545398, - 0.009044765347958866, - 0.022799569535975638, - 0.0174367303520582, - -0.013712887832598355, - 0.021126195472609306, - -0.015975502568585168, - -0.0028846246835958628, - 0.0020442019813950094, - -0.03266377372798207, - 0.03286550024138621, - -0.013566458567642754, - 0.008925403172101965, - 0.02019472487087253, - 0.009589831559328486, - -0.028183039372319 + 0.015231685126095648, + -0.015421076522561732, + -0.005828944561737012, + -0.027782168227463364, + -0.0295299254606757, + -0.005044688697438994, + -0.027131385829086006, + -0.014967919098312174, + -0.018483150909256105, + -0.01901799646632892, + 0.0019843111862389486, + 0.006493388405783137, + -0.006212982280698071, + -0.02150559103893539, + -0.02260473952565378, + 0.0049281533846481825, + -0.02442570645715391, + -0.01064156355108878, + -0.004259935401689829, + -0.008386295263997364, + -0.018015115574451734, + 0.0007205377946915463, + -0.013088402487870042, + -0.014816805743643826, + -0.03829371114792571, + 0.00926588506800341, + -0.03464258186869676, + -0.008082039196945013, + 0.011364869658653243, + 0.0009835337264478081, + 0.011194546620714103, + -0.03700414327288421, + 0.008013545770845095, + -0.014911745323678609, + -0.016557630340603, + 0.015794064646605606, + -0.003318999321802166, + -0.023694428109623075, + 0.0037830236465225455, + 0.022283588751957895, + 0.020259778298767666, + -0.007782211098720479, + 0.001633485541469888, + -0.00336730837946193, + -0.00196576220854981, + -0.0037485742600287713, + -0.023103696888923084, + -0.02538158359937403, + 0.010877528444466239, + 0.003396870126202189, + -0.00931576420516173, + -0.02393598933865847, + -0.022060080451219353, + 0.007751428520500037, + -0.017131675982750533, + -0.016893899230157834, + 0.0016655963268504305, + 0.014312087552817005, + 0.01972723784114364, + -0.005721194774450792, + 0.022818103401221923, + 0.008053488228865244, + 0.018756167519343916, + -0.013320754164637287, + 0.034324781399503214, + -0.024136787863848923, + -0.009247336090314272, + -0.01918941549182599, + 0.010341943198896466, + -0.038897981926843614, + 0.010881436382772332, + -0.01566089827165408, + 0.020615764532841765, + 0.013009030249356294, + 0.0073269433667188175, + 0.006450426551069444, + -0.002280843953683123, + 0.020357206907443796, + 0.020805411773395996, + 0.02742199422986559, + 0.011743537467864502, + -0.0027340598135190738, + 0.011738907246611663, + -0.016267946667548862, + 0.002143508330794054, + 0.007558658619120678, + -0.007106225052230407, + -0.0011209748205877786, + -0.019965748788626093, + 0.003937343011525476, + -0.0213359342001851, + 0.01935601032943401, + -0.010330455512844257, + 0.03782723369570142, + 0.0146552688808932, + 0.013230530856790384, + -0.004987096013140689, + 0.0333764888489525, + -0.00968681496343167, + 0.004587070452381084, + 0.005656357169409813, + -0.023245933365898277, + 0.015162951494691587, + 0.0026953573522491715, + 0.0017848887739108383, + -0.00334948187707321, + -0.021721428589336345, + -0.010634357965284093, + 0.0055700317473139855, + -0.0009479228487899657, + -0.0020297213245332613, + -0.013546639944096802, + -0.018097376394800455, + 0.01808774523221887, + 0.012340078071508173, + -0.020561983875713168, + -0.0017113426742070572, + -0.01261277549337654, + -0.03618135352270031, + 0.02271639240732281, + -0.010989417897220211, + 0.03516725603493444, + -0.015797770140132998, + 0.00854976213952673, + -0.0064595754436547435, + -0.0008266335032858316, + -0.005144033539497858, + -0.03487386294915826, + -0.017215007399405, + -0.01813056307774026, + 0.007110999760004685, + -0.01887035231907848, + -0.032472689994759454 ] } ], @@ -3602,138 +3544,138 @@ 132 ], "y": [ + 0.01770335448356722, -0.002592261998183278, -0.002592261998183278, -0.03949338287409329, + 0.03430885887772673, + -0.03949338287409329, -0.0763945037500033, - 0.07120997975363674, -0.03949338287409329, + -0.002592261998183278, -0.03949338287409329, -0.03949338287409329, - 0.03430885887772673, + -0.002592261998183278, -0.03949338287409329, -0.03949338287409329, -0.0763945037500033, -0.0763945037500033, - -0.0763945037500033, - -0.03949338287409329, - 0.01585829843977173, - -0.0763945037500033, - -0.03949338287409329, - -0.002592261998183278, - -0.002592261998183278, - 0.0029429061332032365, - -0.002592261998183278, 0.07120997975363674, - -0.03949338287409329, 0.07120997975363674, -0.0018542395806650938, - -0.002592261998183278, 0.03430885887772673, - -0.047980640675552584, - -0.002592261998183278, -0.002592261998183278, + -0.047980640675552584, 0.03430885887772673, -0.03949338287409329, + -0.002592261998183278, + -0.03949338287409329, -0.03949338287409329, -0.0763945037500033, -0.03949338287409329, - -0.002592261998183278, - 0.05017634085436802, + 0.03430885887772673, + 0.03430885887772673, -0.03949338287409329, 0.03430885887772673, + 0.10811110062954676, + 0.03430885887772673, 0.07120997975363674, - -0.002592261998183278, - -0.002592261998183278, -0.03949338287409329, -0.03949338287409329, + 0.03430885887772673, -0.002592261998183278, -0.002592261998183278, - -0.002592261998183278, + 0.13025177315509276, 0.07120997975363674, 0.02545258986750832, - 0.07120997975363674, -0.03949338287409329, - 0.03910600459159503, - -0.03949338287409329, - 0.08006624876385515, - -0.0763945037500033, + 0.10811110062954676, + -0.007020396503292483, -0.03949338287409329, + 0.03430885887772673, -0.03949338287409329, + 0.03430885887772673, + 0.03430885887772673, + 0.10811110062954676, + -0.002592261998183278, + 0.07120997975363674, -0.002592261998183278, -0.021411833644897377, + 0.03430885887772673, + 0.03430885887772673, + 0.03430885887772673, + 0.03430885887772673, + 0.03430885887772673, -0.03949338287409329, + -0.03949338287409329, + -0.002592261998183278, 0.03430885887772673, -0.03949338287409329, - 0.14501222150545676, + -0.002592261998183278, + 0.03430885887772673, -0.03949338287409329, -0.05056371913686628, 0.07194800217115493, - 0.056080520194513636, - -0.03949338287409329, + -0.012555564634678981, + 0.012906208769698923, + 0.07120997975363674, + 0.10811110062954676, + 0.08080427118137334, + -0.0763945037500033, 0.03430885887772673, 0.07120997975363674, - -0.03949338287409329, - -0.03949338287409329, 0.07120997975363674, -0.03949338287409329, - 0.005156973385757823, - -0.0763945037500033, - -0.002592261998183278, - -0.002592261998183278, + 0.03430885887772673, + -0.03949338287409329, -0.002592261998183278, - -0.0763945037500033, - 0.07120997975363674, -0.002592261998183278, -0.0708593356186168, - -0.002592261998183278, + 0.0003598276718895252, -0.03949338287409329, 0.07120997975363674, - -0.06938329078358041, - -0.002592261998183278, + 0.07120997975363674, + 0.03430885887772673, -0.03949338287409329, 0.14132210941786577, + 0.15534453535071155, 0.10811110062954676, - 0.03430885887772673, - -0.03949338287409329, - -0.03949338287409329, - 0.14501222150545676, + 0.08486339447772344, -0.002592261998183278, -0.002592261998183278, 0.07120997975363674, + 0.03430885887772673, + -0.002592261998183278, -0.002592261998183278, 0.03430885887772673, + -0.03949338287409329, + 0.03430885887772673, -0.002592261998183278, -0.002592261998183278, - -0.0763945037500033, - 0.028404679537581124, + 0.03430885887772673, -0.002592261998183278, 0.07120997975363674, - 0.03430885887772673, - 0.03430885887772673, -0.03949338287409329, - 0.08670845052151895, - 0.07120997975363674, + -0.03949338287409329, + -0.002592261998183278, 0.03430885887772673, - -0.03395821474270679, -0.002592261998183278, - -0.03949338287409329, -0.002592261998183278, + -0.0763945037500033, -0.03949338287409329, - -0.02583996815000658, + 0.02360753382371283, + 0.07120997975363674, -0.002592261998183278, -0.03949338287409329, - -0.03949338287409329, - 0.003311917341962329, - -0.03949338287409329, + 0.09187460744414634, -0.002592261998183278, - 0.10811110062954676, - -0.0763945037500033, 0.03430885887772673, + -0.002592261998183278, + -0.0763945037500033, -0.024732934523729287, + 0.03430885887772673, 0.023238522614953735, - -0.002592261998183278, - -0.011079519799642579, + -0.03949338287409329, -0.03949338287409329 ] }, @@ -3881,139 +3823,139 @@ 132 ], "y": [ - 0.036173881319049764, - -0.021702339029765656, - -0.004827344613356406, - -0.04585371324963408, - 0.021657333531173127, - -0.019557492599216835, - -0.016391484441786622, - 0.004826645265102516, - 0.026677561541063308, - -0.020494778395885635, - -0.019045046146368566, - 0.020546868283924196, - -0.03767286475161845, - -0.025381010739657484, - -0.010055873741307193, - 0.006350417632745559, - -0.019896188609062136, - 0.006649615916558177, - 0.02621139123628575, - -0.014090746522772122, - -0.001262154321621097, - 0.011773637398311868, - 0.011258135449664754, - 0.008944049563999953, - 0.006999038596481625, - 0.012591280717550547, - 0.006376848293006614, - 0.009152159296335255, - 0.024846242702600232, - -0.030649754557607656, - -0.03226696508115764, - 0.007357869247591211, - -0.012233157667270823, - -0.005235643701531674, - -0.019963033597623834, - -0.02294552944805546, - -0.004610187191359073, - 0.014874207825065582, - -0.02541069014530403, - 0.0007426496564170359, - 0.04671645093525994, - 0.011725793349133122, - 0.046377763208378976, - -0.04412613967921996, - -0.003307935367806759, - 0.010059493995214983, - 0.057837475697029336, - 0.02464075426683707, - 0.03232886503700636, - 0.015181239790241672, - 0.007730755650970042, - -0.01288826786920192, - 0.019209494823279768, - 0.017901355466069357, - 0.0010382296741955493, - -0.03525362630963111, - -0.0010484738172200827, - -0.034411594412093106, - -0.029311390546604275, - -0.026183464604745584, - 0.006211365730593833, - 0.007955487839617569, - 0.009444435976199097, - 0.029891333441255042, - 0.006322089058982078, - 0.01240042724866708, - 0.03372764125476694, - 0.01563560428520054, - 0.004682485638364525, - -0.005096275037787555, - 0.016834842476349577, - 0.02777791931447148, - -0.04590318168669977, - 0.039194821530438365, - -0.03277665344423763, - -0.02034178179038435, - -0.021864092307613023, - 0.022562752824849954, - 0.011182533788756978, - 0.0013496505057414734, - -0.03312248173854206, - 0.026222471799173384, - 0.0035463695703147743, - -0.018847397811071878, - 0.006249373998074355, - -0.027683935756017426, - 0.00739858101231083, - -0.02736892056924086, - 0.0003022669656364365, - -0.0007816308585437103, - 0.01700147809620549, - -0.0061187072597464025, - 0.014402384577943744, - -0.0046736485052005, - -0.02700606133328556, - 0.014764184029720314, - -0.013134114176875222, - 0.028808489012539, - 0.02254331768624029, - 0.005034238597544158, - 0.02928319889004928, - 0.0029064231086462057, - -0.001784491148696758, - -0.00893612903310391, - 0.0030842824733004984, - -0.021545185329186856, - 0.056749951384627524, - 0.07189639275286117, - 0.015165622525579, - -0.02023890492078882, - 0.011598392971903482, - 0.020595548628953693, - 0.01685751810776878, - 0.0014485791272968842, - 0.012291320055589793, - 0.012358662118871731, - -0.012061731114809418, - 0.011744440395706587, - -0.009350081063623469, - 0.02917756393068547, - 0.006130601782959003, - -0.01613858615607142, - 0.017689170808935114, - -0.032720269822326155, - 0.03713214633579796, - 0.003601191679832815, - -0.03355297405509526, - 0.051788117379947894, - -0.02597487243898064, - 0.008109666350814736, - 0.0271125648455035, - 0.013573789266825956, - -0.04185854704123922 + 0.013791087535585032, + -0.0067415479818104754, + 0.008122595600109256, + -0.007257066606169001, + -0.0025554928421562782, + -0.01730642961557491, + -0.03973989461680715, + -0.035215263664104976, + 0.012493718436498158, + -0.023285725079843646, + -0.000379727084753736, + -0.019743775483154393, + -0.009392833506987743, + -0.035302615781131336, + -0.03905225690190696, + -0.03256533884487734, + 0.005676995172456719, + -0.003969962854634164, + 0.006605608754211003, + 0.0022337245636956634, + -0.003705667926297255, + 0.0160131771773543, + 0.0012497484695890783, + -0.014183640472615826, + -0.024897592873238887, + -0.01193835158341511, + -0.011352501675463188, + -0.02211270494407038, + -0.01327963980677072, + 0.014679377827269066, + 0.028201762472852287, + -0.0497156513407594, + 0.015564039073432956, + 0.0059047509621594245, + -0.0002891958481750804, + 0.0413585013037903, + 0.010549489171225434, + -0.04074701058422851, + -0.00726694018568288, + 0.0049352105579747434, + 0.010367920997501279, + 0.00007617849551178838, + 0.0272796380000965, + 0.013649300291033686, + -0.015212767758098487, + 0.00543914128208987, + -0.03867304908811106, + -0.04146073514129962, + 0.037180730183873835, + -0.021689236815534446, + 0.006731851807441467, + -0.004709125236394509, + 0.015675703756764758, + -0.014059228838315884, + 0.006718223688295505, + -0.0325135193563347, + -0.029345864135223824, + 0.016299251273056356, + 0.020736592779718496, + 0.01752768688371003, + 0.0036211377320435026, + 0.00582584141816508, + -0.006378574065545362, + -0.03888936237339751, + 0.0046740506114529325, + -0.04102493363171138, + -0.0036541432594371158, + -0.031746617901640996, + 0.02287841546841343, + -0.017455500382433535, + 0.004170520880805757, + 0.02950946182329947, + 0.004286409933083225, + 0.00949468220189915, + 0.00848214300974643, + -0.0003506567655354102, + 0.00622718589199493, + -0.023382695759762345, + 0.052460227354301635, + 0.04570683846266361, + 0.008142368340912764, + 0.003042472748240509, + -0.009428181419382162, + -0.03414234589319587, + 0.004322787221553486, + 0.008760128728215626, + -0.021232834359493004, + 0.012613683896552527, + 0.016963752411511428, + -0.0011747844791662968, + -0.006854960778212722, + 0.03271464639099751, + -0.020651434806323598, + 0.013655494578349706, + 0.0325822587161095, + 0.01240140962718438, + 0.004465601030109772, + 0.033314444821553636, + 0.005823579974981913, + 0.02011640909906851, + 0.006129851307818842, + -0.03152688781818483, + 0.02140947382021927, + 0.014218926009913056, + -0.018311539156434627, + 0.02234257426494738, + -0.001616018921944109, + 0.0205886244053183, + 0.013896438117549436, + -0.024496748572054607, + 0.05235423105172521, + -0.032992757155550216, + -0.024303522197554835, + 0.01212643354855765, + 0.03392301443916518, + -0.006049284904496647, + -0.007631149465924967, + -0.028761809138011133, + -0.04800248232671432, + -0.02509379567625947, + -0.00009153975376653429, + 0.023345773261553425, + -0.01910895717320799, + 0.017869477687563542, + -0.02194514854495601, + -0.024607711275376646, + 0.029117388128151366, + -0.035875224977058126, + -0.029496018124353707, + -0.03515240882947335, + 0.006314919004553546, + -0.03774485237314226, + -0.044343789309302856 ] } ], @@ -4919,13 +4861,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "5dfb811d4a2b457c80f89229f35c4d88", + "model_id": "4798c8e161a24d56ac7449decf7a734f", "version_major": 2, "version_minor": 0 }, @@ -4941,11 +4883,12 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 5.7s finished\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 1.6s finished\n", "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 2.9s finished\n", - "[Parallel(n_jobs=1)]: Done 1 tasks | elapsed: 4.0s\n", - "[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 10.3s finished\n" + "[Parallel(n_jobs=-1)]: Batch computation too fast (0.1265852451324463s.) Setting batch_size=2.\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 0.1s finished\n", + "[Parallel(n_jobs=1)]: Done 1 tasks | elapsed: 0.1s\n", + "[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.1s finished\n" ] }, { @@ -4976,28 +4919,28 @@ " \n", " \n", " 0\n", - " 0.020909\n", - " 0.036174\n", + " 0.015232\n", + " 0.013791\n", " \n", " \n", " 1\n", - " 0.004626\n", - " -0.021702\n", + " -0.015421\n", + " -0.006742\n", " \n", " \n", " 2\n", - " -0.018766\n", - " -0.004827\n", + " -0.005829\n", + " 0.008123\n", " \n", " \n", " 3\n", - " -0.025080\n", - " -0.045854\n", + " -0.027782\n", + " -0.007257\n", " \n", " \n", " 4\n", - " 0.000522\n", - " 0.021657\n", + " -0.029530\n", + " -0.002555\n", " \n", " \n", " ...\n", @@ -5006,28 +4949,28 @@ " \n", " \n", " 128\n", - " -0.013566\n", - " -0.025975\n", + " -0.017215\n", + " -0.029496\n", " \n", " \n", " 129\n", - " 0.008925\n", - " 0.008110\n", + " -0.018131\n", + " -0.035152\n", " \n", " \n", " 130\n", - " 0.020195\n", - " 0.027113\n", + " 0.007111\n", + " 0.006315\n", " \n", " \n", " 131\n", - " 0.009590\n", - " 0.013574\n", + " -0.018870\n", + " -0.037745\n", " \n", " \n", " 132\n", - " -0.028183\n", - " -0.041859\n", + " -0.032473\n", + " -0.044344\n", " \n", " \n", "\n", @@ -5036,22 +4979,22 @@ ], "text/plain": [ " s1 s4\n", - "0 0.020909 0.036174\n", - "1 0.004626 -0.021702\n", - "2 -0.018766 -0.004827\n", - "3 -0.025080 -0.045854\n", - "4 0.000522 0.021657\n", + "0 0.015232 0.013791\n", + "1 -0.015421 -0.006742\n", + "2 -0.005829 0.008123\n", + "3 -0.027782 -0.007257\n", + "4 -0.029530 -0.002555\n", ".. ... ...\n", - "128 -0.013566 -0.025975\n", - "129 0.008925 0.008110\n", - "130 0.020195 0.027113\n", - "131 0.009590 0.013574\n", - "132 -0.028183 -0.041859\n", + "128 -0.017215 -0.029496\n", + "129 -0.018131 -0.035152\n", + "130 0.007111 0.006315\n", + "131 -0.018870 -0.037745\n", + "132 -0.032473 -0.044344\n", "\n", "[133 rows x 2 columns]" ] }, - "execution_count": 26, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -5093,13 +5036,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "99f2a175dec14d80be25b0042cf5fe39", + "model_id": "4e0b2ffc1515464dbc2e2f23be9f28ff", "version_major": 2, "version_minor": 0 }, @@ -5115,20 +5058,21 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 1.2s finished\n", + "[Parallel(n_jobs=-1)]: Batch computation too fast (0.1340169906616211s.) Setting batch_size=2.\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 0.1s finished\n", "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 0.2s finished\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 0.4s finished\n", "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 1.0s finished\n", - "[Parallel(n_jobs=1)]: Done 1 tasks | elapsed: 3.4s\n", - "[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 9.3s finished\n" + "[Parallel(n_jobs=-1)]: Done 3 out of 3 | elapsed: 0.8s finished\n", + "[Parallel(n_jobs=1)]: Done 1 tasks | elapsed: 0.0s\n", + "[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.1s finished\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Imputation results available for models: dict_keys(['best_method', 'QRF', 'QuantReg', 'Matching'])\n", + "Imputation results available for models: dict_keys(['best_method', 'QuantReg', 'QRF', 'Matching'])\n", "The best performing model is: OLSResults\n" ] } @@ -5157,7 +5101,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pe3.13", + "display_name": "pe3.13 (3.13.0)", "language": "python", "name": "python3" }, diff --git a/docs/autoimpute/index.md b/docs/autoimpute/index.md index 1600464..d85a15c 100644 --- a/docs/autoimpute/index.md +++ b/docs/autoimpute/index.md @@ -1,5 +1,5 @@ # Autoimpute -This chapter describes how the `autoimpute` function works to automize the entire method comparison, selection, and imputation pipeline in a single function. +The `autoimpute` function automates the entire method comparison, selection, and imputation pipeline in a single call. -The pipeline begins with input validation to ensure all necessary columns exist and quantiles are properly specified. It then preprocesses the donor and receiver datasets to prepare them for model training and evaluation. The function supports imputing numerical, categorical and boolean variable types, internally selecting the method corresponding to each variable type. At its core, `autoimpute` employs cross-validation on the donor data to evaluate multiple imputation methods. Each model is assessed on its ability to accurately predict known values using two different metrics: quantile loss for numerical imputation and log loss for categorical imputation. The method with the lowest average loss (with different metrics combined with a weighted-rank approach) across target variables is automatically selected as the optimal approach for the specific dataset and imputation task. The chosen model is then trained on the complete donor dataset and applied to generate imputations for the missing values in the receiver data. Finally, the pipeline reintegrates these imputed values back into the original receiver dataset, producing a complete dataset ready for downstream analysis. +The pipeline begins with input validation, then preprocesses the donor and receiver datasets for model training and evaluation. It supports numerical, categorical, and boolean variable types, selecting the appropriate method for each. At its core, `autoimpute` runs cross-validation on the donor data to evaluate multiple imputation methods. Each model is scored using quantile loss for numerical variables and log loss for categorical variables. The method with the lowest average loss (combining different metrics via a weighted-rank approach) across target variables is selected automatically. That model is then trained on the full donor dataset and applied to generate imputations for the receiver. The result is an `AutoImputeResult` object containing the imputations, the augmented receiver dataset, fitted models, and cross-validation results. diff --git a/docs/imputation-benchmarking/benchmarking-methods.ipynb b/docs/imputation-benchmarking/benchmarking-methods.ipynb index 9f9c3aa..6881559 100644 --- a/docs/imputation-benchmarking/benchmarking-methods.ipynb +++ b/docs/imputation-benchmarking/benchmarking-methods.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "45bc35df", "metadata": {}, "outputs": [ @@ -29,10 +29,10 @@ "data": [ { "alignmentgroup": "True", - "hovertemplate": "Method=QRF
Quantiles=%{x}
Test Quantile loss=%{y}", + "hovertemplate": "Method=QRF
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "QRF", "marker": { - "color": "#636EFA", + "color": "#88CCEE", "pattern": { "shape": "" } @@ -166,10 +166,10 @@ }, { "alignmentgroup": "True", - "hovertemplate": "Method=OLS
Quantiles=%{x}
Test Quantile loss=%{y}", + "hovertemplate": "Method=OLS
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "OLS", "marker": { - "color": "#EF553B", + "color": "#CC6677", "pattern": { "shape": "" } @@ -303,10 +303,10 @@ }, { "alignmentgroup": "True", - "hovertemplate": "Method=QuantReg
Quantiles=%{x}
Test Quantile loss=%{y}", + "hovertemplate": "Method=QuantReg
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "QuantReg", "marker": { - "color": "#00CC96", + "color": "#DDCC77", "pattern": { "shape": "" } @@ -440,10 +440,10 @@ }, { "alignmentgroup": "True", - "hovertemplate": "Method=Matching
Quantiles=%{x}
Test Quantile loss=%{y}", + "hovertemplate": "Method=Matching
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "Matching", "marker": { - "color": "#AB63FA", + "color": "#117733", "pattern": { "shape": "" } @@ -585,12 +585,12 @@ }, "tracegroupgap": 0 }, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "shapes": [ { "line": { - "color": "#636EFA", + "color": "#88CCEE", "dash": "dot", "width": 2 }, @@ -603,7 +603,7 @@ }, { "line": { - "color": "#EF553B", + "color": "#CC6677", "dash": "dot", "width": 2 }, @@ -616,7 +616,7 @@ }, { "line": { - "color": "#00CC96", + "color": "#DDCC77", "dash": "dot", "width": 2 }, @@ -629,7 +629,7 @@ }, { "line": { - "color": "#AB63FA", + "color": "#117733", "dash": "dot", "width": 2 }, @@ -1470,7 +1470,11 @@ 0, 1 ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", "showgrid": false, + "showline": true, "title": { "font": { "size": 12 @@ -1485,12 +1489,16 @@ 0, 1 ], - "showgrid": false, + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true, "title": { "font": { "size": 12 }, - "text": "Test Quantile loss" + "text": "Quantile loss" }, "zeroline": false } @@ -1516,7 +1524,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "757ba887bc594faba40db29be449fc8a", + "model_id": "e01f756472f74ff7b937e4cb30273e97", "version_major": 2, "version_minor": 0 }, @@ -1530,7 +1538,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c4ac70f725d34a4ab138535bfefbf164", + "model_id": "c2b8d34026e0466893d9871472ee7088", "version_major": 2, "version_minor": 0 }, @@ -1685,10 +1693,10 @@ "data": [ { "alignmentgroup": "True", - "hovertemplate": "Method=QRF
Quantiles=%{x}
Test Quantile loss=%{y}", + "hovertemplate": "Method=QRF
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "QRF", "marker": { - "color": "#636EFA", + "color": "#88CCEE", "pattern": { "shape": "" } @@ -1784,10 +1792,10 @@ }, { "alignmentgroup": "True", - "hovertemplate": "Method=OLS
Quantiles=%{x}
Test Quantile loss=%{y}", + "hovertemplate": "Method=OLS
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "OLS", "marker": { - "color": "#EF553B", + "color": "#CC6677", "pattern": { "shape": "" } @@ -1883,10 +1891,10 @@ }, { "alignmentgroup": "True", - "hovertemplate": "Method=QuantReg
Quantiles=%{x}
Test Quantile loss=%{y}", + "hovertemplate": "Method=QuantReg
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "QuantReg", "marker": { - "color": "#00CC96", + "color": "#DDCC77", "pattern": { "shape": "" } @@ -1982,10 +1990,10 @@ }, { "alignmentgroup": "True", - "hovertemplate": "Method=Matching
Quantiles=%{x}
Test Quantile loss=%{y}", + "hovertemplate": "Method=Matching
Quantiles=%{x}
Quantile loss=%{y}", "legendgroup": "Matching", "marker": { - "color": "#AB63FA", + "color": "#117733", "pattern": { "shape": "" } @@ -2038,44 +2046,44 @@ ], "xaxis": "x", "y": [ - 12257049.472826088, - 12257049.472826088, - 11844892.22826087, - 11844892.22826087, - 11432734.983695652, - 11432734.983695652, - 11020577.739130436, - 11020577.739130436, - 10608420.494565217, - 10608420.494565217, - 10196263.25, - 10196263.25, - 9784106.005434783, - 9784106.005434783, - 9371948.760869564, - 9371948.760869564, - 8959791.516304348, - 8959791.516304348, - 8547634.27173913, - 8547634.27173913, - 8135477.027173913, - 8135477.027173913, - 7723319.782608695, - 7723319.782608695, - 7311162.5380434785, - 7311162.5380434785, - 6899005.293478261, - 6899005.293478261, - 6486848.048913044, - 6486848.048913044, - 6074690.804347826, - 6074690.804347826, - 5662533.559782608, - 5662533.559782608, - 5250376.315217392, - 5250376.315217392, - 4838219.070652175, - 4838219.070652175 + 12257052.081521738, + 12257052.081521738, + 11844897.445652174, + 11844897.445652174, + 11432742.80978261, + 11432742.80978261, + 11020588.173913043, + 11020588.173913043, + 10608433.538043479, + 10608433.538043479, + 10196278.902173912, + 10196278.902173912, + 9784124.266304348, + 9784124.266304348, + 9371969.630434783, + 9371969.630434783, + 8959814.994565217, + 8959814.994565217, + 8547660.358695652, + 8547660.358695652, + 8135505.722826087, + 8135505.722826087, + 7723351.0869565215, + 7723351.0869565215, + 7311196.451086956, + 7311196.451086956, + 6899041.815217392, + 6899041.815217392, + 6486887.179347826, + 6486887.179347826, + 6074732.543478261, + 6074732.543478261, + 5662577.907608695, + 5662577.907608695, + 5250423.271739131, + 5250423.271739131, + 4838268.635869565, + 4838268.635869565 ], "yaxis": "y" } @@ -2089,12 +2097,12 @@ }, "tracegroupgap": 0 }, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "shapes": [ { "line": { - "color": "#636EFA", + "color": "#88CCEE", "dash": "dot", "width": 2 }, @@ -2107,7 +2115,7 @@ }, { "line": { - "color": "#EF553B", + "color": "#CC6677", "dash": "dot", "width": 2 }, @@ -2120,7 +2128,7 @@ }, { "line": { - "color": "#00CC96", + "color": "#DDCC77", "dash": "dot", "width": 2 }, @@ -2133,7 +2141,7 @@ }, { "line": { - "color": "#AB63FA", + "color": "#117733", "dash": "dot", "width": 2 }, @@ -2141,8 +2149,8 @@ "type": "line", "x0": -0.5, "x1": 18.5, - "y0": 8547634.27173913, - "y1": 8547634.27173913 + "y0": 8547660.35869565, + "y1": 8547660.35869565 } ], "template": { @@ -2974,7 +2982,11 @@ 0, 1 ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", "showgrid": false, + "showline": true, "title": { "font": { "size": 12 @@ -2989,12 +3001,16 @@ 0, 1 ], - "showgrid": false, + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true, "title": { "font": { "size": 12 }, - "text": "Test Quantile loss" + "text": "Quantile loss" }, "zeroline": false } @@ -3019,7 +3035,7 @@ "0 networth wasserstein_distance 2.818652e+07\n", "Model: Matching, distribution similarity: \n", " Variable Metric Distance\n", - "0 networth wasserstein_distance 1.798087e+07\n" + "0 networth wasserstein_distance 1.798092e+07\n" ] } ], @@ -3232,7 +3248,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pe3.13", + "display_name": "pe3.13 (3.13.0)", "language": "python", "name": "python3" }, diff --git a/docs/imputation-benchmarking/cross-validation.md b/docs/imputation-benchmarking/cross-validation.md index 5e440e8..8da745f 100644 --- a/docs/imputation-benchmarking/cross-validation.md +++ b/docs/imputation-benchmarking/cross-validation.md @@ -1,14 +1,11 @@ # Cross-validation and model imputation comparison -This page documents the cross-validation utilities for evaluating imputation model performance. Cross-validation provides robust -estimates of how well a model will generalize to unseen data by training and testing on multiple data splits. Functions like `get_imputations`, will then build upon it, to standardize evaluation for all models, ensuring possible through a consistent experimental setup. +This page documents the cross-validation utilities for evaluating imputation model performance. Cross-validation estimates how well a model generalizes to unseen data by training and testing on multiple splits. The `get_imputations` function builds on this to standardize evaluation across all models. -Microimpute's cross-validation automatically selects the appropriate metric based on variable type. Numerical variables are evaluated using quantile loss, which measures prediction accuracy across the conditional distribution. Categorical variables are evaluated using log loss (cross-entropy), which penalizes confident but incorrect predictions, see the [Metrics page](./metrics.md) for more details. +Microimpute's cross-validation selects the metric based on variable type: quantile loss for numerical variables, log loss for categorical variables. See the [Metrics page](./metrics.md) for details. ## Cross-validation -Cross-validation provides robust estimates of how well a model will generalize to unseen data by training and testing on multiple data splits. Microimpute's cross-validation automatically selects the appropriate metric based on variable type: quantile loss for numerical variables and log loss for categorical variables. - ### cross_validate_model ```python @@ -98,7 +95,7 @@ For model selection, focus on the test loss (`mean_test`). When comparing multip ## Imputation generation for model comparison -The `get_imputations` function generates imputations using cross-validation for multiple model classes in a single call, organizing results in a consistent format for downstream comparison and evaluation. +The `get_imputations` function generates imputations for multiple model classes in a single call, organizing results in a consistent format for comparison. ### get_imputations diff --git a/docs/imputation-benchmarking/index.md b/docs/imputation-benchmarking/index.md index 337e1c5..d8b9075 100644 --- a/docs/imputation-benchmarking/index.md +++ b/docs/imputation-benchmarking/index.md @@ -1,5 +1,5 @@ # Benchmarking different imputation methods -This chapter describes how the Microimpute package allows you to compare different imputation methods using preprocessing, cross-validation, metric comparison, and evaluation tools. +This chapter describes how microimpute lets you compare imputation methods using preprocessing, cross-validation, metric comparison, and evaluation tools. -The benchmarking functionality enables systematically comparing multiple imputation models using a common dataset, allowing for robust evaluation of their performance. It supports cross-validation to diagnose overfitting and measure performance on training data leveraging the availability of ground truth. By assessing accuracy of numeric imputation across various quantiles, it is possible to gain a more comprehensive understanding of how each method performs across different levels of the distribution. Categorical imputation is assessed with log loss. This process is further supported by visualizations that highlight differences between approaches, making it easy to identify which imputation methods perform best under specific conditions. Predictor evaluation tools are also available to inform decision-making when setting up the imputation task. +The benchmarking functionality supports systematic comparison of multiple models on a common dataset. Cross-validation diagnoses overfitting and measures performance on held-out data where ground truth is available. Numerical imputation accuracy is assessed across quantiles via quantile loss; categorical imputation uses log loss. Visualizations show differences between methods, and predictor evaluation tools help inform variable selection when setting up the imputation task. diff --git a/docs/imputation-benchmarking/metrics.md b/docs/imputation-benchmarking/metrics.md index cf2f6a3..32f429f 100644 --- a/docs/imputation-benchmarking/metrics.md +++ b/docs/imputation-benchmarking/metrics.md @@ -1,14 +1,14 @@ # Metrics and evaluation -This page documents the evaluation metrics and predictor analysis tools available for assessing imputation quality. These utilities help understand model performance, compare methods, and analyze the contribution of individual predictors. +This page documents the evaluation metrics and predictor analysis tools for assessing imputation quality. ## Loss metrics -Microimpute employs evaluation metrics tailored to the type of variable being imputed. The framework automatically selects the appropriate metric based on whether the imputed variable is numerical or categorical, ensuring meaningful performance assessment across different data types. +Microimpute selects the evaluation metric based on whether the imputed variable is numerical or categorical. ### Quantile loss -Quantile loss assesses imputation quality for numerical variables. This approach provides a more nuanced evaluation than traditional metrics like mean squared error, particularly for capturing performance across different parts of the distribution. +Quantile loss assesses imputation quality for numerical variables. It captures performance across different parts of the distribution, unlike mean squared error which only measures average accuracy. The quantile loss implements the standard pinball loss formulation: @@ -62,7 +62,7 @@ When predictions are class labels rather than probabilities, the function conver ### compute_loss -A unified function that selects the appropriate loss metric based on the specified type, providing a consistent interface for both numerical and categorical evaluation. +A unified function that selects the loss metric based on the specified type. ```python def compute_loss( @@ -86,7 +86,7 @@ Returns a tuple of `(element_wise_losses, mean_loss)`. ### compare_metrics -Compares metrics across multiple imputation methods, automatically detecting variable types and applying the appropriate metric. For models that handle both numerical and categorical variables, the evaluation produces separate results for each metric type. +Compares metrics across multiple imputation methods, detecting variable types and applying the appropriate metric. For models that handle both numerical and categorical variables, results are produced separately for each metric type. ```python def compare_metrics( @@ -106,7 +106,7 @@ Returns a DataFrame with columns `Method`, `Imputed Variable`, `Percentile`, `Lo ## Distribution comparison -Beyond point-wise loss metrics, evaluating how well imputed values preserve distributional characteristics provides insight into whether the imputation maintains the statistical properties of the original data. +Evaluating how well imputed values preserve distributional characteristics tells you whether the imputation maintains the statistical properties of the original data. ### Wasserstein distance @@ -126,7 +126,7 @@ $$D_{KL}(P||Q) = \sum_{x \in \mathcal{X}} P(x) \log\left(\frac{P(x)}{Q(x)}\right where $P$ is the reference distribution (original data), $Q$ is the approximation (imputed data), and $\mathcal{X}$ is the set of all possible categorical values. KL divergence measures how much information is lost when using the imputed distribution to approximate the true distribution. Lower values indicate better preservation of the original categorical distribution. -When sample weights are provided, the probability distributions are computed as weighted proportions rather than simple counts, ensuring proper comparison of weighted survey data. +When sample weights are provided, the probability distributions are computed as weighted proportions rather than simple counts, so that weighted survey data can be compared correctly. ### kl_divergence @@ -178,11 +178,11 @@ Note that data must not contain null or infinite values. If your data contains s ## Predictor analysis -Understanding which predictors contribute most to imputation quality helps with feature selection and model interpretation. These tools analyze predictor-target relationships and evaluate sensitivity to predictor selection. +These tools analyze which predictors contribute most to imputation quality, helping with feature selection and model interpretation. ### Mutual information -Mutual information measures the reduction in uncertainty about one variable given knowledge of another. Unlike correlation coefficients that capture only linear relationships, mutual information detects any statistical dependency, making it valuable for mixed data types. +Mutual information measures the reduction in uncertainty about one variable given knowledge of another. Unlike correlation coefficients, which capture only linear relationships, mutual information detects any statistical dependency. For discrete random variables $X$ and $Y$: @@ -200,21 +200,23 @@ where $H(X)$ and $H(Y)$ are the entropies of $X$ and $Y$ respectively. Normalize def compute_predictor_correlations( data: pd.DataFrame, predictors: List[str], - imputed_variables: List[str], + imputed_variables: Optional[List[str]] = None, + method: str = "all", ) -> Dict[str, pd.DataFrame] ``` -| Parameter | Type | Description | -|-----------|------|-------------| -| data | pd.DataFrame | Dataset containing predictors and target variables | -| predictors | List[str] | Column names of predictor variables | -| imputed_variables | List[str] | Column names of target variables | +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| data | pd.DataFrame | - | Dataset containing predictors and target variables | +| predictors | List[str] | - | Column names of predictor variables | +| imputed_variables | List[str] | None | Column names of target variables | +| method | str | "all" | Which correlation method to use: "all", "mi" (mutual information), "pearson", or "spearman" | -Returns a dictionary containing `predictor_target_mi` DataFrame with mutual information scores. +Returns a dictionary containing DataFrames with correlation scores (e.g. `predictor_target_mi` for mutual information). ### Leave-one-out analysis -Leave-one-out predictor analysis evaluates model performance when each predictor is excluded. By comparing loss with and without each predictor, you can assess its contribution to imputation quality. Predictors whose removal causes large increases in loss are most important, while those with minimal impact might be candidates for removal to simplify the model. +Leave-one-out predictor analysis evaluates model performance when each predictor is excluded. Predictors whose removal causes large increases in loss are the most important, while those with minimal impact might be candidates for removal. ### leave_one_out_analysis @@ -223,9 +225,13 @@ def leave_one_out_analysis( data: pd.DataFrame, predictors: List[str], imputed_variables: List[str], - model_class: Type, - quantiles: Optional[List[float]] = QUANTILES, -) -> Dict[str, Any] + model_class: Type[Imputer], + weight_col: Optional[Union[str, np.ndarray, pd.Series]] = None, + quantiles: List[float] = QUANTILES, + train_size: float = TRAIN_SIZE, + n_jobs: int = 1, + random_state: int = RANDOM_STATE, +) -> pd.DataFrame ``` | Parameter | Type | Default | Description | @@ -233,14 +239,18 @@ def leave_one_out_analysis( | data | pd.DataFrame | - | Complete dataset | | predictors | List[str] | - | Column names of predictor variables | | imputed_variables | List[str] | - | Column names of variables to impute | -| model_class | Type | - | Imputer class to evaluate | +| model_class | Type[Imputer] | - | Imputer class to evaluate | +| weight_col | str, np.ndarray, or pd.Series | None | Sample weights column name or array | | quantiles | List[float] | [0.05 to 0.95 in steps of 0.05] | Quantiles to evaluate | +| train_size | float | 0.8 | Proportion of data for training | +| n_jobs | int | 1 | Number of parallel jobs | +| random_state | int | 42 | Random seed for reproducibility | -Returns a dictionary containing loss increase and relative impact for each predictor. +Returns a DataFrame containing loss increase and relative impact for each predictor. ### Progressive predictor inclusion -Progressive inclusion analysis adds predictors one at a time in order of their mutual information with the target. This greedy forward selection reveals the optimal inclusion order, marginal contribution of each predictor, and the minimal set of predictors achieving near-optimal performance. Diminishing returns in loss reduction indicate when additional predictors provide negligible improvement. +Progressive inclusion adds predictors one at a time, ordered by their mutual information with the target. This greedy forward selection reveals the optimal inclusion order and the marginal contribution of each predictor. Diminishing returns in loss reduction indicate when additional predictors add little. ### progressive_predictor_inclusion @@ -249,8 +259,12 @@ def progressive_predictor_inclusion( data: pd.DataFrame, predictors: List[str], imputed_variables: List[str], - model_class: Type, + model_class: Type[Imputer], + weight_col: Optional[Union[str, np.ndarray, pd.Series]] = None, quantiles: Optional[List[float]] = QUANTILES, + train_size: Optional[float] = TRAIN_SIZE, + max_predictors: Optional[int] = None, + random_state: Optional[int] = RANDOM_STATE, ) -> Dict[str, Any] ``` @@ -259,8 +273,12 @@ def progressive_predictor_inclusion( | data | pd.DataFrame | - | Complete dataset | | predictors | List[str] | - | Column names of predictor variables | | imputed_variables | List[str] | - | Column names of variables to impute | -| model_class | Type | - | Imputer class to evaluate | +| model_class | Type[Imputer] | - | Imputer class to evaluate | +| weight_col | str, np.ndarray, or pd.Series | None | Sample weights column name or array | | quantiles | List[float] | [0.05 to 0.95 in steps of 0.05] | Quantiles to evaluate | +| train_size | float | 0.8 | Proportion of data for training | +| max_predictors | int | None | Maximum number of predictors to include (None for all) | +| random_state | int | 42 | Random seed for reproducibility | Returns a dictionary containing `inclusion_order` (list of predictors in optimal order) and `predictor_impacts` (list of dicts with predictor name and loss reduction). @@ -282,7 +300,7 @@ metrics_df = compare_metrics( "QRF": qrf_imputations, "OLS": ols_imputations, }, - imputed_variables=imputed_variables + imputed_variables=imputed_variables, ) # Evaluate distributional match with survey weights @@ -295,7 +313,13 @@ dist_df_weighted = compare_distributions( ) # Analyze predictor importance -mi_scores = compute_predictor_correlations(data, predictors, imputed_variables) -loo_results = leave_one_out_analysis(data, predictors, imputed_variables, QRF) -inclusion_results = progressive_predictor_inclusion(data, predictors, imputed_variables, QRF) +mi_scores = compute_predictor_correlations( + data, predictors, imputed_variables, method="mi" +) +loo_results = leave_one_out_analysis( + data, predictors, imputed_variables, QRF, weight_col="wgt" +) +inclusion_results = progressive_predictor_inclusion( + data, predictors, imputed_variables, QRF, weight_col="wgt" +) ``` diff --git a/docs/imputation-benchmarking/preprocessing.md b/docs/imputation-benchmarking/preprocessing.md index caa352c..736d73e 100644 --- a/docs/imputation-benchmarking/preprocessing.md +++ b/docs/imputation-benchmarking/preprocessing.md @@ -1,12 +1,12 @@ # Data preprocessing -Preprocessing transformations can improve model performance by normalizing scale differences or handling skewed distributions. These are supported by `preprocess_data` and transformation-specific functions. +Preprocessing transformations can improve model performance by normalizing scale differences or handling skewed distributions. The main entry point is `preprocess_data`, with transformation-specific functions also available. ## Transformation options Microimpute supports three transformation types that can be applied to numeric columns before training. Each transformation automatically excludes categorical and boolean columns to prevent encoding issues. -**Normalization (z-score)** standardizes data to have mean 0 and standard deviation 1. This transformation is useful when predictors have different scales, ensuring that all features contribute equally to distance-based or gradient-based models. +**Normalization (z-score)** standardizes data to have mean 0 and standard deviation 1. This is useful when predictors have different scales, so that all features contribute equally to distance-based or gradient-based models. **Log transformation** applies the natural logarithm to values. This is effective for right-skewed distributions common in financial data like income or wealth. The transformation requires all values to be strictly positive. diff --git a/docs/imputation-benchmarking/visualizations.md b/docs/imputation-benchmarking/visualizations.md index d6c9450..21dde02 100644 --- a/docs/imputation-benchmarking/visualizations.md +++ b/docs/imputation-benchmarking/visualizations.md @@ -159,8 +159,10 @@ For quantile loss, the plot shows train and test loss across quantiles as groupe from microimpute.visualizations import model_performance_results # Visualize cross-validation results for a single model +# Pass the full cv_results dict (not just the inner DataFrame) +# to preserve error bar data from cross-validation folds perf_viz = model_performance_results( - results=cv_results["quantile_loss"]["results"], + results=cv_results, model_name="QRF", method_name="Cross-validation", metric="quantile_loss" diff --git a/docs/index.md b/docs/index.md index 354005d..979a4c6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,21 +1,21 @@ # Microimpute -Microimpute is a powerful framework that enables variable imputation through a variety of statistical methods. By providing a consistent interface across different imputation techniques, it allows researchers and data scientists to easily compare and benchmark different approaches using quantile loss and log loss calculations to determine the method provding most accurate results. Thus, Microimpute provides two main uses: imputing one or multiple variables with one of the methods available, and comparing and benchmarking different methods to inform a method's choice. +Microimpute is a Python package for imputing variables from one survey dataset onto another. It wraps five imputation methods behind a common interface so you can benchmark them on your data and pick the one that works best: impute one or multiple variables with any of the available methods, and compare their performance using quantile loss and log loss. -The framework currently supports the following imputation methods: -- Statistical Matching -- Ordinary Least Squares Linear Regression -- Quantile Random Forests +The package currently supports: +- Hot Deck Matching +- Ordinary Least Squares (OLS) Linear Regression +- Quantile Random Forests (QRF) - Quantile Regression -- Mixture Density Networks +- Mixture Density Networks (MDN) -This is a work in progress that may evolve over time, including new statistical imputation methods and features. +This is a work in progress and may evolve over time with new methods and features. ## Microimputation dashboard Users can visualize imputation and benchmarking results at https://microimpute-dashboard.vercel.app/. -To use the dashboard for visualization, CSV files must contain the following columns in this exact order: +To use the dashboard, CSV files must contain the following columns in this exact order: - `type`: Type of metric (e.g., "benchmark_loss", "distribution_distance", "predictor_correlation") - `method`: Imputation method name (e.g., "QRF", "OLS", "QuantReg", "Matching", "MDN") - `variable`: Variable being imputed or analyzed @@ -25,4 +25,4 @@ To use the dashboard for visualization, CSV files must contain the following col - `split`: Data split indicator (e.g., "train", "test", "full") - `additional_info`: JSON-formatted string with additional metadata -Users can use the `format_csv()` function from `microimpute.utils` to automatically format imputation and benchmarking results into the correct structure for dashboard visualization. This function accepts outputs from various analysis functions (autoimpute results, comparison metrics, distribution comparisons, etc.) and returns a properly formatted DataFrame. \ No newline at end of file +The `format_csv()` function from `microimpute.utils` formats imputation and benchmarking results into the correct structure for the dashboard. It accepts outputs from various analysis functions (autoimpute results, comparison metrics, distribution comparisons) and returns a properly formatted DataFrame. diff --git a/docs/models/imputer/implement-new-model.md b/docs/models/imputer/implement-new-model.md index 839da1d..edf2125 100644 --- a/docs/models/imputer/implement-new-model.md +++ b/docs/models/imputer/implement-new-model.md @@ -1,15 +1,15 @@ # Creating a new imputer model -This document demonstrates how to create a new imputation model by extending the `Imputer` and `ImputerResults` abstract base classes in Microimpute. +This document shows how to create a new imputation model by extending the `Imputer` and `ImputerResults` abstract base classes. -## Understanding the Microimpute architecture +## Architecture -Microimpute uses a two-class architecture for imputation models: +Microimpute uses a two-class architecture: -1. **Imputer**: The base model class that handles model initialization and fitting +1. **Imputer**: Handles model initialization and fitting 2. **ImputerResults**: Represents a fitted model and handles prediction -This separation provides a clean distinction between the model definition and the fitted model instance, similar to statsmodels' approach. Remember to check how currently supported models have been implemented if you would like to ensure full compatibility. +This separation is similar to statsmodels' approach. Look at the existing model implementations for reference. ```python from typing import Dict, List, Optional, Any @@ -178,11 +178,9 @@ The new `NewModel` model is then ready to be integrated into the Microimpute ben ```python from microimpute.models import OLS, QRF -from microimpute.comparisons import ( - get_imputations, - compare_quantile_loss, -) -from microimpute.visualizations.plotting import method_comparison_results +from microimpute.comparisons import get_imputations +from microimpute.comparisons.metrics import compare_metrics +from microimpute.visualizations import method_comparison_results # Define models to compare model_classes = [NewModel, OLS, QRF] @@ -195,45 +193,33 @@ method_imputations = get_imputations( model_classes, X_train, X_test, predictors, imputed_variables ) -# Compare quantile loss -loss_comparison_df = compare_quantile_loss(Y_test, method_imputations, imputed_variables) +# Compare metrics across methods +loss_comparison_df = compare_metrics(Y_test, method_imputations, imputed_variables) # Plot the comparison comparison_viz = method_comparison_results( - data=loss_comparison_df, - metric_name="Test Quantile Loss", - data_format="long", - ) -fig = comparison_viz.plot( - show_mean=True, + data=loss_comparison_df, + metric="quantile_loss", + data_format="long", ) +fig = comparison_viz.plot(show_mean=True) fig.show() ``` -## Best practices for implementing new models - -When implementing a new imputation model for Microimpute, adhering to certain best practices will ensure your model integrates seamlessly with the framework and provides a consistent experience for users. +## Best practices ### Architecture -The two-class architecture forms the foundation of a well-designed imputation model. You should create an `Imputer` subclass that handles model definition and fitting operations, establishing the core functionality of your approach. This class should be complemented by an `ImputerResults` subclass that represents the fitted model state and handles all prediction-related tasks. This separation of concerns creates a clean distinction between the fitting and prediction phases of your model's lifecycle. - -Within these classes, you must implement the required abstract methods to fulfill the contract with the base classes. Your `Imputer` subclass should provide a thorough implementation of the `_fit()` method that handles the training process for your specific algorithm. Similarly, your `ImputerResults` subclass needs to implement the `_predict()` method that applies the fitted model to new data and generates predictions at requested quantiles. Check how currently supported models have been implemented if you would like to ensure iterative imputation for multiple target variables fully compatible with how other models do it. For example, to be able to compute quantile loss accross imputed quantiles and variables and compare it with different methods you must ensure iterative imputation within the fitting and predicting methods. +Create an `Imputer` subclass for fitting and an `ImputerResults` subclass for prediction. Implement `_fit()` in the former and `_predict()` in the latter. Look at existing models to see how they handle iterative imputation across multiple target variables, which is needed for cross-method comparison via quantile loss. ### Error handling -Robust error handling is crucial for creating reliable imputation models. Your implementation should wrap model fitting and prediction operations in appropriate try/except blocks to capture and handle potential errors gracefully. When exceptions occur, provide informative error messages that help users understand what went wrong and how to address the issue. Use appropriate error types such as ValueError for input validation failures and RuntimeError for operational failures during model execution. - -Effective logging complements good error handling by providing visibility into the model's operation. Use the self.logger instance consistently throughout your code to record important information about the model's state and progress. Log significant events like the start and completion of fitting operations, parameter values, and any potential issues or warnings that arise during execution. +Wrap fitting and prediction in try/except blocks. Use `ValueError` for bad inputs, `RuntimeError` for operational failures, and include informative messages. Use `self.logger` for logging significant events (fitting start/end, parameter values, warnings). ### Parameters and validation -Type safety and parameter validation enhance the usability and reliability of your model. Add comprehensive type hints to all methods and parameters to enable better IDE support and make your code more self-documenting. Apply the `validate_call` decorator with the standard VALIDATE_CONFIG configuration to method signatures to enforce parameter validation consistently. - -Your implementation should thoughtfully support model-specific parameters that may be needed to control the behavior of your algorithm. Design your `_fit()` and `_predict()` methods to accept and properly utilize these parameters, ensuring they affect the model's operation as intended. Document all parameters clearly in your docstrings, explaining their purpose, expected values, and default behavior to guide users in effectively configuring your model. - -### Documentation +Add type hints to all methods. Use the `@validate_call(config=VALIDATE_CONFIG)` decorator for parameter validation. Document model-specific parameters in docstrings with their purpose, expected values, and defaults. -Comprehensive documentation makes your model accessible to others. Include detailed class-level docstrings that explain your model's theoretical approach, strengths, limitations, and appropriate use cases. Document all methods with properly structured docstring sections covering arguments, return values, and potential exceptions. Where appropriate, provide usage examples that demonstrate how to initialize, train, and use your model for prediction tasks. +### Testing -The documentation should be complemented by thorough unit tests that verify your implementation works correctly. Create tests that check both basic interface compliance (ensuring your model adheres to the expected API) and model-specific functionality (validating that your algorithm produces correct results). Comprehensive testing helps catch issues early and provides confidence that your implementation will work reliably in production environments. +Write tests for both interface compliance (does your model follow the expected API?) and model-specific correctness (does it produce sensible results?). diff --git a/docs/models/imputer/index.md b/docs/models/imputer/index.md index 3cf0dc0..26e20d8 100644 --- a/docs/models/imputer/index.md +++ b/docs/models/imputer/index.md @@ -1,11 +1,11 @@ # The Imputer class -The `Imputer` class serves as an abstract base class that defines the common interface for all imputation models within the Microimpute framework. It establishes a structure with essential methods for data validation, model fitting, and prediction. Every specialized imputation model in the system inherits from this class and implements the required abstract methods to provide its unique functionality. +The `Imputer` class is the abstract base class that defines the common interface for all imputation models in microimpute. Every model inherits from it and implements the required abstract methods for fitting and prediction. ## Key features -The Imputer architecture provides numerous benefits to the overall system design. It defines a consistent API with standardized `fit()` and `predict()` methods, ensuring that all models can be used interchangeably regardless of their underlying implementation details. This uniformity makes it straightforward to swap imputation techniques within your workflow. Thus, all imputers will share basic functionality like the handling of weighted data, using a "weights" column for sampling training data, to preserve data distributions better. +All models share standardized `fit()` and `predict()` methods, so they can be used interchangeably regardless of underlying implementation. All imputers also share functionality like weighted data handling through a `weight_col` parameter. -The design carefully enforces proper usage by ensuring no model can call `predict()` without first fitting the model to the data. This logical constraint helps prevent common errors and makes the API more intuitive to use. Additionally, the base implementation handles validation of parameters and input data, reducing code duplication across different model implementations and ensuring that all models perform appropriate validation checks. +The design enforces that `predict()` cannot be called before `fit()`. The base implementation also handles parameter and input data validation, so individual models don't need to duplicate those checks. -When using the different imputers in isolation, and not as part of wider pipeline functions like `autoimpute` preprocessing is supported by `preprocess_data` which can help normalize the data and split it into train and test splits. For an example of how to integrate them see [matching-imputation.ipynb](../matching/matching-imputation.ipynb). +When using imputers in isolation (not through `autoimpute`), preprocessing is available via `preprocess_data`, which can normalize the data and split it into train/test sets. See [matching-imputation.ipynb](../matching/matching-imputation.ipynb) for an example. diff --git a/docs/models/matching/index.md b/docs/models/matching/index.md index 849d851..ca58c4f 100644 --- a/docs/models/matching/index.md +++ b/docs/models/matching/index.md @@ -1,27 +1,23 @@ # Hot-Deck Matching -The `Matching` model implements imputation through an elegant nearest neighbor distance hot deck matching approach. This technique draws from the principles of statistical matching, using existing complete records (donors) to provide values for records with missing data (recipients) by establishing meaningful connections based on similarities in predictor variables. +The `Matching` model imputes missing values using nearest neighbor distance hot deck matching. It finds donor records that are similar to each recipient based on predictor variables and transfers the donor's observed values. ## Variable type support -The matching model can handle any variable type—numerical, categorical, boolean, or mixed. Since it transfers actual observed values from similar records rather than generating predictions, it naturally preserves the original data type and distribution of each variable. +Matching handles any variable type: numerical, categorical, boolean, or mixed. Because it transfers actual observed values rather than generating predictions, it preserves the original data type and distribution of each variable. ## How it works -Statistical or hot-deck matching in Microimpute builds upon the foundation of R's StatMatch package, accessed through the rpy2 interface to provide a seamless integration of R's statistical power with Python's flexibility. The implementation leverages the well-established nearest neighbor distance hot deck matching algorithm, which has a strong theoretical foundation in statistical literature. +The implementation builds on R's StatMatch package, accessed through the rpy2 interface. -During the fitting phase, the model carefully preserves both the complete donor dataset and the relevant variable names that will guide the matching process. This stored information becomes the knowledge base from which the model will draw when making imputations. +During fitting, the model stores the complete donor dataset and the relevant variable names. During prediction, each record in the test dataset (the recipients) is compared against the stored donors using distance calculations on the predictor variables. The algorithm finds the closest donor for each recipient and transfers the target variable values. -The prediction stage initiates a deliberate matching process where each record in the test dataset (the recipients) is systematically compared with the stored donor records. The comparison calculates similarity distances based on the predictor variables, identifying the donor records that most closely resemble each recipient. The matching algorithm efficiently navigates the multidimensional space defined by the predictor variables to find optimal donor-recipient pairs. - -Once the matching is complete, the model transfers the values from the matched donors to the recipients for the specified imputed variable. This transfer preserves the natural relationships and patterns present in the original data, as the values being imputed were actually observed rather than synthetically generated. +Because the imputed values are drawn from actually observed records, the natural relationships in the original data are preserved. ## Key features -The statistical matching imputer offers a truly non-parametric approach that operates without imposing restrictive assumptions about the underlying data distribution. This distribution-free nature makes it particularly valuable in scenarios where the data doesn't conform to common statistical assumptions or when the relationships are too complex to model parametrically. - -One of the most compelling advantages of this method is its ability to preserve the empirical distribution of the imputed variables. Since the imputed values come directly from observed data points, the resulting dataset maintains the natural structure, variability, and relationships present in the original data. This preservation extends to features like multimodality, skewness, and natural bounds that might be lost in model-based approaches. +Matching is non-parametric: it makes no assumptions about the data distribution. This makes it useful when the data doesn't fit standard parametric models, or when the relationships between predictors and targets are hard to specify in closed form. -The technique demonstrates versatility in handling complex relationships between variables, particularly when there exists a good match across datasets. Without requiring explicit specification of interaction terms or functional forms, it naturally captures the intricate dependencies that exist in the data through the matching process. This makes it especially valuable for datasets where the relationships are not well understood or are difficult to express mathematically. +The method preserves the empirical distribution of the imputed variables. Since values come directly from observed data points, features like multimodality, skewness, and natural bounds are maintained. A model-based approach might smooth these away. -Perhaps most distinctively, the statistical matching approach returns actual observed values rather than modeled estimates. This characteristic ensures that the imputed values are realistic and plausible, as they represent real observations from similar data points. The method essentially says, "We have seen this pattern before, and here's what the missing values looked like in that situation," providing a grounded approach to filling in missing information. +One limitation is that Matching does not incorporate quantile information. It matches donor and receiver units identically regardless of the quantile being predicted, which means it cannot distinguish between different parts of the conditional distribution. It may also fail to capture non-linear predictor-target relationships despite producing a plausible marginal distribution. diff --git a/docs/models/matching/matching-imputation.ipynb b/docs/models/matching/matching-imputation.ipynb index 1cdace2..df9d7d0 100644 --- a/docs/models/matching/matching-imputation.ipynb +++ b/docs/models/matching/matching-imputation.ipynb @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -112,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -161,7 +161,7 @@ " -0.002592\n", " 0.019907\n", " -0.017646\n", - " False\n", + " True\n", " 1\n", " \n", " \n", @@ -175,7 +175,7 @@ " -0.039493\n", " -0.068332\n", " -0.092204\n", - " True\n", + " False\n", " 2\n", " \n", " \n", @@ -189,7 +189,7 @@ " -0.002592\n", " 0.002861\n", " -0.025930\n", - " False\n", + " True\n", " 3\n", " \n", " \n", @@ -245,7 +245,7 @@ " -0.002592\n", " 0.031193\n", " 0.007207\n", - " True\n", + " False\n", " 438\n", " \n", " \n", @@ -273,7 +273,7 @@ " -0.011080\n", " -0.046883\n", " 0.015491\n", - " False\n", + " True\n", " 440\n", " \n", " \n", @@ -287,7 +287,7 @@ " 0.026560\n", " 0.044529\n", " -0.025930\n", - " True\n", + " False\n", " 441\n", " \n", " \n", @@ -301,7 +301,7 @@ " -0.039493\n", " -0.004222\n", " 0.003064\n", - " True\n", + " False\n", " 442\n", " \n", " \n", @@ -311,22 +311,22 @@ ], "text/plain": [ " age sex bmi bp s1 ... s4 s5 s6 bool wgt\n", - "0 0.038076 0.050680 0.061696 0.021872 -0.044223 ... -0.002592 0.019907 -0.017646 False 1\n", - "1 -0.001882 -0.044642 -0.051474 -0.026328 -0.008449 ... -0.039493 -0.068332 -0.092204 True 2\n", - "2 0.085299 0.050680 0.044451 -0.005670 -0.045599 ... -0.002592 0.002861 -0.025930 False 3\n", + "0 0.038076 0.050680 0.061696 0.021872 -0.044223 ... -0.002592 0.019907 -0.017646 True 1\n", + "1 -0.001882 -0.044642 -0.051474 -0.026328 -0.008449 ... -0.039493 -0.068332 -0.092204 False 2\n", + "2 0.085299 0.050680 0.044451 -0.005670 -0.045599 ... -0.002592 0.002861 -0.025930 True 3\n", "3 -0.089063 -0.044642 -0.011595 -0.036656 0.012191 ... 0.034309 0.022688 -0.009362 True 4\n", "4 0.005383 -0.044642 -0.036385 0.021872 0.003935 ... -0.002592 -0.031988 -0.046641 False 5\n", ".. ... ... ... ... ... ... ... ... ... ... ...\n", - "437 0.041708 0.050680 0.019662 0.059744 -0.005697 ... -0.002592 0.031193 0.007207 True 438\n", + "437 0.041708 0.050680 0.019662 0.059744 -0.005697 ... -0.002592 0.031193 0.007207 False 438\n", "438 -0.005515 0.050680 -0.015906 -0.067642 0.049341 ... 0.034309 -0.018114 0.044485 False 439\n", - "439 0.041708 0.050680 -0.015906 0.017293 -0.037344 ... -0.011080 -0.046883 0.015491 False 440\n", - "440 -0.045472 -0.044642 0.039062 0.001215 0.016318 ... 0.026560 0.044529 -0.025930 True 441\n", - "441 -0.045472 -0.044642 -0.073030 -0.081413 0.083740 ... -0.039493 -0.004222 0.003064 True 442\n", + "439 0.041708 0.050680 -0.015906 0.017293 -0.037344 ... -0.011080 -0.046883 0.015491 True 440\n", + "440 -0.045472 -0.044642 0.039062 0.001215 0.016318 ... 0.026560 0.044529 -0.025930 False 441\n", + "441 -0.045472 -0.044642 -0.073030 -0.081413 0.083740 ... -0.039493 -0.004222 0.003064 False 442\n", "\n", "[442 rows x 12 columns]" ] }, - "execution_count": 7, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -347,7 +347,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -477,7 +477,7 @@ "max 1.107267e-01 5.068012e-02 1.705552e-01 1.320436e-01 1.539137e-01 1.852344e-01 442.000000" ] }, - "execution_count": 8, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -501,7 +501,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -540,7 +540,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -643,7 +643,7 @@ "73 0.012648 0.050680 -0.020218 -0.002228 NaN NaN NaN 74" ] }, - "execution_count": 10, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -672,7 +672,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -691,7 +691,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -710,7 +710,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -744,31 +744,31 @@ " 287\n", " 0.024574\n", " -0.039493\n", - " True\n", + " False\n", " \n", " \n", " 211\n", " 0.030078\n", " -0.039493\n", - " True\n", + " False\n", " \n", " \n", " 72\n", " 0.038334\n", " -0.039493\n", - " False\n", + " True\n", " \n", " \n", " 321\n", " -0.013953\n", " -0.002592\n", - " True\n", + " False\n", " \n", " \n", " 73\n", " -0.031840\n", " -0.039493\n", - " False\n", + " True\n", " \n", " \n", "\n", @@ -776,14 +776,14 @@ ], "text/plain": [ " s1 s4 bool\n", - "287 0.024574 -0.039493 True\n", - "211 0.030078 -0.039493 True\n", - "72 0.038334 -0.039493 False\n", - "321 -0.013953 -0.002592 True\n", - "73 -0.031840 -0.039493 False" + "287 0.024574 -0.039493 False\n", + "211 0.030078 -0.039493 False\n", + "72 0.038334 -0.039493 True\n", + "321 -0.013953 -0.002592 False\n", + "73 -0.031840 -0.039493 True" ] }, - "execution_count": 13, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -808,7 +808,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -826,22 +826,22 @@ "x": [ 0.12501870313429186, 0.03430885887772673, - false, + true, -0.0249601584096303, -0.03949338287409329, - false, + true, 0.10300345740307394, -0.002592261998183278, true, 0.05484510736603471, 0.14132210941786577, - true, + false, 0.03833367306762126, 0.03430885887772673, - false, + true, 0.09887559882847057, -0.002592261998183278, - true, + false, 0.030077955918414535, 0.03430885887772673, true, @@ -859,7 +859,7 @@ false, -0.06761469701386505, -0.002592261998183278, - true, + false, -0.05523112129005496, -0.0763945037500033, true, @@ -871,40 +871,40 @@ true, -0.07311850844666953, -0.03949338287409329, - false, + true, 0.03833367306762126, 0.03430885887772673, false, 0.020446285911006685, 0.07120997975363674, - false, + true, -0.12678066991651324, -0.047980640675552584, true, 0.013566521620001083, 0.03430885887772673, - false, + true, -0.012576582685820214, -0.002592261998183278, - false, + true, 0.045213437358626866, -0.002592261998183278, false, -0.007072771253015731, -0.03949338287409329, - true, + false, 0.016318427336403322, -0.002592261998183278, false, -0.009824676969417972, -0.03949338287409329, - true, + false, -0.030463969842434782, -0.002592261998183278, false, -0.02220825269322806, -0.002592261998183278, - false, + true, -0.051103262715451604, 0.03430885887772673, false, @@ -913,52 +913,52 @@ false, 0.0342058144930179, -0.002592261998183278, - true, + false, 0.0080627101871966, 0.021024455362399115, - true, + false, 0.0025588987543921156, -0.002592261998183278, false, 0.0025588987543921156, -0.002592261998183278, - false, + true, -0.016704441260423575, 0.03430885887772673, true, 0.045213437358626866, 0.03615391492152222, - false, + true, 0.07823630595545376, -0.002592261998183278, - false, + true, -0.011200629827619093, -0.002592261998183278, false, 0.03145390877661565, 0.019917421736121838, - false, + true, 0.024574144485610048, 0.03430885887772673, false, -0.001568959820211247, -0.03949338287409329, - false, + true, -0.00019300696201012598, -0.03949338287409329, - false, + true, -0.00019300696201012598, -0.05056371913686628, - true, + false, -0.06623874415566393, -0.002592261998183278, - false, + true, -0.004320865536613489, 0.07120997975363674, false, 0.04383748450042574, -0.014400620678474476, - true, + false, 0.03282986163481677, -0.03949338287409329, false, @@ -967,61 +967,61 @@ false, -0.04422349842444599, -0.0763945037500033, - true, + false, -0.035967781275239266, -0.05167075276314359, - false, + true, -0.007072771253015731, -0.002592261998183278, - false, + true, -0.07311850844666953, -0.0763945037500033, - false, + true, -0.019456346976825818, -0.03949338287409329, true, -0.007072771253015731, 0.07120997975363674, - true, + false, -0.008448724111216851, -0.03949338287409329, - false, + true, 0.08924392882106273, 0.10811110062954676, - true, + false, -0.0249601584096303, -0.03949338287409329, true, 0.03282986163481677, -0.002592261998183278, - true, + false, -0.04422349842444599, -0.002592261998183278, - false, + true, -0.0029449126784123676, -0.03949338287409329, false, -0.033215875558837024, -0.0763945037500033, - true, + false, 0.08236416453005713, 0.07120997975363674, - false, + true, -0.0318399227006359, 0.0029429061332032365, false, -0.04972730985725048, -0.03949338287409329, - false, + true, 0.010814615903598841, -0.03949338287409329, - false, + true, -0.005696818394814609, 0.03430885887772673, false, 0.06172487165704031, -0.002592261998183278, - false, + true, 0.05622106022423583, 0.07120997975363674, true, @@ -1039,13 +1039,13 @@ true, 0.039709625925822375, 0.07120997975363674, - true, + false, 0.045213437358626866, 0.07120997975363674, - true, + false, -0.04972730985725048, 0.01585829843977173, - true, + false, -0.026336111267831423, -0.03949338287409329, false, @@ -1054,10 +1054,10 @@ false, 0.08511607024645937, 0.03430885887772673, - false, + true, 0.016318427336403322, 0.02655962349378563, - true, + false, 0.020446285911006685, -0.002592261998183278, true, @@ -1069,16 +1069,16 @@ true, -0.046975404140848234, -0.03949338287409329, - true, + false, -0.0029449126784123676, -0.047242618258034386, - false, + true, 0.04658939021682799, -0.03949338287409329, - true, + false, -0.007072771253015731, -0.03949338287409329, - true, + false, -0.030463969842434782, -0.0763945037500033, true, @@ -1095,19 +1095,19 @@ "y": [ 0.024574144485610048, -0.03949338287409329, - true, + false, 0.030077955918414535, -0.03949338287409329, - true, + false, 0.03833367306762126, -0.03949338287409329, - false, + true, -0.013952535544021335, -0.002592261998183278, - true, + false, -0.0318399227006359, -0.03949338287409329, - false, + true, 0.04246153164222462, -0.0763945037500033, true, @@ -1116,25 +1116,25 @@ true, -0.062110885581060565, 0.026928634702544724, - false, + true, -0.04284754556624487, -0.002592261998183278, false, -0.005696818394814609, -0.03949338287409329, - false, + true, -0.015328488402222454, -0.002592261998183278, false, -0.001568959820211247, -0.03949338287409329, - true, + false, -0.07587041416307178, -0.0763945037500033, - true, + false, -0.005696818394814609, -0.002592261998183278, - true, + false, -0.007072771253015731, -0.03949338287409329, false, @@ -1149,13 +1149,13 @@ false, 0.039709625925822375, 0.10811110062954676, - true, + false, -0.009824676969417972, 0.03430885887772673, false, 0.01219056876179996, -0.03949338287409329, - false, + true, -0.034591828417038145, -0.0763945037500033, true, @@ -1173,22 +1173,22 @@ true, 0.024574144485610048, 0.15534453535071155, - true, + false, -0.035967781275239266, 0.07120997975363674, - true, + false, -0.037343734133440394, -0.03949338287409329, false, -0.0318399227006359, -0.03949338287409329, - false, + true, -0.004320865536613489, -0.0011162171631468765, - true, + false, -0.07587041416307178, -0.0763945037500033, - true, + false, 0.06998058880624704, 0.07120997975363674, true, @@ -1197,7 +1197,7 @@ false, -0.02358420555142918, -0.03949338287409329, - false, + true, 0.06034891879883919, 0.10811110062954676, false, @@ -1209,22 +1209,22 @@ false, 0.0025588987543921156, -0.03949338287409329, - true, + false, -0.0579830270064572, -0.03949338287409329, - true, + false, -0.001568959820211247, -0.03949338287409329, - true, + false, -0.05935897986465832, 0.012906208769698923, - false, + true, -0.037343734133440394, -0.011079519799642579, - false, + true, -0.07036660273026729, -0.002592261998183278, - false, + true, 0.027326050202012293, -0.03949338287409329, false, @@ -1233,37 +1233,37 @@ false, -0.0579830270064572, -0.03949338287409329, - false, + true, 0.001182945896190995, 0.03430885887772673, - false, + true, -0.001568959820211247, -0.03949338287409329, - true, + false, 0.010814615903598841, -0.03949338287409329, - false, + true, 0.024574144485610048, 0.05091436327188625, false, -0.060734932722859444, -0.0763945037500033, - true, + false, -0.007072771253015731, 0.03430885887772673, - false, + true, 0.00943866304539772, -0.002592261998183278, false, 0.039709625925822375, 0.10811110062954676, - true, + false, 0.11951489170148738, 0.08670845052151895, - false, + true, -0.04422349842444599, -0.03949338287409329, - true, + false, 0.001182945896190995, 0.03430885887772673, false, @@ -1272,7 +1272,7 @@ false, 0.08374011738825825, -0.03949338287409329, - true, + false, -0.009824676969417972, -0.002592261998183278, false, @@ -1284,31 +1284,31 @@ true, -0.004320865536613489, -0.002592261998183278, - true, + false, -0.015328488402222454, -0.002592261998183278, false, 0.01219056876179996, 0.07120997975363674, - false, + true, 0.039709625925822375, 0.10811110062954676, - true, + false, 0.05071724879143135, 0.03430885887772673, true, -0.0579830270064572, -0.03949338287409329, - false, + true, -0.02083229983502694, 0.07120997975363674, false, -0.037343734133440394, -0.002592261998183278, - true, + false, -0.0029449126784123676, 0.07120997975363674, - true, + false, 0.03558176735121902, -0.0763945037500033, true, @@ -1317,16 +1317,16 @@ false, -0.0318399227006359, -0.03949338287409329, - false, + true, -0.033215875558837024, -0.002592261998183278, false, 0.017694380194604446, 0.03430885887772673, - false, + true, -0.016704441260423575, -0.002592261998183278, - true, + false, -0.04284754556624487, -0.002592261998183278, true, @@ -1338,28 +1338,28 @@ false, 0.010814615903598841, -0.03949338287409329, - false, + true, 0.08374011738825825, -0.03949338287409329, - true, + false, -0.04422349842444599, -0.03949338287409329, - true, + false, -0.0029449126784123676, -0.002592261998183278, false, 0.03145390877661565, -0.03949338287409329, - false, + true, -0.06623874415566393, -0.03949338287409329, - true, + false, 0.001182945896190995, -0.007020396503292483, - true, + false, 0.01219056876179996, -0.03949338287409329, - false + true ] }, { @@ -2363,7 +2363,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -2487,7 +2487,7 @@ "[5 rows x 20 columns]" ] }, - "execution_count": 15, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -2518,7 +2518,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -3976,7 +3976,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -3997,15 +3997,15 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "[Parallel(n_jobs=1)]: Done 1 tasks | elapsed: 3.3s\n", - "[Parallel(n_jobs=1)]: Done 4 tasks | elapsed: 12.8s\n" + "[Parallel(n_jobs=1)]: Done 1 tasks | elapsed: 0.1s\n", + "[Parallel(n_jobs=1)]: Done 4 tasks | elapsed: 0.2s\n" ] }, { @@ -4028,7 +4028,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 16.0s finished\n" + "[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.3s finished\n" ] } ], @@ -4051,7 +4051,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -4062,8 +4062,32 @@ }, "data": [ { + "error_y": { + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "type": "data" + }, "marker": { - "color": "#00CC96" + "color": "#DDCC77" }, "name": "Train", "type": "bar", @@ -4111,8 +4135,32 @@ ] }, { + "error_y": { + "array": [ + 0.0023955551235670214, + 0.002189517306342527, + 0.001998045402184313, + 0.0018257279461347798, + 0.0016784747085066194, + 0.0015633841084603756, + 0.0014879382056280817, + 0.001458303139487877, + 0.0014772385383559053, + 0.0015429572455057856, + 0.0016498782177496946, + 0.0017906358968372744, + 0.0019579462215216135, + 0.0021456065826219173, + 0.0023487442428032587, + 0.002563682729688605, + 0.0027876937544495414, + 0.003018758272598448, + 0.003255374672423644 + ], + "type": "data" + }, "marker": { - "color": "#AB63FA" + "color": "#117733" }, "name": "Test", "type": "bar", @@ -4175,8 +4223,8 @@ "r": 50, "t": 80 }, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "template": { "data": { "bar": [ @@ -4998,14 +5046,22 @@ }, "width": 750, "xaxis": { + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", "showgrid": false, + "showline": true, "title": { "text": "Quantile" }, "zeroline": false }, "yaxis": { - "showgrid": false, + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true, "title": { "text": "Average Quantile Loss" }, @@ -5022,7 +5078,7 @@ "# Plot the results for numerical variables\n", "if \"quantile_loss\" in matching_results:\n", " perf_results_viz = model_performance_results(\n", - " results=matching_results[\"quantile_loss\"][\"results\"],\n", + " results=matching_results,\n", " model_name=\"Matching\",\n", " method_name=\"Cross-validation quantile loss average\",\n", " )\n", @@ -5050,7 +5106,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -5071,7 +5127,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -5086,7 +5142,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -5107,14 +5163,14 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'dist_fun': 'Gower', 'constrained': True, 'constr_alg': 'hungarian', 'k': 5}\n" + "{'dist_fun': 'Manhattan', 'k': 6}\n" ] } ], @@ -5133,7 +5189,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pe3.13", + "display_name": "pe3.13 (3.13.0)", "language": "python", "name": "python3" }, diff --git a/docs/models/mdn/index.md b/docs/models/mdn/index.md index c48797c..4f83612 100644 --- a/docs/models/mdn/index.md +++ b/docs/models/mdn/index.md @@ -1,6 +1,6 @@ # Mixture Density Network -The `MDN` model uses deep neural networks with mixture density outputs to predict missing values by learning complex, potentially multi-modal conditional distributions. Built on PyTorch Tabular, this approach combines the flexibility of neural networks with the probabilistic richness of Gaussian mixture models. +The `MDN` model uses neural networks with mixture density outputs to predict missing values. Built on PyTorch Tabular, it learns conditional distributions as mixtures of Gaussians, which lets it capture multi-modal relationships. ## Variable type support @@ -16,7 +16,7 @@ The model supports automatic caching based on data hashes, avoiding redundant re ## Key features -MDN offers several advantages for complex imputation tasks. The mixture density approach can model multi-modal distributions that simpler methods cannot capture, making it suitable for variables with complex conditional distributions. The neural network backbone can learn non-linear relationships without requiring explicit feature engineering. +MDN can model multi-modal distributions that simpler methods cannot capture, making it suited for variables with complex conditional distributions. The neural network backbone learns non-linear relationships without explicit feature engineering. Training leverages GPU acceleration when available and includes early stopping to prevent overfitting. The automatic model caching system speeds up repeated analyses on the same dataset. diff --git a/docs/models/mdn/mdn-imputation.ipynb b/docs/models/mdn/mdn-imputation.ipynb index 674f716..824d78e 100644 --- a/docs/models/mdn/mdn-imputation.ipynb +++ b/docs/models/mdn/mdn-imputation.ipynb @@ -115,16 +115,7 @@ "execution_count": 1, "id": "cell-2", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Error importing in API mode: ImportError(\"dlopen(/Users/movil1/envs/pe3.13/lib/python3.13/site-packages/_rinterface_cffi_api.abi3.so, 0x0002): Library not loaded: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.dylib\\n Referenced from: <21BE8260-F4D5-3597-9DD0-6953BC4DDF3D> /Users/movil1/envs/pe3.13/lib/python3.13/site-packages/_rinterface_cffi_api.abi3.so\\n Reason: tried: '/Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.dylib' (no such file), '/Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.dylib' (no such file)\")\n", - "Trying to import in ABI mode.\n" - ] - } - ], + "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", @@ -502,28 +493,28 @@ " \n", " \n", " 287\n", - " -0.239280\n", - " -0.307822\n", + " 0.577170\n", + " 0.438805\n", " \n", " \n", " 211\n", - " 0.339311\n", - " 0.358265\n", + " 0.481174\n", + " 0.488350\n", " \n", " \n", " 72\n", - " -0.276636\n", - " -0.277714\n", + " -0.721495\n", + " -0.631198\n", " \n", " \n", " 321\n", - " 0.540901\n", - " 0.551054\n", + " -1.211108\n", + " -1.460021\n", " \n", " \n", " 73\n", - " 0.460601\n", - " 0.446176\n", + " -1.162974\n", + " -1.194782\n", " \n", " \n", "\n", @@ -531,11 +522,11 @@ ], "text/plain": [ " s1 s4\n", - "287 -0.239280 -0.307822\n", - "211 0.339311 0.358265\n", - "72 -0.276636 -0.277714\n", - "321 0.540901 0.551054\n", - "73 0.460601 0.446176" + "287 0.577170 0.438805\n", + "211 0.481174 0.488350\n", + "72 -0.721495 -0.631198\n", + "321 -1.211108 -1.460021\n", + "73 -1.162974 -1.194782" ] }, "execution_count": 6, @@ -769,184 +760,184 @@ ], "xaxis": "x", "y": [ - 0.15996141731739044, - 0.032140739262104034, - 0.023270580917596817, - -0.07243411242961884, - 0.06383831799030304, - 0.0471138134598732, - 0.08792641758918762, - 0.183455690741539, - 0.034883130341768265, - -0.020984657108783722, - 0.1328243613243103, - 0.002175786066800356, - 0.8124674558639526, - 0.9326153993606567, - 0.1008240208029747, - 0.06365294754505157, - 0.3842753469944, - 0.46691128611564636, - 0.017988024279475212, - -0.016335798427462578, - 0.06642946600914001, - -0.008764325641095638, - -0.0118333101272583, - 0.010635918006300926, - -0.012584746815264225, - -0.0853499099612236, - -0.002956878859549761, - -0.024943694472312927, - -0.033975280821323395, - -0.07795815169811249, - -0.07504265010356903, - -0.03126005083322525, - 0.03940160199999809, - 0.053814880549907684, - -0.04383951798081398, - 0.019542427733540535, - -0.09670525044202805, - -0.0822581872344017, - 0.06511250138282776, - 0.09403425455093384, - 0.00344745977781713, - -0.00915258377790451, - 0.0950278714299202, - -0.048670198768377304, - 0.039458371698856354, - -0.07556705176830292, - -0.006443846970796585, - 0.020815376192331314, - -0.036735083907842636, - -0.044321704655885696, - -0.08580169081687927, - -0.059006646275520325, - -0.019963562488555908, - 0.009087007492780685, - -0.130485400557518, - -0.0006790757179260254, - -0.037002887576818466, - -0.09501223266124725, - 0.012499166652560234, - 0.02030245214700699, - 0.014375532045960426, - -0.02604287676513195, - 0.057647883892059326, - 0.05878327041864395, - -0.04572222754359245, - -0.03820172697305679, - -0.06333865225315094, - 0.04185344651341438, - 0.05389529839158058, - 0.01455413457006216, - 0.09297429770231247, - -0.0037352601066231728, - -0.014067748561501503, - 0.026063010096549988, - 0.007550985552370548, - -0.025209808722138405, - -0.04939274489879608, - -0.030361073091626167, - 0.03330788016319275, - -0.014227045699954033, - 0.0016633199993520975, - -0.08225220441818237, - 0.010647851973772049, - -0.08228402584791183, - -0.07383066415786743, - 0.061680346727371216, - -0.5339921116828918, - -0.6321333646774292, - 0.025442680343985558, - -0.022219836711883545, - -0.026420146226882935, - -0.10970157384872437, - -0.041401173919439316, - -0.0358879491686821, - -0.003495529294013977, - -0.04557208716869354, - 0.013635829091072083, - -0.043398745357990265, - 0.026523813605308533, - 0.00031686751754023135, - -0.09354585409164429, - -0.05077875778079033, - -0.03905845806002617, - -0.02609078772366047, - -0.006901499815285206, - 0.05072978138923645, - -0.0048773703165352345, - -0.01315099187195301, - 0.083067886531353, - 0.11018361896276474, - -0.042783450335264206, - -0.042475901544094086, - 0.007468030788004398, - 0.03531891107559204, - -0.09278491139411926, - -0.008651846088469028, - 0.03183288499712944, - -0.08680566400289536, - -0.01793188974261284, - -0.08094043284654617, - 0.08602085709571838, - 0.06315568834543228, - -0.020230960100889206, - 0.003904549404978752, - -0.03103073686361313, - -0.06506631523370743, - 0.036732763051986694, - -0.07117997109889984, - -0.0006138663738965988, - 0.03311414271593094, - 0.06245873123407364, - 0.002597265876829624, - 0.01770462840795517, - 0.058917708694934845, - -0.06402486562728882, - 0.048038020730018616, - -0.03813735395669937, - -0.028543436899781227, - -0.0075743068009614944, - 0.03675296530127525, - -0.014315500855445862, - 0.040746308863162994, - 0.07579956203699112, - 0.1126079186797142, - 0.08204692602157593, - 0.07413098216056824, - -0.0642552450299263, - 0.002614614088088274, - -0.033612947911024094, - -0.015575357712805271, - 0.08901567757129669, - 0.12694990634918213, - 0.12089148908853531, - 0.0254050400108099, - -0.005140587687492371, - 0.06322228908538818, - 0.017512474209070206, - 0.013693263754248619, - 0.059920668601989746, - 0.04606965184211731, - -0.03190714493393898, - -0.01763644628226757, - -0.03793055936694145, - -0.0012233610032126307, - 0.012116450816392899, - -0.026453981176018715, - 0.0048493873327970505, - -0.008992618881165981, - 0.05157541483640671, - -0.028200700879096985, - -0.05151493847370148, - -0.05033167079091072, - -0.11441226303577423, - -0.11985128372907639, - -0.07205710560083389, - 0.0047546266578137875, - -0.018449068069458008, - -0.006497040390968323 + 0.07409832626581192, + -0.0053354548290371895, + -0.12105628103017807, + -0.014382392168045044, + 0.04452350735664368, + -0.07941135764122009, + 0.04921489953994751, + 0.07562752068042755, + 0.08775658905506134, + -0.003818345023319125, + 0.12863661348819733, + 0.05178040266036987, + 0.04000586271286011, + -0.16531065106391907, + 0.06332286447286606, + 0.08498921245336533, + -0.010948514565825462, + -0.14337725937366486, + 0.17172245681285858, + -0.07638034224510193, + 0.033117081969976425, + -0.0034198835492134094, + -0.007393532898277044, + -0.026365965604782104, + -0.12046261131763458, + -0.027624964714050293, + 0.029128486290574074, + -0.06916160881519318, + -0.05742168426513672, + -0.10975533723831177, + 0.020898770540952682, + -0.1172960177063942, + -0.04515509307384491, + 0.026763781905174255, + 0.14253804087638855, + 0.2255028486251831, + -0.24605007469654083, + -0.03075171262025833, + -0.09652869403362274, + 0.20666047930717468, + -0.014879127964377403, + 0.024144992232322693, + -0.09012438356876373, + 0.022548293694853783, + -0.05704033374786377, + -0.11739443987607956, + -0.06362107396125793, + -0.02206820249557495, + -0.03970325365662575, + -0.08100323379039764, + -0.09121052920818329, + -0.01153072714805603, + 0.09131903946399689, + -0.05644859001040459, + -0.1356145739555359, + 0.13108958303928375, + -0.08045151084661484, + -0.0677538514137268, + -0.013112485408782959, + 0.03593648970127106, + -0.09408782422542572, + 0.10447344928979874, + 0.026929795742034912, + 0.004074967000633478, + -0.06840845197439194, + -0.020132899284362793, + -0.03740965574979782, + 0.01231334824115038, + 0.13786044716835022, + 0.061320580542087555, + 0.03548247739672661, + 0.15061387419700623, + 0.0036609352100640535, + -0.02198277786374092, + 0.13655224442481995, + -0.08470708131790161, + 0.0033969569485634565, + 0.11218808591365814, + 0.15245385468006134, + -0.05473918840289116, + -0.01783975213766098, + -0.10014862567186356, + 0.02230358123779297, + -0.1551317274570465, + -0.021243643015623093, + 0.024414116516709328, + -0.020500551909208298, + 0.14334836602210999, + 0.09190063178539276, + -0.06325235962867737, + 0.034143995493650436, + -0.010623842477798462, + 0.017537854611873627, + -0.021074065938591957, + -0.11523549258708954, + -0.025434572249650955, + 0.018908560276031494, + 0.012480437755584717, + 0.02391844429075718, + 0.04059349000453949, + -0.04446566849946976, + -0.07962190359830856, + -0.01866019144654274, + -0.09491998702287674, + -0.10590796172618866, + 0.11002372950315475, + -0.045452192425727844, + 0.048709649592638016, + 0.16254602372646332, + -0.23081794381141663, + 0.033685214817523956, + -0.0006430193898268044, + -0.015713322907686234, + 0.026455357670783997, + 0.06460753083229065, + 0.09441250562667847, + -0.008670782670378685, + -0.08653200417757034, + -0.07236170768737793, + -0.09426410496234894, + 0.14369378983974457, + -0.03581035137176514, + 0.008754465728998184, + 0.046415455639362335, + 0.03268638253211975, + 0.06044789403676987, + 0.08978655189275742, + -0.04920205473899841, + -0.1123436689376831, + 0.0034600854851305485, + 0.02713024616241455, + 0.003619933035224676, + -0.02590913698077202, + -0.09626477211713791, + -0.026048922911286354, + 0.01121927797794342, + -0.0919136255979538, + -0.04032476991415024, + -0.04339555650949478, + 0.041690241545438766, + 0.09366445243358612, + 0.16090711951255798, + 0.12886887788772583, + 0.024945732206106186, + 0.10310709476470947, + 0.09357581287622452, + -0.024438243359327316, + -0.02837105467915535, + -0.10025747120380402, + -0.15249663591384888, + 0.045413028448820114, + 0.16909754276275635, + 0.15786541998386383, + 0.13495682179927826, + -0.02144046686589718, + 0.08984969556331635, + -0.04134964570403099, + -0.051257528364658356, + 0.045112937688827515, + 0.047064878046512604, + 0.034162651747465134, + 0.021895015612244606, + -0.05455716326832771, + -0.0889664888381958, + 0.011050431989133358, + -0.014817613177001476, + 0.163625568151474, + 0.03653216361999512, + -0.06846585869789124, + -0.08761408925056458, + -0.08431434631347656, + -0.06531454622745514, + -0.01888906955718994, + -0.09313887357711792, + -0.10920677334070206, + -0.05248451232910156, + 0.001476499019190669, + -0.011065206490457058 ], "yaxis": "y" }, @@ -959,12 +950,12 @@ "name": "Perfect prediction", "type": "scatter", "x": [ - -1.969916820526123, - 1.6161797046661377 + -2.2862510681152344, + 2.5850915908813477 ], "y": [ - -1.969916820526123, - 1.6161797046661377 + -2.2862510681152344, + 2.5850915908813477 ] } ], @@ -1942,47 +1933,47 @@ " \n", " 0\n", " 0.125019\n", - " -1.208731\n", - " -0.793742\n", - " -0.239280\n", - " 0.260678\n", - " 0.750109\n", + " -1.071396\n", + " -0.291549\n", + " 0.577170\n", + " 1.379413\n", + " 2.154069\n", " \n", " \n", " 1\n", " -0.024960\n", - " -0.430616\n", - " -0.080356\n", - " 0.339311\n", - " 0.740931\n", - " 1.117335\n", + " -1.594807\n", + " -0.647442\n", + " 0.481174\n", + " 1.623415\n", + " 2.562861\n", " \n", " \n", " 2\n", " 0.103003\n", - " -1.449445\n", - " -0.907212\n", - " -0.276636\n", - " 0.273373\n", - " 0.844860\n", + " -2.563489\n", + " -1.645817\n", + " -0.721495\n", + " 0.225897\n", + " 1.118832\n", " \n", " \n", " 3\n", " 0.054845\n", - " -0.039490\n", - " 0.249726\n", - " 0.540901\n", - " 0.896468\n", - " 1.195148\n", + " -3.448399\n", + " -2.342187\n", + " -1.211108\n", + " 0.049215\n", + " 1.042724\n", " \n", " \n", " 4\n", " 0.038334\n", - " -0.671013\n", - " -0.092434\n", - " 0.460601\n", - " 1.070943\n", - " 1.577428\n", + " -3.044891\n", + " -2.123165\n", + " -1.162974\n", + " -0.149736\n", + " 0.683350\n", " \n", " \n", "\n", @@ -1990,11 +1981,11 @@ ], "text/plain": [ " Actual Q10 Q25 Q50 Q75 Q90\n", - "0 0.125019 -1.208731 -0.793742 -0.239280 0.260678 0.750109\n", - "1 -0.024960 -0.430616 -0.080356 0.339311 0.740931 1.117335\n", - "2 0.103003 -1.449445 -0.907212 -0.276636 0.273373 0.844860\n", - "3 0.054845 -0.039490 0.249726 0.540901 0.896468 1.195148\n", - "4 0.038334 -0.671013 -0.092434 0.460601 1.070943 1.577428" + "0 0.125019 -1.071396 -0.291549 0.577170 1.379413 2.154069\n", + "1 -0.024960 -1.594807 -0.647442 0.481174 1.623415 2.562861\n", + "2 0.103003 -2.563489 -1.645817 -0.721495 0.225897 1.118832\n", + "3 0.054845 -3.448399 -2.342187 -1.211108 0.049215 1.042724\n", + "4 0.038334 -3.044891 -2.123165 -1.162974 -0.149736 0.683350" ] }, "execution_count": 8, @@ -2054,8 +2045,8 @@ 0 ], "y": [ - -1.208730936050415, - 0.7501086592674255 + -1.0713963508605957, + 2.154068946838379 ] }, { @@ -2072,8 +2063,8 @@ 1 ], "y": [ - -0.4306159019470215, - 1.1173346042633057 + -1.5948072671890259, + 2.5628609657287598 ] }, { @@ -2090,8 +2081,8 @@ 2 ], "y": [ - -1.4494445323944092, - 0.8448596596717834 + -2.5634894371032715, + 1.118831753730774 ] }, { @@ -2108,8 +2099,8 @@ 3 ], "y": [ - -0.03949018567800522, - 1.1951476335525513 + -3.448399305343628, + 1.0427237749099731 ] }, { @@ -2126,8 +2117,8 @@ 4 ], "y": [ - -0.6710134148597717, - 1.577427625656128 + -3.044891357421875, + 0.6833502650260925 ] }, { @@ -2144,8 +2135,8 @@ 5 ], "y": [ - -1.388054609298706, - 0.7144660353660583 + -1.1571630239486694, + 1.9580988883972168 ] }, { @@ -2162,8 +2153,8 @@ 6 ], "y": [ - 0.9335368275642395, - 1.994225263595581 + -0.448160856962204, + 5.394647121429443 ] }, { @@ -2180,8 +2171,8 @@ 7 ], "y": [ - -1.2012914419174194, - 0.6220993399620056 + -3.3663272857666016, + 1.5296334028244019 ] }, { @@ -2198,8 +2189,8 @@ 8 ], "y": [ - 0.4870220720767975, - 1.1506199836730957 + -0.9083917140960693, + 4.910729885101318 ] }, { @@ -2216,8 +2207,8 @@ 9 ], "y": [ - -1.1105694770812988, - 0.017988024279475212 + 0.17172245681285858, + 3.2345242500305176 ] }, { @@ -2234,8 +2225,8 @@ 0 ], "y": [ - -0.6731794476509094, - 0.15996141731739044 + -0.11874838173389435, + 1.195131540298462 ] }, { @@ -2252,8 +2243,8 @@ 1 ], "y": [ - 0.023270580917596817, - 0.658467710018158 + -0.40085601806640625, + 1.4143391847610474 ] }, { @@ -2270,8 +2261,8 @@ 2 ], "y": [ - -0.769422709941864, - 0.17357832193374634 + -1.4394127130508423, + 0.04452350735664368 ] }, { @@ -2288,8 +2279,8 @@ 3 ], "y": [ - 0.3068358898162842, - 0.8011546730995178 + -2.0836896896362305, + -0.2426186203956604 ] }, { @@ -2306,8 +2297,8 @@ 4 ], "y": [ - 0.034883130341768265, - 0.9577965140342712 + -1.900681734085083, + -0.4198998510837555 ] }, { @@ -2324,8 +2315,8 @@ 5 ], "y": [ - -0.7857669591903687, - 0.1328243613243103 + -0.14701643586158752, + 1.0303322076797485 ] }, { @@ -2342,8 +2333,8 @@ 6 ], "y": [ - 1.253185749053955, - 1.6908645629882812 + 1.3525761365890503, + 3.828951597213745 ] }, { @@ -2360,8 +2351,8 @@ 7 ], "y": [ - -0.629646360874176, - 0.1008240208029747 + -1.7197819948196411, + 0.2868454158306122 ] }, { @@ -2378,8 +2369,8 @@ 8 ], "y": [ - 0.6771109104156494, - 0.9602589011192322 + 0.6424643397331238, + 3.1236233711242676 ] }, { @@ -2396,8 +2387,8 @@ 9 ], "y": [ - -0.7771245241165161, - -0.29959893226623535 + 1.113405704498291, + 2.3700172901153564 ] }, { @@ -2454,16 +2445,16 @@ 9 ], "y": [ - -0.23928046226501465, - 0.339310884475708, - -0.276636004447937, - 0.540900707244873, - 0.4606007933616638, - -0.34471726417541504, - 1.4770541191101074, - -0.30302998423576355, - 0.8187563419342041, - -0.5293239951133728 + 0.5771697759628296, + 0.4811735153198242, + -0.7214951515197754, + -1.211107611656189, + -1.1629741191864014, + 0.41260623931884766, + 2.5850915908813477, + -0.6760748624801636, + 1.8518712520599365, + 1.7761045694351196 ] }, { @@ -3472,9 +3463,9 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 7.6s remaining: 11.5s\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 7.6s remaining: 5.1s\n", - "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 7.7s finished\n" + "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 9.5s remaining: 14.3s\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 9.5s remaining: 6.4s\n", + "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 9.5s finished\n" ] }, { @@ -3483,8 +3474,8 @@ "text": [ "Quantile loss results:\n", " 0.05 0.10 0.15 0.20 0.25 ... 0.75 0.80 0.85 0.90 0.95\n", - "train 0.052342 0.080491 0.100151 0.114462 0.124877 ... 0.116854 0.105562 0.090379 0.070140 0.043119\n", - "test 0.060333 0.088338 0.109102 0.123207 0.134303 ... 0.127896 0.114887 0.099006 0.077486 0.047284\n", + "train 0.046876 0.074835 0.094329 0.108058 0.117289 ... 0.125522 0.116335 0.102234 0.081915 0.052980\n", + "test 0.048934 0.078406 0.099249 0.117245 0.130767 ... 0.133579 0.123578 0.109620 0.088337 0.058313\n", "\n", "[2 rows x 19 columns]\n" ] @@ -3516,8 +3507,32 @@ }, "data": [ { + "error_y": { + "array": [ + 0.03837709044008565, + 0.05971215726699471, + 0.07364494245759541, + 0.08337091425123092, + 0.08970334204623862, + 0.09257452417327834, + 0.09425214250614794, + 0.09727578509414461, + 0.1015340536222146, + 0.10484112107099822, + 0.10665196062518409, + 0.10767398977417002, + 0.10657423431327813, + 0.10291839541792067, + 0.09739380134017506, + 0.08998945316371061, + 0.079000703908655, + 0.0623493126962366, + 0.03897342645724234 + ], + "type": "data" + }, "marker": { - "color": "#00CC96" + "color": "#DDCC77" }, "name": "Train", "type": "bar", @@ -3543,30 +3558,54 @@ "0.95" ], "y": [ - 0.05234219330354317, - 0.08049099191203442, - 0.10015070706030556, - 0.11446162331927275, - 0.12487722321825685, - 0.1324132843109902, - 0.13768463404454853, - 0.14056006658781792, - 0.14185292803744393, - 0.1415992977069213, - 0.14005457428331253, - 0.13682163676619796, - 0.13220755848574667, - 0.12584912155335878, - 0.11685420327991669, - 0.10556158423365573, - 0.09037880944328178, - 0.07014017488138428, - 0.04311920349617806 + 0.04687617706207272, + 0.07483489712462413, + 0.0943290184639551, + 0.10805756595645155, + 0.11728923842580923, + 0.12286641601968225, + 0.12616856929600748, + 0.1292466478910964, + 0.13271784812663345, + 0.1354354106464196, + 0.13713837435319742, + 0.13782672818961056, + 0.13631602177577212, + 0.13210069705430905, + 0.12552150971602297, + 0.11633498833082316, + 0.10223421559735249, + 0.08191549168418728, + 0.0529798258038449 ] }, { + "error_y": { + "array": [ + 0.03618523330977212, + 0.05800221625311354, + 0.07291441840284316, + 0.08871777392907335, + 0.10179376511491461, + 0.11098038464484912, + 0.11340640962306367, + 0.11611839981806513, + 0.11748612497231077, + 0.1174333555879695, + 0.11549620009870612, + 0.1127200411691131, + 0.10807914038546579, + 0.10210520685018526, + 0.0948305718757984, + 0.08725433626495321, + 0.0765462308033389, + 0.060192339856620924, + 0.03773031440262491 + ], + "type": "data" + }, "marker": { - "color": "#AB63FA" + "color": "#117733" }, "name": "Test", "type": "bar", @@ -3592,25 +3631,25 @@ "0.95" ], "y": [ - 0.060333009487974085, - 0.08833805422856528, - 0.10910236343419596, - 0.12320670350109023, - 0.13430269442274195, - 0.14292452496806163, - 0.14938276914149362, - 0.15449110540720765, - 0.1571806630200133, - 0.1578150543631282, - 0.15689612315245363, - 0.15328965501428699, - 0.14702280821997657, - 0.13845547628705684, - 0.12789622672114154, - 0.11488700831441748, - 0.099006403363506, - 0.07748605801852056, - 0.047284249954029064 + 0.04893408004321757, + 0.07840558199482109, + 0.09924928077798252, + 0.11724509694752339, + 0.13076715505019737, + 0.14024932427368472, + 0.14459225917030372, + 0.1486228918064114, + 0.15166062433499797, + 0.1528524649168001, + 0.15231682792337978, + 0.15052964914121986, + 0.14697318308426555, + 0.14127787715452564, + 0.1335791298846442, + 0.1235777656562175, + 0.10962020934072403, + 0.08833690511355873, + 0.05831330288784895 ] } ], @@ -3629,8 +3668,8 @@ "r": 50, "t": 80 }, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "template": { "data": { "bar": [ @@ -4452,14 +4491,22 @@ }, "width": 750, "xaxis": { + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", "showgrid": false, + "showline": true, "title": { "text": "Quantile" }, "zeroline": false }, "yaxis": { - "showgrid": false, + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true, "title": { "text": "Average Quantile Loss" }, @@ -4476,7 +4523,7 @@ "# Plot the results\n", "if \"quantile_loss\" in mdn_results:\n", " perf_results_viz = model_performance_results(\n", - " results=mdn_results[\"quantile_loss\"][\"results\"],\n", + " results=mdn_results,\n", " model_name=\"MDN\",\n", " method_name=\"Cross-validation quantile loss average\",\n", " )\n", @@ -4531,9 +4578,9 @@ "text": [ "Categorical variable distribution:\n", "risk_level\n", + "medium 150\n", "low 148\n", - "high 148\n", - "medium 146\n", + "high 144\n", "Name: count, dtype: int64\n", "\n", "Training set size: 353 records\n", @@ -4607,13 +4654,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Categorical imputation accuracy: 31.46%\n", + "Categorical imputation accuracy: 30.34%\n", "\n", "Confusion matrix:\n", " Predicted: low Predicted: medium Predicted: high\n", - "Actual: low 10 8 12\n", - "Actual: medium 14 11 4\n", - "Actual: high 7 16 7\n" + "Actual: low 8 5 17\n", + "Actual: medium 11 8 10\n", + "Actual: high 7 12 11\n" ] } ], @@ -4647,9 +4694,9 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 0.8s remaining: 1.2s\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 0.9s remaining: 0.6s\n", - "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 0.9s finished\n" + "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 1.2s remaining: 1.9s\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 1.3s remaining: 0.9s\n", + "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 1.4s finished\n" ] }, { @@ -4657,8 +4704,8 @@ "output_type": "stream", "text": [ "Categorical imputation cross-validation results (log loss):\n", - "Mean train log loss: 0.9622\n", - "Mean test log loss: 1.0936\n" + "Mean train log loss: 0.9076\n", + "Mean test log loss: 1.0931\n" ] } ], @@ -4688,8 +4735,14 @@ }, "data": [ { + "error_y": { + "array": [ + 0.027550481167352696 + ], + "type": "data" + }, "marker": { - "color": "#00CC96" + "color": "#DDCC77" }, "name": "Train", "showlegend": true, @@ -4699,13 +4752,19 @@ ], "xaxis": "x", "y": [ - 0.9622434565816542 + 0.9075664863898126 ], "yaxis": "y" }, { + "error_y": { + "array": [ + 0.0913599760690238 + ], + "type": "data" + }, "marker": { - "color": "#AB63FA" + "color": "#117733" }, "name": "Test", "showlegend": true, @@ -4715,7 +4774,7 @@ ], "xaxis": "x", "y": [ - 1.093641015261423 + 1.093074681095708 ], "yaxis": "y" } @@ -4737,8 +4796,8 @@ } ], "height": 420, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "showlegend": true, "template": { "data": { @@ -5565,14 +5624,24 @@ "domain": [ 0, 1 - ] + ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": false, + "showline": true }, "yaxis": { "anchor": "x", "domain": [ 0, 1 - ] + ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true } } } @@ -5608,7 +5677,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pe3.13", + "display_name": "pe3.13 (3.13.0)", "language": "python", "name": "python3" }, diff --git a/docs/models/ols/index.md b/docs/models/ols/index.md index 5312939..13ef8bd 100644 --- a/docs/models/ols/index.md +++ b/docs/models/ols/index.md @@ -1,17 +1,17 @@ # Ordinary Least Squares -The `OLS` model employs linear regression techniques to predict missing values by leveraging the relationships between predictor and target variables. This classic statistical approach provides a computationally efficient method for imputation while offering theoretical guarantees under certain assumptions. +The `OLS` model uses linear regression to predict missing values from the relationships between predictor and target variables. It is computationally fast and provides a useful baseline for comparison with more complex methods. ## Variable type support -OLS automatically adapts to your target variable types. For numerical variables, it uses standard linear regression. For categorical variables (including strings, booleans, or numerically-encoded categorical variables), it automatically switches to logistic regression classification. This automatic detection means you don't need to specify variable types—simply pass your predictors and targets, and the model handles the rest internally. +OLS adapts to target variable types automatically. For numerical variables, it uses standard linear regression. For categorical variables (including strings, booleans, or numerically-encoded categorical variables), it switches to logistic regression. You don't need to specify variable types manually. ## How it works -The OLS imputer works by fitting a linear regression model using the statsmodels implementation of Ordinary Least Squares. During the training phase, it identifies the coefficients that minimize the sum of squared residuals between the predicted and actual values in the training data. This creates a model that captures the linear relationship between the predictors and target variables. +The OLS imputer fits a linear regression model using the statsmodels implementation. During training, it finds the coefficients that minimize the sum of squared residuals between predicted and actual values. -For prediction at different quantiles, the model makes an important assumption that the residuals (the differences between predicted and actual values) follow a normal distribution. This assumption allows the model to generate predictions at various quantiles by starting with the mean prediction and adding a quantile-specific offset derived from the normal distribution. Specifically, it computes the standard error of the predictions and applies the inverse normal cumulative distribution function to generate predictions at the requested quantiles. +For prediction at different quantiles, the model assumes normally distributed residuals. It starts with the mean prediction and adds a quantile-specific offset computed from the normal distribution's inverse CDF and the standard error of the predictions. ## Key features -The OLS imputer offers a simple yet powerful parametric approach with fast training and prediction times compared to more complex models. It relies on the assumption of linear relationships between variables, making it particularly suitable for datasets where such relationships hold or as a baseline comparison for more complex approaches. +OLS is fast to train and predict. It works well when the relationship between predictors and targets is approximately linear. Because it assumes constant variance and normally distributed errors, it tends to compress imputed values toward the mean, producing a narrower distribution than the true one. This makes it a good baseline but a poor choice when the data has heavy tails or heteroscedastic errors. diff --git a/docs/models/ols/ols-imputation.ipynb b/docs/models/ols/ols-imputation.ipynb index 0502f68..f09b1d9 100644 --- a/docs/models/ols/ols-imputation.ipynb +++ b/docs/models/ols/ols-imputation.ipynb @@ -71,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -217,7 +217,7 @@ "4 0.005383 -0.044642 -0.036385 0.021872 0.003935 0.015596 0.008142 -0.002592 -0.031988 -0.046641" ] }, - "execution_count": 56, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -233,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -354,7 +354,7 @@ "max 1.107267e-01 5.068012e-02 1.705552e-01 1.320436e-01 1.539137e-01 1.852344e-01" ] }, - "execution_count": 57, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -376,7 +376,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -408,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -499,7 +499,7 @@ "73 0.012648 0.050680 -0.020218 -0.002228 NaN NaN" ] }, - "execution_count": 59, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -528,7 +528,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -547,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -561,7 +561,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -628,7 +628,7 @@ "73 -0.004692 0.007055" ] }, - "execution_count": 62, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -653,7 +653,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -2004,7 +2004,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -2128,7 +2128,7 @@ "[5 rows x 20 columns]" ] }, - "execution_count": 64, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -2159,7 +2159,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -3617,14 +3617,17 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n" + "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", + "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 13.5s remaining: 20.2s\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 13.5s remaining: 9.0s\n", + "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 13.6s finished\n" ] }, { @@ -3657,7 +3660,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -3668,8 +3671,32 @@ }, "data": [ { + "error_y": { + "array": [ + 0.00007176011467255402, + 0.0000913355164601245, + 0.00011083575969884443, + 0.00011210242100357653, + 0.00011563162775412741, + 0.00013000531898907708, + 0.000143271836739722, + 0.0001506544338309766, + 0.00015261535043567369, + 0.00014081751874840215, + 0.00013834799510673368, + 0.0001357194581903946, + 0.00012375064613863142, + 0.00011764060922499956, + 0.00010758816302847906, + 0.00009853561930363294, + 0.00010941603098900106, + 0.00011884481777470878, + 0.00009323804980730522 + ], + "type": "data" + }, "marker": { - "color": "#00CC96" + "color": "#DDCC77" }, "name": "Train", "type": "bar", @@ -3717,8 +3744,32 @@ ] }, { + "error_y": { + "array": [ + 0.0002511960288130229, + 0.0003728781059406671, + 0.0005215834564121717, + 0.000522694690812438, + 0.0005201751472757763, + 0.0005498446940786355, + 0.000608514199932397, + 0.0006423333112739606, + 0.0006362169672265104, + 0.0005805283237282669, + 0.0005503271496842148, + 0.0005306193310896558, + 0.0005077865393829969, + 0.000485382018208908, + 0.00043665631509002455, + 0.00036712860842352926, + 0.0004221172731648885, + 0.0005054827478209771, + 0.00043716321985420154 + ], + "type": "data" + }, "marker": { - "color": "#AB63FA" + "color": "#117733" }, "name": "Test", "type": "bar", @@ -3781,8 +3832,8 @@ "r": 50, "t": 80 }, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "template": { "data": { "bar": [ @@ -4604,14 +4655,22 @@ }, "width": 750, "xaxis": { + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", "showgrid": false, + "showline": true, "title": { "text": "Quantile" }, "zeroline": false }, "yaxis": { - "showgrid": false, + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true, "title": { "text": "Average Quantile Loss" }, @@ -4628,7 +4687,7 @@ "# Plot the results for numerical variables\n", "if \"quantile_loss\" in ols_results:\n", " perf_results_viz = model_performance_results(\n", - " results=ols_results[\"quantile_loss\"][\"results\"],\n", + " results=ols_results,\n", " model_name=\"OLS\",\n", " method_name=\"Cross-validation quantile loss average\",\n", " )\n", @@ -4649,7 +4708,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -4658,19 +4717,19 @@ "text": [ "Categorical variable distribution:\n", "risk_level\n", + "medium 150\n", "low 148\n", - "high 148\n", - "medium 146\n", + "high 144\n", "Name: count, dtype: int64\n", "\n", "Percentage distribution:\n", "risk_level\n", + "medium 0.339367\n", "low 0.334842\n", - "high 0.334842\n", - "medium 0.330317\n", + "high 0.325792\n", "Name: proportion, dtype: float64\n", "\n", - "Data types: {'age': dtype('float64'), 'sex': dtype('float64'), 'bmi': dtype('float64'), 'bp': dtype('float64'), 'risk_level': dtype('O')}\n", + "Data types: {'age': dtype('float64'), 'sex': dtype('float64'), 'bmi': dtype('float64'), 'bp': dtype('float64'), 'risk_level': }\n", "\n", "Training set size: 353 records\n", "Testing set size: 89 records\n" @@ -4707,7 +4766,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -4750,20 +4809,20 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Categorical imputation accuracy: 40.45%\n", + "Categorical imputation accuracy: 37.08%\n", "\n", "Confusion matrix:\n", " Predicted: low Predicted: medium Predicted: high\n", - "Actual: low 15 11 4\n", - "Actual: medium 9 20 0\n", - "Actual: high 10 19 1\n" + "Actual: low 9 10 11\n", + "Actual: medium 4 20 5\n", + "Actual: high 6 20 4\n" ] } ], @@ -4791,14 +4850,17 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n" + "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", + "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 1.1s remaining: 1.6s\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 1.2s remaining: 0.8s\n", + "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 1.6s finished\n" ] }, { @@ -4806,8 +4868,8 @@ "output_type": "stream", "text": [ "Categorical imputation cross-validation results (log loss):\n", - "Mean train log loss: 1.0673\n", - "Mean test log loss: 1.0776\n" + "Mean train log loss: 1.0681\n", + "Mean test log loss: 1.0794\n" ] } ], @@ -4828,7 +4890,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -4839,8 +4901,14 @@ }, "data": [ { + "error_y": { + "array": [ + 0.0019313286420746783 + ], + "type": "data" + }, "marker": { - "color": "#00CC96" + "color": "#DDCC77" }, "name": "Train", "showlegend": true, @@ -4850,13 +4918,19 @@ ], "xaxis": "x", "y": [ - 1.0673353634599498 + 1.0681169294698512 ], "yaxis": "y" }, { + "error_y": { + "array": [ + 0.011486633730960285 + ], + "type": "data" + }, "marker": { - "color": "#AB63FA" + "color": "#117733" }, "name": "Test", "showlegend": true, @@ -4866,7 +4940,7 @@ ], "xaxis": "x", "y": [ - 1.077618288538511 + 1.0794183318669401 ], "yaxis": "y" } @@ -4878,7 +4952,7 @@ "size": 16 }, "showarrow": false, - "text": "Log Loss Performance", + "text": "Log loss performance", "x": 0.5, "xanchor": "center", "xref": "paper", @@ -4888,8 +4962,8 @@ } ], "height": 420, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "showlegend": true, "template": { "data": { @@ -5716,14 +5790,24 @@ "domain": [ 0, 1 - ] + ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": false, + "showline": true }, "yaxis": { "anchor": "x", "domain": [ 0, 1 - ] + ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true } } } @@ -5749,7 +5833,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pe3.13", + "display_name": "pe3.13 (3.13.0)", "language": "python", "name": "python3" }, diff --git a/docs/models/qrf/index.md b/docs/models/qrf/index.md index 7e15838..170ec9a 100644 --- a/docs/models/qrf/index.md +++ b/docs/models/qrf/index.md @@ -1,21 +1,19 @@ # Quantile Random Forests -The `QRF` model harnesses the power of ensemble learning by utilizing multiple decision trees to predict different quantiles of the target variable distribution. This sophisticated approach allows for flexible modeling of complex relationships while providing robust estimates of uncertainty. +The `QRF` model uses an ensemble of decision trees to predict different quantiles of the target variable distribution. This allows it to model non-linear relationships while estimating uncertainty across the conditional distribution. ## Variable type support -QRF handles both numerical and categorical variables. For numerical targets, it uses quantile regression forests. For categorical targets (strings, booleans, numerically-encoded categorical variables), it automatically employs a Random Forest Classifier. The model detects variable types automatically and applies the appropriate method internally, requiring no manual specification from users. +QRF handles both numerical and categorical variables. For numerical targets, it uses quantile regression forests. For categorical targets (strings, booleans, numerically-encoded categorical variables), it automatically uses a Random Forest Classifier. The model detects variable types internally and requires no manual specification. ## How it works -Quantile Random Forests build upon the foundation of random forests by implementing a specialized algorithm from the quantile_forest package. The method begins by constructing an ensemble of decision trees, each trained on different bootstrapped samples of the original data. This process, known as bagging, introduces diversity among the individual trees and helps reduce overfitting. +Quantile Random Forests build on standard random forests using the `quantile_forest` package. The method constructs an ensemble of decision trees, each trained on a bootstrapped sample of the data (bagging). At each split, only a random subset of features is considered, which introduces diversity among trees and reduces overfitting. -During training, each tree in the forest predicts the target variable using only a random subset of the available features at each split point. This feature randomization further enhances diversity within the ensemble and improves its ability to capture various aspects of the underlying data relationships. +Unlike standard random forests that aggregate predictions into averages, QRF retains the full predictive distribution from each tree and estimates quantiles directly from this empirical distribution. ## Key features -The Quantile Random Forest (QRF) imputer provides a robust non-parametric method particularly effective for datasets exhibiting complex, non-linear relationships and heteroscedasticity. Unlike linear models, which rely on strong distributional assumptions, QRF makes minimal assumptions about the underlying data structure, adapting its uncertainty measures to reflect varying levels of variability within different regions of the input data. +QRF is non-parametric and makes minimal assumptions about the data structure. It adapts its uncertainty estimates to different regions of the input space, producing wider prediction intervals where the data is more variable and tighter intervals where it is less so. -QRF's primary strength lies in its predictive approach. While traditional random forests aggregate predictions into averages, QRF maintains the entire predictive distribution from each tree, directly estimating quantiles based on this empirical distribution. It also quantifies uncertainty through robust prediction intervals derived directly from its quantile estimates. These intervals dynamically adjust across the feature space, effectively signaling areas with varying levels of predictive certainty. - -Although QRF typically involves higher computational demands compared to simpler linear models, its enhanced accuracy on datasets with complex, non-linear relationships frequently justifies this trade-off. For applications where accurate predictive performance and meaningful uncertainty quantification are critical, QRF emerges as an especially valuable approach. +The method is computationally heavier than linear models, but often more accurate on datasets with non-linear relationships or heteroscedasticity (where variance depends on predictor values). Hyperparameter tuning via Optuna is available for optimizing the number of trees, minimum samples per leaf, split thresholds, and feature sampling. diff --git a/docs/models/qrf/qrf-imputation.ipynb b/docs/models/qrf/qrf-imputation.ipynb index c59a999..ffba33f 100644 --- a/docs/models/qrf/qrf-imputation.ipynb +++ b/docs/models/qrf/qrf-imputation.ipynb @@ -97,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -3658,9 +3658,9 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 6.8s remaining: 10.2s\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 6.8s remaining: 4.5s\n", - "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 6.8s finished\n" + "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 19.2s remaining: 28.7s\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 19.2s remaining: 12.8s\n", + "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 19.3s finished\n" ] }, { @@ -3704,8 +3704,32 @@ }, "data": [ { + "error_y": { + "array": [ + 0.00008551920671991658, + 0.0004107245170541804, + 0.00018326432680445731, + 0.00044296698746322717, + 0.00024075509310405528, + 0.00029083292370858524, + 0.00043090603620434025, + 0.0004606508356991907, + 0.00034842456444518586, + 0.0004626832277981355, + 0.000816089425956785, + 0.00038467021226627177, + 0.0003398728669511024, + 0.000309964218752641, + 0.0002952487775964039, + 0.0002930002413745392, + 0.00022755896739762955, + 0.00017022925074651195, + 0.00005512096011768218 + ], + "type": "data" + }, "marker": { - "color": "#00CC96" + "color": "#DDCC77" }, "name": "Train", "type": "bar", @@ -3753,8 +3777,32 @@ ] }, { + "error_y": { + "array": [ + 0.000623604695409784, + 0.0009828712930208695, + 0.0012293155627994283, + 0.001167454357338009, + 0.000969638311140881, + 0.0007127881853378359, + 0.002636442666073569, + 0.001259531904761815, + 0.0010923805491178616, + 0.001634028502692155, + 0.0006800631282736149, + 0.0009467176016052857, + 0.0010995284899625922, + 0.0008688007594503854, + 0.0010158843160004165, + 0.0011140556744687275, + 0.0006082527278363497, + 0.00045185788868329796, + 0.0004799569375129921 + ], + "type": "data" + }, "marker": { - "color": "#AB63FA" + "color": "#117733" }, "name": "Test", "type": "bar", @@ -3817,8 +3865,8 @@ "r": 50, "t": 80 }, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "template": { "data": { "bar": [ @@ -4640,14 +4688,22 @@ }, "width": 750, "xaxis": { + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", "showgrid": false, + "showline": true, "title": { "text": "Quantile" }, "zeroline": false }, "yaxis": { - "showgrid": false, + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true, "title": { "text": "Average Quantile Loss" }, @@ -4664,7 +4720,7 @@ "# Plot the results for numerical variables\n", "if \"quantile_loss\" in qrf_results:\n", " perf_results_viz = model_performance_results(\n", - " results=qrf_results[\"quantile_loss\"][\"results\"],\n", + " results=qrf_results,\n", " model_name=\"QRF\",\n", " method_name=\"Cross-validation quantile loss average\",\n", " )\n", @@ -4739,7 +4795,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -4748,19 +4804,19 @@ "text": [ "Categorical variable distribution:\n", "risk_level\n", + "medium 150\n", "low 148\n", - "high 148\n", - "medium 146\n", + "high 144\n", "Name: count, dtype: int64\n", "\n", "Percentage distribution:\n", "risk_level\n", + "medium 0.339367\n", "low 0.334842\n", - "high 0.334842\n", - "medium 0.330317\n", + "high 0.325792\n", "Name: proportion, dtype: float64\n", "\n", - "Data types: {'age': dtype('float64'), 'sex': dtype('float64'), 'bmi': dtype('float64'), 'bp': dtype('float64'), 'risk_level': dtype('O')}\n", + "Data types: {'age': dtype('float64'), 'sex': dtype('float64'), 'bmi': dtype('float64'), 'bp': dtype('float64'), 'risk_level': }\n", "\n", "Training set size: 353 records\n", "Testing set size: 89 records\n" @@ -4797,7 +4853,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -4840,20 +4896,20 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Categorical imputation accuracy: 42.70%\n", + "Categorical imputation accuracy: 44.94%\n", "\n", "Confusion matrix:\n", " Predicted: low Predicted: medium Predicted: high\n", - "Actual: low 13 5 12\n", - "Actual: medium 7 11 11\n", - "Actual: high 3 13 14\n" + "Actual: low 14 4 12\n", + "Actual: medium 8 13 8\n", + "Actual: high 4 13 13\n" ] } ], @@ -4881,7 +4937,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -4889,9 +4945,9 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 0.7s remaining: 1.1s\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 0.7s remaining: 0.5s\n", - "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 0.7s finished\n" + "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 3.9s remaining: 5.8s\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 4.1s remaining: 2.7s\n", + "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 4.4s finished\n" ] }, { @@ -4899,8 +4955,8 @@ "output_type": "stream", "text": [ "Categorical imputation cross-validation results (log loss):\n", - "Mean train log loss: 0.2656\n", - "Mean test log loss: 1.2133\n" + "Mean train log loss: 0.2666\n", + "Mean test log loss: 1.2308\n" ] } ], @@ -4921,7 +4977,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -4932,8 +4988,14 @@ }, "data": [ { + "error_y": { + "array": [ + 0.004587677764544018 + ], + "type": "data" + }, "marker": { - "color": "#00CC96" + "color": "#DDCC77" }, "name": "Train", "showlegend": true, @@ -4943,13 +5005,19 @@ ], "xaxis": "x", "y": [ - 0.2656462787483515 + 0.26664213025700334 ], "yaxis": "y" }, { + "error_y": { + "array": [ + 0.21683973320460714 + ], + "type": "data" + }, "marker": { - "color": "#AB63FA" + "color": "#117733" }, "name": "Test", "showlegend": true, @@ -4959,7 +5027,7 @@ ], "xaxis": "x", "y": [ - 1.2133400644133157 + 1.2308133756846842 ], "yaxis": "y" } @@ -4981,8 +5049,8 @@ } ], "height": 420, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "showlegend": true, "template": { "data": { @@ -5809,14 +5877,24 @@ "domain": [ 0, 1 - ] + ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": false, + "showline": true }, "yaxis": { "anchor": "x", "domain": [ 0, 1 - ] + ], + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true } } } @@ -5842,7 +5920,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pe3.13", + "display_name": "pe3.13 (3.13.0)", "language": "python", "name": "python3" }, diff --git a/docs/models/quantreg/index.md b/docs/models/quantreg/index.md index 2e31d4d..38637a2 100644 --- a/docs/models/quantreg/index.md +++ b/docs/models/quantreg/index.md @@ -1,23 +1,21 @@ # Quantile Regression -The `QuantReg` model takes a direct approach to modeling specific quantiles of the target variable distribution. Unlike methods that model the mean and then derive quantiles from distributional assumptions, quantile regression addresses each conditional quantile explicitly, providing greater flexibility and robustness in heterogeneous data settings. +The `QuantReg` model directly models specific quantiles of the target variable distribution. Unlike methods that model the conditional mean and derive quantiles from distributional assumptions, quantile regression addresses each conditional quantile separately. ## Variable type support -QuantReg is designed specifically for numerical variables and does not support categorical variable imputation. If your imputation targets include categorical variables (string, or numerically-encoded categorical variables), consider using OLS or QRF models instead, which automatically handle both numerical and categorical targets through internal classification methods. +QuantReg is designed for numerical variables and does not support categorical imputation. If your targets include categorical variables, use OLS or QRF instead, which handle both numerical and categorical targets through internal classification methods. ## How it works -Quantile regression in Microimpute leverages the statsmodels' QuantReg implementation to create precise models of conditional quantiles. During the training phase, the approach fits separate regression models for each requested quantile level, creating a focused model for each part of the conditional distribution you wish to estimate. +The implementation uses statsmodels' `QuantReg`. During training, a separate regression model is fitted for each requested quantile level. -The mathematical foundation of the method lies in its objective function, which minimizes asymmetrically weighted absolute residuals rather than squared residuals as in ordinary least squares. This asymmetric weighting system penalizes under-predictions more heavily when estimating higher quantiles and over-predictions more heavily when estimating lower quantiles. This clever formulation allows the model to converge toward solutions that represent true conditional quantiles. +The objective function minimizes asymmetrically weighted absolute residuals rather than squared residuals (as in OLS). For higher quantiles, under-predictions are penalized more heavily; for lower quantiles, over-predictions are penalized more heavily. This asymmetry causes each model to converge toward the true conditional quantile. -When making predictions, the system applies the appropriate quantile-specific model for each requested quantile level. This direct approach means predictions at different quantiles come from distinct models optimized for those specific portions of the distribution, rather than from a single model with assumptions about the error distribution. +When predicting, the system applies the quantile-specific model for each requested level. Predictions at different quantiles come from distinct models, each optimized for that part of the distribution. ## Key features -Quantile regression offers several compelling advantages for imputation tasks. It allows direct modeling of conditional quantiles without making restrictive assumptions about the underlying distribution of the data. This distribution-free approach makes the method robust to outliers and applicable in a wide range of scenarios where normal distribution assumptions might be violated. +Quantile regression models conditional quantiles without assuming a particular error distribution, making it robust to outliers. It naturally captures heteroscedasticity, adapting to changing variance patterns across the feature space (unlike OLS, which assumes constant variance). -The method excels at capturing heteroscedasticity—situations where the variability of the target depends on the predictor values. While methods like OLS assume constant variance throughout the feature space, quantile regression naturally adapts to changing variance patterns, providing more accurate predictions in regions with different error characteristics. - -By fitting multiple quantile levels, the approach provides a comprehensive picture of the conditional distribution of the target variable. This detailed view enables more nuanced imputation where understanding the full range of possible values is important. For instance, it can reveal asymmetries in the conditional distribution that other methods might miss, offering valuable insights into the uncertainty structure of the imputed values. +By fitting multiple quantile levels, the method gives a picture of the full conditional distribution. This can reveal asymmetries that other methods would miss. However, QuantReg is limited to linear relationships between predictors and the target. diff --git a/docs/models/quantreg/quantreg-imputation.ipynb b/docs/models/quantreg/quantreg-imputation.ipynb index 79308a9..2a93247 100644 --- a/docs/models/quantreg/quantreg-imputation.ipynb +++ b/docs/models/quantreg/quantreg-imputation.ipynb @@ -74,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -3633,9 +3633,9 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.\n", - "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 5.7s remaining: 8.5s\n", - "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 5.7s remaining: 3.8s\n", - "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 5.8s finished\n" + "[Parallel(n_jobs=-1)]: Done 2 out of 5 | elapsed: 9.7s remaining: 14.5s\n", + "[Parallel(n_jobs=-1)]: Done 3 out of 5 | elapsed: 9.7s remaining: 6.5s\n", + "[Parallel(n_jobs=-1)]: Done 5 out of 5 | elapsed: 10.0s finished\n" ] }, { @@ -3679,8 +3679,32 @@ }, "data": [ { + "error_y": { + "array": [ + 0.00007068607962860608, + 0.00008566173778664199, + 0.00010354861421659208, + 0.00010446681832917282, + 0.00009958982144334462, + 0.00010899487172081684, + 0.00012524333466419057, + 0.0001401559350155429, + 0.0001419856727246125, + 0.00014148804255191002, + 0.00013964325829394816, + 0.0001352059984264296, + 0.0001266211747154425, + 0.00010806937892337481, + 0.0000955126673952158, + 0.00009572945677819657, + 0.00010825711304818197, + 0.00009924455051088341, + 0.00008058254845100971 + ], + "type": "data" + }, "marker": { - "color": "#00CC96" + "color": "#DDCC77" }, "name": "Train", "type": "bar", @@ -3728,8 +3752,32 @@ ] }, { + "error_y": { + "array": [ + 0.0002923819760799368, + 0.00036360537094371777, + 0.0004548700007812027, + 0.0004754851566973023, + 0.0004310373487827412, + 0.0004963764336370348, + 0.0004984041180187477, + 0.0005592567272666623, + 0.0006264645396437899, + 0.0006000923054654875, + 0.0006170472013545412, + 0.0005280976014239853, + 0.0004788123955147881, + 0.00041499916196403646, + 0.0003537849752500568, + 0.0003903169140390032, + 0.0004234486790403488, + 0.0003675153867336991, + 0.00032353724735584744 + ], + "type": "data" + }, "marker": { - "color": "#AB63FA" + "color": "#117733" }, "name": "Test", "type": "bar", @@ -3792,8 +3840,8 @@ "r": 50, "t": 80 }, - "paper_bgcolor": "#F0F0F0", - "plot_bgcolor": "#F0F0F0", + "paper_bgcolor": "#FAFAFA", + "plot_bgcolor": "#FAFAFA", "template": { "data": { "bar": [ @@ -4615,14 +4663,22 @@ }, "width": 750, "xaxis": { + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", "showgrid": false, + "showline": true, "title": { "text": "Quantile" }, "zeroline": false }, "yaxis": { - "showgrid": false, + "gridcolor": "#E5E5E5", + "gridwidth": 1, + "linecolor": "#CCCCCC", + "showgrid": true, + "showline": true, "title": { "text": "Average Quantile Loss" }, @@ -4639,7 +4695,7 @@ "# Plot the results\n", "if \"quantile_loss\" in quantreg_results:\n", " perf_results_viz = model_performance_results(\n", - " results=quantreg_results[\"quantile_loss\"][\"results\"],\n", + " results=quantreg_results,\n", " model_name=\"QuantReg\",\n", " method_name=\"Cross-validation quantile loss average\",\n", " )\n", @@ -4652,7 +4708,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pe3.13", + "display_name": "pe3.13 (3.13.0)", "language": "python", "name": "python3" }, diff --git a/docs/myst.yml b/docs/myst.yml index e7f484c..a078097 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -48,8 +48,6 @@ project: - title: Use cases children: - file: use_cases/index - children: - - file: use_cases/scf_to_cps/imputing-from-scf-to-cps site: options: logo: logo.png diff --git a/docs/use_cases/index.md b/docs/use_cases/index.md index b7ea6d4..32c7af9 100644 --- a/docs/use_cases/index.md +++ b/docs/use_cases/index.md @@ -1,14 +1,14 @@ -# Imputing full variables across surveys +# Imputing variables across surveys -This document explains what the workflow for imputing variables from one survey to another using Microimpute may look like. We'll use the example of imputing wealth data from the Survey of Consumer Finances (SCF) into the Current Population Survey (CPS). +This document walks through a typical workflow for imputing variables from one survey to another using microimpute, using wealth imputation from the Survey of Consumer Finances (SCF) into the Current Population Survey (CPS) as the running example. ## Identifying receiver and donor datasets -The first step is to identify your donor and receiver datasets. The Donor dataset is that containing the variable you want to impute (e.g., SCF contains wealth data). The Receiver dataset will receive the imputed variable (e.g., CPS which originally did not contain wealth data but will after our imputation is completed). It is important for these two datasets to have predictor variables in common for the imputation to be succcesful. For example, both the SCF and CPS surveys contain demographic and financial data that may help us understand how wealth values may be distributed. +Start by identifying your donor and receiver datasets. The donor dataset contains the variable you want to impute (here, the SCF contains wealth data). The receiver dataset will receive the imputed variable (here, the CPS, which lacks wealth data). Both datasets need predictor variables in common for the imputation to work. For example, both the SCF and CPS contain demographic and financial data that can help predict wealth. ```python import pandas as pd -from microimpute.models import OLSImputer, MatchingImputer, QRFImputer +from microimpute.models import OLS, Matching, QRF # Load donor dataset (SCF with wealth data) scf_data = pd.read_csv("scf_data.csv") @@ -19,97 +19,107 @@ cps_data = pd.read_csv("cps_data.csv") ## Cleaning and aligning variables -Before imputation, you need to ensure both datasets have compatible variables. Identify common variables present in both datasets -and standardize their variable formats, units, and categories so that Python can recognize they indeed represent the same the same data. Remember to also handle missing values in common variables. Lastly, identify the target variables in the donor dataset which will directly inform the values of the imputed variables in the receiver dataset. For details on data preprocessing options refer to the [Data preprocessing page](./preprocessing.md). +Before imputation, make sure both datasets have compatible variables. Identify common variables present in both datasets and standardize their formats, units, and categories so that Python can match them correctly. Handle missing values in common variables, and identify the target variables in the donor dataset that will inform the imputed values in the receiver. For details on preprocessing options, see the [Data preprocessing page](../imputation-benchmarking/preprocessing.md). ```python -# Identify common variables +# Identify common variables common_variables = ['age', 'income', 'education', 'marital_status', 'region'] # Ensure variable formats match (example: education coding) education_mapping = { - 1: "less_than_hs", - 2: "high_school", - 3: "some_college", - 4: "bachelor", + 1: "less_than_hs", + 2: "high_school", + 3: "some_college", + 4: "bachelor", 5: "graduate" } # Apply standardization to both datasets for dataset in [scf_data, cps_data]: dataset['education'] = dataset['education'].map(education_mapping) - + # Convert income to same units (thousands) if 'income' in dataset.columns: dataset['income'] = dataset['income'] / 1000 - + # Identify target variable in donor dataset target_variable = ['networth'] ``` ## Performing imputation -Microimpute offers several methods for imputation across surveys, which are described in the [Models Chapter](../models). The approach under the hood will differ based on the method chosen, although the workflow will remain constant. Let us see this for two different example methods. +Microimpute offers several methods for imputation across surveys, described in the [Models chapter](../models). The underlying approach differs by method, but the workflow stays the same. Here are two examples. ### Matching imputation -Matching finds similar observations in the donor dataset for each observation in the receiver dataset and imputes the values for those receiver observations based on the values of the target value in the donor dataset. To do so it should be fitted on the donor dataset and predict using the receiver dataset. This will ensure the correct mapping of variables from one survey to the other. +Matching finds similar observations in the donor dataset for each receiver observation and transfers the donor's target values. Fit on the donor dataset, then predict using the receiver dataset. ```python # Set up matching imputer -matching_imputer = MatchingImputer( - predictors=common_variables, - imputed_variables=target_variable -) +matching = Matching() # Train on donor dataset -matching_imputer.fit(scf_data) +fitted_matching = matching.fit( + X_train=scf_data, + predictors=common_variables, + imputed_variables=target_variable, +) # Impute target variable into receiver dataset -cps_data_with_wealth_matching = matching_imputer.predict(cps_data) +cps_with_wealth_matching = fitted_matching.predict(X_test=cps_data) ``` ### Regression imputation (OLS) -OLS imputation builds a linear regression model using the donor dataset and applies it to the receiver dataset, predicting what wealth values may be for a specific combination of predictor variable values. To do so, again we need to make sure that we first fit the model on the donor dataset, while calling predict on the receiver dataset. +OLS builds a linear regression model on the donor dataset and predicts wealth values for each combination of predictor values in the receiver. Again, fit on the donor and predict on the receiver. - ```python +```python # Set up OLS imputer -ols_imputer = OLSImputer( - explanatory_variables=common_variables, - target_variable=target_variable -) +ols = OLS() # Train on donor dataset -ols_imputer.fit(scf_data) +fitted_ols = ols.fit( + X_train=scf_data, + predictors=common_variables, + imputed_variables=target_variable, +) # Impute target variable into receiver dataset -cps_data_with_wealth_ols = ols_imputer.impute(cps_data) +cps_with_wealth_ols = fitted_ols.predict(X_test=cps_data) ``` ## Evaluating imputation quality -Evaluating imputation quality across surveys can be challenging since the true values aren't known in the receiver dataset. Comparing the distribution of the target variables in the donor dataset to the distribution of the variables we imputed in the receiver dataset may give us an understanding of the imputation quality for different sections of the distribution. We may want to pay particular attention to obtaining accurate prediction not only for mean or median values but also look at the performance at the distribution tails. This can be achieved computing the quantile loss supported by Microimpute. Additionally, if we have performed imputation accross multiple methods we may want to compare across them. Microimpute supports this through multiple easy-to-use metrics described in the [Metrics page](./metrics.md) file. +Evaluating imputation quality across surveys is challenging since the true values are unknown in the receiver dataset. Comparing the target variable's distribution in the donor to the imputed distribution in the receiver can reveal how well the imputation captures different parts of the distribution. Beyond mean or median accuracy, check performance at the tails using quantile loss. When comparing multiple methods, microimpute provides several metrics described in the [Metrics page](../imputation-benchmarking/metrics.md). ```python -# Ensure all imputations are in a dictionary mapping quantiles to dataframes containing imputed values -method_imputations = { - [0.1]: pd.DataFrame - [0.5]: pd.DataFrame - ... -} +from microimpute.comparisons import get_imputations +from microimpute.comparisons.metrics import compare_metrics + +# Generate imputations from multiple models using cross-validation +method_imputations = get_imputations( + model_classes=[QRF, OLS, Matching], + X_train=train_data, + X_test=test_data, + predictors=common_variables, + imputed_variables=target_variable, +) -# Compare original wealth distribution with imputed wealth across methods -loss_comparison_df = compare_quantile_loss(Y_test, method_imputations) +# Compare quantile loss across methods +loss_comparison_df = compare_metrics( + test_y=test_data[target_variable], + method_imputations=method_imputations, + imputed_variables=target_variable, +) ``` ## Incorporating the imputed variable -Once you've chosen the best imputation method, you may want to incorporate the imputed variable into your receiver dataset for future analysis. +Once you've chosen the best imputation method, incorporate the imputed variable into your receiver dataset for downstream analysis. ```python # Choose the best imputation method (e.g., QRF) -final_imputed_dataset = cps_data_with_wealth_qrf +final_imputed_dataset = cps_with_wealth_qrf # Save the augmented dataset final_imputed_dataset.to_csv("cps_with_imputed_wealth.csv", index=False) @@ -117,4 +127,8 @@ final_imputed_dataset.to_csv("cps_with_imputed_wealth.csv", index=False) ## Key considerations -Model selection plays a critical role in this workflow because different imputation methods have unique strengths. For example, a Quantile Regression Forest (QRF) often performs better when capturing complex relationships between variables, while a Matching approach may be more effective at preserving the original distributional properties of the data. Additionally, not all models can impute categorical data. For example, atching is able to match any value regardless of its data type, but QuantReg does not support categorical imputation. OLS and QRF will use logistic regression and random forest classification methods under the hood, respectively. Variable selection is equally important, since the common predictors across datasets should have strong power for explaining the target variable to ensure a reliable imputation. Because the ground truth is typically unknown in the receiver dataset, validation can involve simulation studies or comparing imputed values against known aggregate statistics. Finally, it is crucial to maintain documentation of the imputation process, from the choice of model to any adjustments made, so that the analysis remains transparent and reproducible for others. For the full pipeline details on SCF-to-CPS net worth imputation refer to the following [notebook](./scf_to_cps/imputing-from-scf-to-cps.md). +Model selection matters because different imputation methods have different strengths. QRF often performs better at capturing non-linear relationships, while Matching tends to preserve the original distributional properties of the data. Not all models handle categorical data: Matching can match any value regardless of type, but QuantReg does not support categorical imputation. OLS and QRF use logistic regression and random forest classification internally for categorical targets. + +Variable selection is equally important. The common predictors should have strong explanatory power for the target variable. Because the ground truth is unknown in the receiver dataset, validation can involve simulation studies or comparison against known aggregate statistics. + +For a complete worked example of the SCF-to-CPS net worth imputation pipeline, see the [autoimpute notebook](../autoimpute/autoimpute.ipynb). The [microimpute paper](https://github.com/PolicyEngine/microimpute/blob/main/paper/main.pdf) presents the full methodology and reports results from this imputation. diff --git a/docs/use_cases/scf_to_cps/autoimpute_best_model_imputations.png b/docs/use_cases/scf_to_cps/autoimpute_best_model_imputations.png deleted file mode 100644 index 477f98d28bcf3e3610341819efac55f8fe2f4748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56963 zcmeFZWmFyAwk?_vlAyue7w!@ycyM?3;4Z-yP7>T5f+x7UEIhcodvIR_cX-9O_h~2l z-uLdG_uBh)XvLyc6^%J-)R<$AK6)R7D9TG9Bj6*vc<};RN>Wt$#S0iH@U02=2Dri> zX`BW8caQS8YXE44E^%tNI*S5x4kCU82B8rNL4`Dp9609eT{ ze;uTX7;xfi#03u`8~<_rBfKKSi8T5J{C^)`Fi?LufMKY|MbSxL{`c|2VF&l`bJCa8 zq#xIyu<}_U6dz&!I@U&5|Kl7+{^OU9W%x8v45`0o^ra)+_&?5J)4se2Xu|jqLKXY> zbY2AT_Ws8?{D+q>5x~?A=yDW)O^+0~7Wp6N=ngP2m{9rO6e*H_PY<|8`0B6e!chE% zg{4_a|0Ts9^OwQC0N1$R{D-Z6!NVy+c)!M3fc~=9i)RBO{kQdiss4`v|7EuS?+u6o zGX8xqTdrAu@nR(Hj=+AUMPl2zU#Zy0Fdw>{KbpyEvaY;28bd60YUa4#dJnfTn${Fr ztMl%MOJ`^>7P<5nKF8UwlXKv629LVZ2t_iH-$zX-5RZp<%G3(}sAS*X_PsCRa6H=P z_eUgn^VwKza`2#@q^rBQeyr9MIf#GK;(9!8$L(^RBld}Kb#2sf>+O9(<>o;6JQ$ty z>kkQ1MZ_y3j;5cAP^8@>r5!=ar|lz8|93>_WFr383P*pSYfg#w-D##e(Y)4HIZ`pW zpN+&s8jKoXN?R^*FCRN4Fw0i(+8Yn;RfADKFX!Y=uMCP_Na_0e1S3%v zie_PZUTXN1;DB=Y*n0Jcwut@cDZSzzt>a-kJ!r1t0d-%EKCllPt2;Bw#J92RA(X2d_SVs7^x-W+dYr?^m}*_EQu?aNPCg%x&>ODPD-Ub<#f%X zreMS5HB*gX2}HqBf8F=h*w+wxTKfG%0SDEvPEh)tyk*nfOn9e;S9cwMZ{@=k2E_4* zbH(@C-{|Ijw)CFYHRYZHRTB?NN{G=7+s0WEv*vDtNG67$Jd!F+41rNxOv>5qFmK7C z>x&?TwBC^FBs4~8(Hwedro%C-f*MC zcMiK<+-e_eLqmSwP#vN(3AKdPlYn2>FmJbqoV^nr3-G=Qy zT$ zz?r{oi^Aswe5YNJ_Lp9$;MjGwZ|u|zpBMUwr;206FjUU+Z5ih?8*PkqY9Hsju}))$ z5F=V2-`lSI)F@xg601MqG3!zgM$j>W zX6KcEn@eYw;Mrm`pI0ZcmO}5D<~uvYQ^~U3kY@4Ug*-A=n$9X63SQ!L_`fT>sVcL44fFO17jwA?KC%HETDRKI=Xf!f7} z&+S~+sS|N~B-leO)M&FN;o4c9(&Z@JdswQG_jG;(c2zEgkvNf!hnZ8!SYWNzd5P&FTF zF+3uP(}x5ecVQyq?Nx)Go!c&wq-k)^)wgpFoA36t;sW0FnvuDTO;P*&K??d~cPbQ8 zKOWguH`WQ>0Jl62Q1zep?5`gse-#Ea-Q!;2b8DO_iJ3_1*L&?5+}>gHG-+u3WDxUL zM!ssl?F0$JfSMCaSF_h8d}7=$CY3}OmD&2MyeYDf(c0|leJ-x5)r7*N&Sr0m_WV5@1`oT> zvWw``a*K-`)*odPzwPbSNQ)7Vs;(19`%led^eE9JUSTZtRGa%O&PIwXf~chF=ryAJqq|sl zx-5);%N!QBvRlcbhhlO{xqM$&*5}@Fx}I){4vVdx7CIgZ1?|(k+;c(!jeu{#sqAeO zfwDD7Kaceyn+!99)2=@ogEY2PKY(v|-lcyiUw68h(x*ZrOG|Mj&c;X^$UR+O+c4*8 zh?Q#wNjIO>Z<)`QZhaC(B6;W3g z;fu}rLAN_-3)^40D7)*$fN~U7?#ZTII9hu0uk5KHbh7KLX2ki3ioGRFzANuU`K@NMZ4eY$^Mnt z+NO%_S?}9EI@8mGr?9B5C$>jZVRG-7(U@TNleW!~!CG0%SW5zB|DZW?F{&L9#S_Fq zPRwp=;%2P7rBOf5oa>n9U8g7e^ob>Ae>JmWF8RJ1V_@RN;DNZE4k2Uq-KEcH@UbZp zoXDDP)hA9q_e*8LCS`1e!^oVF4XrKa%L|ffMd~uVNeYo3cB#(?Q1S;|JOW1zo4M>b z^JGjj=_JA(=2gX)1{C&YNQXraMdM{?l~{_QjM4p(a~Dn>5FV2+ zR>7tu2-^d}sO^4+ospfl^NFk`UK#`bHitvgJb1CgV|P)Hg{|y8jV-H;JsC)7M}9rb z<5GdL;--g#uuX35B|OP-z`D5fs@HaT^Yl-S`t|!46-4mO8ZMt9JP&7iUWdj&60-rv zJ|)QJqQnOuOSjroP+Y+vfYp1MLzvQZCDa!G>y>5P@`)hRPrXdq)!c#ah&?wOjXvPe zAlY}K4tU+y?J*Vw_bgH|B${aB=(VGXYd8<7aLdXr9u`D}^kSTQW`o~_yMvV|wy5Wx z!pO5Fi^A_AQe6`?9pbpdB(vR^v>0oe`NJ$&*azE4V?`?$-4H4x!;W7wbnhs5^qYVi zh3HuJiY@+iPB#m->=uF(VMOG4C1V&u*z&t(p%Ca27~NZfd8`F77r}fsByn>$>^qBp zN{#uFb(90nT@SK_WoWbXrrY>_I-R8GciiT!-X$k9K^1@Hta{pb1RK7|_(R`aWLg~q zpipMWmq6N``j~WNixcv>Eb%&nMmt5Q<+$+g*xx_)P5t5uex}K=w+E(1zH(=X>82)TYXT_{( z^v{WsZJ21vlvdzb$?~ZrP|RLm4CuR0-3HPYEwiXxD%gptXW=5MUbLsIq%8@>3Ci>yX6uA%nhnsjGoVfPq)b<#nP6p1hFG*h>K}AB(hEujdKs8 zweY2CDVHc+ifxbkdGbsrENnZAz#V#BnX--y8Zb8SSJUtBK>BI8RD^+T;guV3Yj($1 z;bb0^!KCf5*?pBkV#|%Y2tP_-wdps^%f}N6T8ex3ivmpNU4CPFM5R3~UnNw=lG2BW zOGnfmV@a9Dz&GXSL>x{JO*ONguu-{)lMKCXyfN2NKV#?(ZYTw{nsV5kb&%bf|MQmZ z(!wbZO{RNe{e1CoS97;lO9i~`&;FIKbHd0oE{RR?`&@Qla&!J}b-Q_!yMH-01*=uZ z(fWsyG0&snTgn?2n^U$3@ux-$xGeF=;0WG#8;1ebR8M`%wG1!sD3;7455G9m`aX`7 zgLo(f&u@?3LcFhH@{0SEoyuKniN-^z#7zIU8<<7y7tk_@qkX0mylpGTJLrCg_7)za zYhwDPNJSq%2w^x34p!?SS`F3MsMgVgWSEz0;0&i+sZn2{$^Y(fJUyDKyB^*jlN@HH zT!eqvPrzpzec>WKD@GKJL_B88O-e2nle%A{UIRivPu^qoC3qIdl0I2n_0Z_FC56(U zsjz*H5s(t}-oOxn=$v9Td80!UeQHb$xiyhTK&^~X`W#-yGLSF_LP6^Y`5(EGDba^c zET^km_ABsUsY+J$#G#`q$|Xj3+|&@{CvIWL;vK(nu)b7Nl~>TW@Q{1%No$0(T2T1r zosfE7306pvjI*9-^_IDmazc0umt%SDal&0xMwVmTqs4Ls%)TmTWToSt!J7%o!DIE}ikrXIyUyTy?3t>V63yWz-y0WcWOc|j| z9*DE-q~GMTcF8?Brq8L2jdM#bfxHIWdtp|r;Z2L2?^T3CGp|@T^%@idad0GT4!zPm zBh_Xqxy2cAyX<3Tyr zs98_BB!($7kQ}qYbhWr{(Z8~Cj3;uQa;(65crFDQe4iy2Vsf@gG*7{tI#im@$h>hh zoC?m%{=`VlZ{$a|WGYsmT-Z$IQ|I55`zwhcP(iCq;_JZ9`9V^7V-c;T-Dz^H8kbf} z+;lEM{jo3g($Rxm%#To5Y;1R^Kdhh$Iw=OP)YB>RtG!nNo}}vJ>=Ce%znGpEG9|Ny zd{TuMZJ148@vNPHs4LoWPgISKWCD%HX7E}xlNx%eCH3~E7yS|?Nwr%kbfK$}`$29T zB*hgSoM76utiNVAM^X6NQQ2QKQ=6mUOQTw=*eLM2PS6SFYiI~&hr%|U!!$Fv>fS3; z$yjKQ)Lr$eEmTQBWcbk-+^h57Z*^-EB#38}m9X>$DrYaXJmIRPqSVl@L*q0PFg!&G zlM$t@>#oHiqqm%N<^E`RzTZ)^#9gA`&H~ zh(J<@XZa4U+}9JPb*Ro-t8G6EGjm2PyvQVzF>A8~hF$>M#3sXo*HMq&lqK(yLdP=j zHlEak zY$|5AO?Hlv9NKzg$9hZo7TFn(Z?a~!w+)GA>1YDBL==VswGaM7twU1wWFFJp7glc_ zQt%8r)s)J%{jb>Cwq#B!d`sl*RL!G{Ffv$%Y>T?Ash;_b#D<(IJQYsUTMbCqaus~Z zr|C$1?)UO(6^R>6N-o@wj(eNLR6-1(QnA^Sl#Xh{l^1$OVAU=?8xBtX0hESHtYTM*6r-;W*3DDis$|W{bZUKG3qp^X zP6+xyKPiZFYfhZ@^0te2&F)aCBCTXDH1IB-&KRzY_bT)EY=B>j4QI&|q`d6U9Q{%* zH8BlEbYBco2&>{gNp_H3EPDNne z(%szU;RY!u>Xkl__QTVHRyN-I9{dA zOQzYCqTX9hD%HY<4>Ton5RE8;cq19epe5ycu??O|QPfsjKJ!Y>6|N`y<~bF2w^UcI zO&K;Tjim|jw2tM6YBA*SrWiSC-^nv0e25N`sf>FpIjZ2bsH||xmd1wXl!pSE7$Xx8 zO_3JP_%}$_m@HMR97%gW47e%8uz$5vOd|A|FDCEqV@*16B;2eexMH#IR_8Zg_Htn+ z1wl{w;05}?7k-d=icI zOgrmu!nW=^zjW}k$e=BV!%%!;{`!%5X-i^Kd%nRdCqscj&;~srq1iUOFV^?q%@z>0 z`jdg8Tf^h8{^VI@6P4o4-cZsc67u8FWX}EW(PaO?H1CZ26pg5kiY0<`Gv&ry#LesG^fhhVgUP}UnK8G)WzFtPV_p&tYKYq*zfnf0r122g zPDw86Z31#uPb;<#VQFRkj%Uvt&0@A3_@m^2=GQd5X7B3Cl9BL~)`>yD5jrbm z>GGKu3gTR|0jynR-TYDN(XLA7 zYhdV>uRJQFc?`%5V@?W@wG5+2d-4@Br|f$gRuZrJuOI%bO@cF( zG8gJy^{8G|rI=a^Q(pB^Ics5s5Oc&PjkcJ2wys$mc=j-RSGYvU(hv)}m(dGvAAe)n zmsv>qlQ2v8+8l+FzYy6?Rgm+9sd_jl1lsCld)gpRtcL z`Au@?&iq`t|B&)A8Vy?a5pQs9dncd3Wvlz+X>4Z5D;;v39((4GMr6-~nFi%2bSQTI zD1;8>5-|7|SQvt@q|8eZ!&X)EMTQsXw*&Se75&LavGugv_1U-VSDcPGb7|t9&z1OJ zXaG${B$QzLOxb<>g$8%pp{FRda(*tBDt9w^%GJ-ytoMPpD2dtP!Zzw<(09g|XMW5H zwL&)G^Sfe8%I8T!-n~phg$D9c;#@7?UBMAhg^Qf!>zQ9yhF;_fssbGSr=sfq9K3B0*2F@I67qiXN-T3RE-9V#2GcN|KGGL>B}SvfM$)g zGtd8fq_hZNq-yu@%fGo&2nFzX!tD;fy`EB6lLN9iK%|KT=iK$G8#Dy{z| zbQ}Va#EzO~RsBq%>mf>K^vFlI54Am-O5ddEpc(`ZYX*$;b)L5dfSy2X|J?>WE|e7I zS`8xTdxw^;{$NP%=BU>6f3Iy ze|BkOAJSeh>$eDnr06N;%KAWN%fIxYbryf}zJv0k_e7O;c$*w!OJ?#EhWs$C@qwN) z(%s_7?h=#6XY%_76exi_78Ai84>yCeJTY^XUNxDAtp1+ObK~RYo4Q?57_S%!RFUF4 zmfO595J?Bkl_7TlpyPj10>JzK?SpAT5E5>8;^n}hU-tC9K1nd|t^27C1sw2Y^3H`T zK0SqH5kN#CQAe`_VGi}8TCG9~=N3B8ba{YheWitFcD(qCL7RKf{_tJ4ao9dhq9DD1 z*LART#NDSAh+QxtEli+-eyFWyB$;KFo5dugYK3{+Gugy#WWRjeSBqA&@scazwl@Sz zj)WhggOT>Z3Ep=V5(eP1_1!&0$s{)TTd-Y$3%&9Emtm3fM}mwXzBaHN>PL-i&H;Uv)2W7Ege>SnrWL=m!5x9PNy^R2jnLHUiUR) zyw9t?=L}|y^Wk9{_8{|Z)!l{0#6oW!@4jU2TKKI(L1yFSnOC>=hOul~!t5nV=mBSD zGi_Sc2FmUw7t1&n9x&sntrla2 zH^*y=rdcUx@jipcaL`l#mCeARKL?9VadT8??5%R19T;o%C`DB$ltM7sqUM+jFL{DO zLZn_<9sY)5$$r(-f5N5F@Hpip7@HCuFn!>kwT@jUSCS8}qgvyX%G~Ubj#eHO5)*Kf~FbsG=%+bb71zcJxH> z;+g#u2waU4E6yMo=iCm8aP0^vTZRxq9P9^EQaQ*1L zT&!$3P&TQ8NsnNJX<>J^J<*T1tyb#3N2#R(-(MwNrhtk3781gK0+NgmfR4nBX{De< zz~|m%+9%mY>r#!1SA4$V7kaS z7FzE$6*RIO{_kJX#DynH=BLx8T0jj$im=n~uTOk|3TQ>9>^N{a=&^(X(A{kiz#*c~ zSR~u5hrOSr(OyPHFQl*TP=GjyOK!aFNWcxh8rxpE^24V?7|{^SmxHs%J&zX{l@8Oc zOO0o!-aJzxJw|e@?!j-BDHU?AIQH0;#k?+M3uQYVy5?nY*$gXbx5PkQZ4@%WJsdK{ z4sFgyR6Qsb*;koO=P3AK!d%z1HZLN8#P7_Q-nd8+Z5QLS*J2YEyC0mjXD@2=eV|~_ zs>Yxm(d{~9)vGC6I@lH%qgdLqSJr^F9AS70i%vxZYoRH|@YNO9o!p$^3{M*H6;j(R zdse5gMbIG@ls<4ReVD8&3CiRZM602RNiOW*D2^h~@dJMY&Lg>LBN z`GR%V0IKrORRnKdUrPW54AIF@Hio+b z9}CXatSXD@ygP%h))0w&nV^Ou71nTn#TeWIu*yPP6R(}wKp1gWrid2OahOuvbQ*2c z@;0f3#b}AH^XO2Zs02X6UBsZ_*e@6ufB0NbJedVKFMb##8=$_=@|Ni1`CMWunnvT6Y+!lBd;Ak!!w_u9OrS9D9en$-C zB4cSTnf`a_o>7WL@?78Zm1Q&PvBNZuMg8z8$E$o^FaM_5V?XsG&su8SffWr!eV4A& zNM?3U6P@rP1UAgOXZ+h*M}X2-K^INWT6*=Nf)tO9I0r5pwo_=XAbJD1T!YvSE6idb z$mTL$>Pt>^Uzag-j!81*L#v%^Lc&WChzyh4j51?|-O8tBQESYz;5(9?vMjsBpL38; z1>zT6M<4v#F|dtii&%M-DyH88q)Zyrc+h9CRXcLdulGr~_fdr-!1VFjE?Vm2&myAp zK81dlC_ovO(cWr$r8F#sLd25;Rf#4S&PTc!Q^k{6v%8VCezxe{{c<}##c!);G(5a< zSndk|@VlT4t}7nD=VbxeeotUtlP@2G`>KhZEw@d#!BvNgdLU4e7PK#Zu_DQlyQ!u%SS%GbRFMwNnd+0`0x^hH$iz4kaMMys zBqx4=7*^$VutPs6EAXH#n#RV^TU$j$D(H~zKzt|IQE5+wbF7AMQyq^MFEfGxp&AI# zJAP+}q}vG}@f$_Tqvl8=3=YMlv*R<;(p8<3irso`FJUpHOsP;Kf^_e~Q^Jl0#of8d z#N_w!c%2gV2(L^JT!pe0l}!Y{*z_cLJp@H%&L8^SRK#9x`pgr2!c1nD;u&R@@~yIL zo2or5c5hlA)ZNm~mXYC_DpnU}4v9{Z>+ZojkBwz_UPmuku2SF*>m!-TF3c0vx}3CF zyid-)g`|3!HP;la?%t%(kqgwTf8T)qV5Z=df%*FV1;8q~zLP_A{wG~P2hxQJm-#~) zdpTqr&LJ=}2HO~}%O)kyPhp=YGc_GJu^K49GybH6^EroU$cr$C_(^GosO)&;$cE}% zjx8yIm}QRYw;=aeSOEc<5rU+&dlobMGr+Yrr&BXqLC7JFIcmIvz~Vr2h*7)JuDzVyf%)qT;R<1i(6a-Aj#200p)SG9URU{z3gX`_r zzkY%vVG3V9>eo6dH)!)~PLmo@t!HpN{Mr0+`rcH+mFtm2^?qYXt=aA3&5dKu)v2@l ztAmsGI7)@8txvy-eqBgPRQ+&3(QVD+p!h=$#DFKb0WWbyvS$FQz!T>1bbCS1$92>_ zM49@m&C5MeY1aHM*vcE3!4s9yX`Tv~K=Ykw_#m+pSU=BzkkzdNWV7&DaB)$gK2yKo6O0?L3KSd&=S7ZVX_E6%b zHi_roB--zkU>#A|$wO)o>AZR|iV9T;^w{N)@}$)&MszL3f1b*30KDU_6gSlC0=dbX zdIYg(eidnk^QFky^40ZUCvBv(w6C4aMT54dS)DtK?%hvFFb6Zmo`}e`H|#Bf zaoEKuof}O-E)E*N_b(Zjuq2G3L(eItC;#wx!>g`vppCU6_zW{33EU}hT$z+C~ zGYzgAOn{ay1jAQXIIpIEEMLT1G#vFEGJoL4{snI%T`WMXhaWC?Oy&Ix$znR1%4HuG zaUDlRG8S1ck_dQ-=Jt5A*z0nMMq<7s&u8j{zRGu=*i!$=vailqb`-1!6h(gh#PBr) zn8)4ON&#^>okDuL)1gMSFaYgdxVp{}(`#>vlH3${~M z9B>iViR$Ax?>#V!DG1zAp$)F(US-1;%}&+Xo}juy69O z@_u}R%F^gjdin`cOzGP=~a**3}$s^=;ln86+UHn))*gU(gzZBxF4-f}TOOq;SF^Sl8HCZe@fub+j`Nci=rz4fvZyJJ7^ zFG8{$u5biaWMSl=`3Kr%@$4sZASk?pIY#Qx^LHCHtgbM>a4W_Xg(!Tl#y1Vy?f?LP zh4(S5v%LyIEj`ZkE$9s;qZnu%d0G0W?FJnj7Mp)k9Yes~Di`#V^J=2D`Q^m$+{qoh z%F1<>OVgj;n_}FV>|}&K0EB+(_)({Q)pK-510<|<%p|$v9y%R*SsldQR6jKVxS*OG z`H;Ua`qQI9cwr{In*fbg_(P4ABHFxklQkxfb)Y@>#?hUe`pL7>I0yS^2@K=Z>pJZz z;QROusD>Gx!ULHEpC#_XJF+e54W;sXuIs-Gcvg8F)m+J0(2|6%%hvA{<0^2Tc?xMxHujun`{2QpR$rQ=l zyy5?Ba>fpjfVaHpprw2!&8Yn?M3DMDe6n&^IU}k?`;ff z*t0Ws(Ez0(@lt6qjtdFcO3}nzSslpBs0_XVlMmfS~aKUDe+DWyiYZqHtA1O>brl&dApK3m|r#+O`z0G>~?+JtxpS#3o6X*QX*(IVJR)rLcSudl}` z+{7SH-VbF6GS(dr_WftT`)uQbuTuj-Bj@`Swx?p+!|q{Ren zrG(ixNAogG*6gc&{RZ_eZSpB*QF~b(%S%j_lPM1Me1<`Q6B$t0B*N-GwIz4}Io3{+Z)S5l*6$J?E(V=@`uk z*wUScvACEY(V(#?ZI)|_-XqOeIxbFy!A|5{zKc~#!36a9+vQ6|F}5N=piGRj;c1vv zRKYG;dV`h^r1#`N!j12p)a=?nm_+D1e?Q-<<+9Xpg(}ArAv}Js1sEo_NTvQr(MFd= zHG93o@{fP_T&-33w%eeI#eT&l@Yi{ay2FcT=@Ywo*O(-1rKeU}^xYw93|YlwRa$E5 zywD|2f93zG5N_S!*vtJV3{AT|W7BpeiE^vVE{;wDVI+&fuV*<8;=4UPlHgXud7Kw~XS)~zU#k6GVw+p}~XO(=+kQ9R^ z_fd*iMitY@r_V~GD85&Z*?H;Vd$Y<4J~0X3UK(S6dZ>GK>otGv0pPM>wWQ#tv@Q^V z;+ANVkRCp{XPzpmr&x0kGKTbGoO2rA{KP)R54}t&kHD51wdRlNSgVQLPzm{r-nr!B z=FJTmpSF0Q4R7y_qWef^@8}q0Lo%IE(o-R$MYOD>kk#iS0rRV_*nsA#0`2NY0DNtg zhdu3@NXnnafM`GTnCZ?ddLEvO@fVs;{C3q};CI~TOK~AC1?ecKhTl7JbLWYi*%$Ix zvDWrh%s1j`s1wm8jg+UVm~Ir#QO4n)v6D&>6|LHRpD9(z#bwKp&+{ap$X}-EwssB7 zIqk!HdZd+2I6>iGk%1X`-hj9t#EYK@o|o!6lmQKV29=R_|MRI`wqaD@C)!tP7!E)s z<>CM7BR2WzVwsfMa+)Qh6=RH#)TWn(z_bK-ULzY&06)PQFo#HIKo2;9HZ zx+$UxXexK8WP_&x&fmeJJMaVd%XXYD=Z*ms^)NEB$os$Xbu8=8ozjmKzhgV}Az_Gqjgx^&)}1nzo2)aAEPm$K>u6&?+_VP z3kAH18Ca8@*0}EsT-I=w_j?NoK?Vn1OcFrC{uSzzL7QSC z%=$i_pJPho?`OB7oHWSxd2{_UdN< zC#W)|qX4aa;>{me&$UinXP$F`CwZH6LyuQ`lRM1gmcQ5u1)Y={I0}@|84omAmM6he ze1{9Z2!@^h-*mb`dDh!RbB%X2JwuuyN#!eaS8t|evb?LUu0zY8Gdb*%1-l}qM>;)< zpnmff@uBtxnOQV`D+*^zHH?5W6Gu1#33ll1}*J=5(+VgJFxiUOiI;=Me+S8SGQQ_rI~E=XfbIlJ~miTa?kpYw^LGbNDSE> zk@)-DK*BO>&<68N)Xr|0Ot*ip!9z~}_h#nBJt3s-xJfAuz)N8uy-!fMYmMW;XTnGY zYR%-%yNVvx08eo7bXQYep4DV{w+0C563b8-4B8NNT#34;4382_0VbKHD2lhrTzae9 zr|?Xr`TM{Xz-rT|)bnD??nVN*))?5&;_1>}0X^TH074&g|Lsh;$fnn8z4LVvmDv@^ zjlDQjaO5FEoxjI;Fm??f=wjQh?+a3CmwYiT1%hB?*J z5R9b*v^EIO-?miv9=WM>x%GABUUM4~#?!`5ZrAc8gz?lm2s)nfH6kZ}T~&{KV0vvf z6Dv38{hK{ecJCtnM}mBq1Ic1}0?wKpyojhtAbY>6h4d!Gth=Kxm7ho)pcLZ1(3v9q z(2JwXTij+^g&CFeyjZovLbQ(88t{`C9rGRHI~2U7R?e3UHxcZWfK(W=ueXjl@d|j~ zme^~ycpswy;K4u6yqr|I%fUiFpAe9P<=6%@&a>rp#d7ef`6n@F5ZK~thyxoei(MWy zP#D3%c=KRSUcL0*cI{325avJ}{M)F9LNxnq$r|s2vTP4Vg#b={f6t#qN32y*ypH$u zJxQgD0fWA)!mE)N4t*I%3DYsTazDTbrs!w;k3gWyzXId>T~QRtt2)j*TxGvCDU;!WC%%~%PE$KGsc>uX2GaT4EQd% zU)z^ctZJHUk3-y^*0Mtv5jE_7%>Ln~>l1@0{7cQCs>JBNETND-yL-_vIIC7e{NRG$ z5eQ#8+UoR#=HWRdk_B5?8v(GVS-K}n&yaJ;_Zrrv82f5swv&3~r*|7IO)T?!BeAH^ zcf(KAOA(=g4xCYtK|1llH&}A(x>Q2cj}ZSoavr+lHU88+fAN7lqM!<(h_EV$KZJ}H zC}!>4u`Sl=T-(_!S>yZ1U+h_zAny>`;L?$tUM&|_>XW@gZd#S8*yPBX8L0XLG7{|h z!{Jo~=~oh75$a6uk-)YvU z^U^N`ad|MC*r+!gA>_|Yi7G6X^kyaP5@je;j4dtDI@-D0%Gff6RjHe2ArDczo*@b0 z%$LuYqxiymnOU?)9veyi#29nFztt+%XU?!vfKjZDOb61j1P>9+B5S?B&zdz+1{%NP zkNulY{zQ=ouANll6zmBozOJ03s_WaH;EbTNuI(-c?@|C&6snb~m4As5kfc&$XxwMj zYvZGoO5m^NWw?xo%kLD+wc(eicugO9(!ab8Tg*o`dm<3(t z(Anrraqzv}Cf8=<-aCp8#U^9Vo4FJyCHt|!%C!mgqsHa=T$zU)5**KWSb>Vpnh8{jt8x^6 zcC`3hpwl_z+AMum6sz7c>C`re%4q#T%Ln>GNn{S4E6cN*@oy^mZL{L8d2~(d!@%c# zi4LlI>uQ4!%5BpSIZ7?Eq zA_F|jkhv4i{Hf7>=jFi6!B6TO2E99ix+CtufH)6L{;IJR)nqf50V~yIR466l&Y1VB z#EurVsLy>dv=`t)?m!lO?(ED^FIteeNC3i3x&uz?v$~>(WAOLjY>H{cl z(quKQ)ESI;Tzbkg!$@360`8(f!#mL*e*<|xv748W49s)-{Pv~~&;KrB@d}Mjm8L6< zh{%!Y`oH+nJaPO$!l3yaSG=wWEWPaJXQmWG8b%w!tl5BkPzRmGP~SYq4r!IqZ%QjZ z-WEW8{Yb)Cop95a$6mlKFiJ!y@m@ux})sW35maj$t6{@w_?oJm<3Hh*?;YOfB z(gmox6tl&AaTC$kz%kw3$!IXeY%(Ma=e}Q1%yK$)5N% z1l|7p=IO^}_le2#a&ZKA0{ZQ-k~53LXNLVz4%unU0j0u>cIg!oB?0JV{xdfEzqtF# zu&BH4T|rbrKpF#(7Aa|Iq*J6(8dSQ4p+V^e=@uzP1d$pT8U_?31SE$p5g3}GIeQd* zp7%ZHT>o$9!};Q+Uh|8+_gZVO`(F26Ki=ZE*)P$YgMa$e)n@O*iCK@)Fh^Nf`Y_$n zE!l(cbQ3X4olj+^M97O7e+`|$*JgN&lq$IBvnmBtxnPWOM^BCHAC-?3E_>uqu*a7?s9obgmF6aqpGU>NhTg=JCp2Hn(ncx zD#dt1b%k%v^WL9zkg@cP^UAK)GEUz(4eBgAx=`;$m;A9UzJ3+xcCD(F%VZ(JQ`nEC zV{X>87{)sse0cA;t6|gaN_<@Vp3_Ex>tIH8V3tqw|qG%SAK6D&2z+XrprKu z-yPZvCSftyDllQgH_dnEGah^p3iRyVWcHN8+yy_Y3MO8TX%qlg65PN+bH<&|{dqyE zcYD>)H43W;2m}`!Z(|$+MsuvELx+zA;T;&Bpm5f=%WoN7AQjCjYxhA<0>pJ<0@M|6 zf3o41N9QYj$Y+c4enjZTSnJHd(|j?@U4(%#HGUqstpW%bd00}0vl?bgr4c;Ce61XX zR(HN}nw)rLODc;ncwzi$%m-a8WVR8Tl%7WN&=20mP(tHg5{7Hrph$N`H0!h6DHYm< zOAG$1;K>2D>v0*X9y{RxV7^kH(Bu2}(7I*7h+yw#M{I-9bA_$FNQ&HKQoT*t9E@is zK;|ykzdW?I9Vpl2f2HhD>{R<-)x+T0(__lE7Qp~lA$7#Klb;Q z%IX`x4&oKfJyUAtx0(w%2paHX+kDHY#~HPWd?GP=Eyh+2dWAuyQU>#-KN`@jU;K!D z<9AV9&O8+Adwf8a2~vxN*DBD{_4j>yEQV~~XeOyZ#v}(ofJy*34;!`M(m9=!D?Z&d zh60@$i1>jz0_f-p?@T*$`Uq+ggqj-u%3vF0MvllC z@h>ql>9rw^LemWm_2wjj|u8g3TNUXmSTbL#01^x(~od*$?kQ_Q}6d zjgbKoMiTh=I)F?TlSMbq8A!L1g*%Cyc#^>c&$wr2+f@yfZ-|(bhS^8wYtCmbob;wO5n*3Wi-1|5J;`$*O94pY$qQ)NRg*x?qW$;x6rJHqs_?Y-@X#l zgDwWdi|AAjCJPn$%Z9Uu(;|Q>Wsm%;_c|7kb~P1inUz}2QtLOk7zMtE$VlfZW0Jeu zwF6RLt<2P9t}By(KA+8B`tyf)7C%>&!sOIzv}~*w)Dd^dW&M9K?ljPdcm$o8Ets5s z7pMKc^lwN6%P-_DetZKoooJ5133u3BA(IZHBm)hA3EXOZp)N6~^{rsGnTFfVE z6YiX>RYC%z}xo2Z#%-nSw%(VU07O5wB)Ib#tb7M)9|Z$<~CesDW7RW#SI&Pf?1J z3F$OLl22y)7Rn&qN70DF{krk%=C`)@l}L;FsPz&fBmjG3JIGhU97iA8c3SCl)f665 zh~i!4#dRqpl{(SCZez%rE>Pw#>)FT$;u?sr#5h>w=(q+aDW|{lJFZdK;-G|+vfK|_ zuhII`KYaZ~>O|<;B)`Bq zWfY)tAGDr=KX0EV{&Ygqyr4l2@2`8rXmK%U!?UqmOrKn7EQ+oSV^24~RSPDfM0|Yz z@Gjtiu)mV6_4VO{bBz)u)6SYP;SLnBN7J)%kuQ{Z_0_!q5D#=tD*5n6^kA7c0H5SZ zmiOWbJrHmPOXHYYqib$5pcn|MnueINtb7OBwY3^$xxmL&AY1H?XyfnV?XEvwW69l253^p#)L3_L}71awmdiK`L&^)#Y}|4an{bU`K}LjK@nB1 zi3TBUtv(DV&NDW?{G(>!_pM2UHLOu`98;j`oDN~Dk zzDz}4QsE{;f&+`vX|f3wqo7Fkg7_W~YTLUT9WU}f=R71!gHR9t@PEi&NDqVn zqig(iOm83T5Qki+zq`Ob`AQE$Q~0L1_fwMWj;H59;M@n*lm-G7>m)wMm@7Ve>qLxJ zE=>S%xiB_rmli?(g;&P8T^H`6``!VVU*`VNrA3k8#wx}TTcBrS=~E?!Yr5#&iCnce z>J7U0E>?eG+mHn=yS{8*iZg%S@6UD^#4{99M`ved{z_Gd}$YA zniCcBEVP5-zmW;c88UfW38dw+&I^%rOH@E${)03Fz!KWchM|0R#GCj0iA0c6nYaDi z@AnuVOWqQ5d?+ybTp>#`(DV2g<0D=pa$6rzJ{$J@8G&n_6&A8s*maOCyDu3d4{KT( zUcws3-udM_88 zyzYdEj8kHuvrU&bjcVa;9~ai7do^S?QgV~8D?DWWUm!#xg-#Ikg#aonsVL?5d>;0O z5&B07JO}T;B+*IoX}*h@#6ivQ34egv>6cwa9{@Q@7&QTrHl%0Xpo|Onk%lq>>caeDh1A!|x?Vz|?VmGk z-gfC0u~c$gf4O(M0LNPdb%{5c(<}TX*W<9S;O}3sOl%gFxc8Ze7+Vv)?Ij3XM8pAS zgT!1!?*K#3%nIg0RBs{3Q~H^7xY%xrJj=-ihb0hszA=D7jEw4h&rv7$?LoTkcfKp* zCC%PV9k#kvF5+Axs&v*%l{7h5@kjj@K}+ zn?ODy$&3rMyN_PlQ#*qG5)B!6r@Jtf8lckoamS-ZQ{j`(7=|dH+-Tx0@0>4KKYzZ* zOFiXG(|xv8^eL|214!qK-g6sVR*|cTS5Us`7|EM9o;h1vt0Gt^Br_t7Eg1(6_2+x?b0-IJob&t>i(Fd&r3x-AuH zxl|KkoxkT95Ul}~JaOx0b(Q{MtL38N z%Xi4tiDu#!i+{vff9nL2aU$-g*lDOxDxl)3SdMTPWS8ZyKonO7s!{>3x<(bIfXV~9jbi`uEARt3 zE<|TX~kOF1_K)_l~U-ZVX=and;;(Q$N)t{gpR-UV8cmB zLA`0p=w2G{8&;dHX!!iu>b!jAXo7iXc-)FNPNMG$UIa=VdPTORmx*|t229TB#_TwQ z@$X}QvrUf!4nckXp4oS%y!C}uVNG_u3&%qIy}py635pamd((uJIq0yeTQ^bZ_>A|1 z1_3C@wjBqn*7XY4neo56Lb!1IEymai`dpaj((~4El8gJ!`Er>yOWPQ;&)rS8x?8|$ z=lI>~Xa2Z%j6|ZBrqTHuCsx8Nu*GHNPRGw0Nos%qj{pBquC6ML)U4D#sjnh-z( z`~+zq6TV&WN{V{wNxjF`8YQ1?;K?Cqqsaxz5U&}+C_YgU&V2+>$LY#<5#sfWU})kJ zv+NAU0QA88gMxUlQ6GlZ-Z;&Q>5AKb!j%raChoRP`qk&5A9#s3(p?jYIfK!?Q1H9dpN4y~hs@@_8%55OQCIWqFZN|MxTbMcFsvBmYy~qpgK$u9G zLj^%c5l||j`y7G-d87(nFdb02-~C2NeMkbz9Iao(kbv$=a7B(r!rl$P6G&89^)F}f zZR@LOc+U>f#!ao(3Hw~k9s`iDwo{Y`U}1&5Jg(A% zH(NZa%RQ+Y7Btzl0y4LbkTpN`eh$hcbbLh zwS1J<$eOmZJy1p?4$BM4Pf`K4v9B6A*TYzp#7p@>GH(u@UgS0AK{ zhIQ`2bK=a6pIsWJ!Rfwa!OtWN<9Q%qeP>WjX{E#Q3TP~i7iJ>S6@yU`P#Jovkc25% zmb=?`#XU-d^Wis(cSdy#xN{v-^EJ6GA>(+WRrF4+*p%Z#5l12T8ks(ps$No}IVpioA)#J5Q5id%4qb7{`R? z9v0XS;6bZb)b6V?ZEwCS`2LJ2@y|)G)6O-1dpV%S{Z21)wZNC$QLtw1v=lP2p{D71 z)3=XbbcB~!-LIDf^Kv|$yhIEgxwK626q)-fnde%a(KQ?0^}DX6Q(CcaLyRdbF(e6b zSOQ4l_$D|xner9VlewQ^t*5UTa!?*h&$X6nqN0>IE-$mt$$r6d@HB_0@g*IGm_<1M_})}{qabt(Z#u-#dtlo zyLzsTIX1&t`ruT~E^Eltr)IAzsuu{-_ZLgpuaiO|k*egNdx9~TZpdNjLV|wQ1-L;DWfdb5p5OvS9;@_`wP51AJ*%`- z3?4kSQy_7UCY}D8l$gDzE11Y$LxB=IW+JYUn;xz19}_VMIkeR=Vo*^fO3Nyl4q%~@ z`~<(_ycM3ZMWY*_U|BG=qEMi?D6)MdOgUV2g+t69vpdDJgty)BX|d%*YkZPkNh(Vn z+g)j4=F@k)4Tjhs-H3LheO(p%?dshQx%O{yjUFGARejz0^={QvdZOi`?&-32ZiW!n z&=G9DGv9R1dqIn^bL|3e(vK8qxNC^u_LZ_NE*l4N%Y&W>9#!j&*VfBK5VhUxmi@iw zt82t=E+T7ck<9F4r#1N#Y2MXNHH%`Hbrl6+YPQrd3@`SAO5y$U7?$DxouM|?}X3_JwYzuokOd>6IN4=I09_$|S?`}JZBo@18N0k&l^#M-d|nR#j~ZPkaP z;heg>J%|S}cKaounc(LO401C%D!E zCT?SSE(p%voBdY0S>N3{UVAN8+o@wkI8SIdLdWNlg%YBxhot`{(rbmUNUvTZhq|!G zlm&SZfoCm)S$XXZbWAdO@wEgX6(Nxx0X!iv%ITerjRz>Z>1)-alX~^IMm|*!ZZwf= z2s}5~!fwk-4eK;ll~UG(@~+k7SCX4#H>qoUjzso&mJiHMWU zu(n#xU16or-?%pDTYs&-{;~+FLvC*+EsKp9vO)LmOAP%&Z<_tgye8MsiNk~%3;fxG zX)dMDFra9)Y6ifa9Y$;tdNkM9tpHifU%T)e$?_DF(x^Y-lAMs{*Ne7%{?N z1_yp%v|pGxxEpvEEmVIEY20wJ%RKpvYBXW$d>&@_!CP59#*vA^zn9wroO z#QND8@1A!DCBkQw?Y-BQ%C{Wg#FyANq2ZjQSIV67Dvh{2Q#Cp3@`eWv7P6t%D#`P4 ze#bbE5UV}uIxh?`Z#fR#sqDUue7j`&^l?$@ueC+i0#2LA+j>g`0k_Kv%`N!nv^MqG3>lcI%ii<&!n5xe0>Yl+2%cRPq4TcyhV zu(n>#71^6^yY_)Rm)I!6%6i$>u=Izzn1@KzOmX|WPY)T4Z-ND}J#yp6NhWy%wH}~J zmqGAZ)$5V5_NfO2VM!jDHg$m>E|9Uk4IAQKdhlcFoMs_GR`3_u*c_-eRwBHH7yLsh zI4ROu1N=|`UnK1#4)`A?UG#5^9~UWs8^d0>jocStlyHRfHAu0i@AZT2 z8VJ6n61D+2xRZfMqfMqBu?0KQQC2*6G5#xC-$9Vs@dVxemQ?=%J@=P(_Q$2)8G5f{ zB#}a5C)PKTCW5c6CS^g@p5N}fAy)lUs_4}ArWgLiecw@C{gaaSeJ8c_GHy20hhK)1 z@Xh3J+tqko?vo`zzA*CiV?k!Ph$5L^l7I(~u*x^?V1pOn%(sc1#fGLs*F=;3$7npM zLUFkIB>79kT;h}=`&Hs*I|nLm(@h^}Wyd))POnnKX1TB4L=d9HVWi(W1xVeYu`zW(0k2xl#e+v>k|X zrJs(VN19^XZoG(bQcsS$x4|kaBU4ds{JNkZ7{0hP->5R?O3#f5p>`a9_)gs%@BT>N zTd^^J|n`OO;9q?zKe-cP0sz0WX7Q5-q5p$ra~7)d0k1@e=V zo??>L>#P2i>n=8|~u4j%)q)9k%HrcK3^G=4`gt zsG>UxZ-~^diyqnUlwhx;{9{h!){=v_@-r8Bt5S6DFLe>tKS2G&j-V2x%u!W{)mAdt zpQUk|-cfy|ZOB+*jr_&}-S5Dgo}Xu_U^g=&xAWcBQck;%J7nl#7rtA3u*4~{hfrtp zIAXf0O67nVelgf-<69?OM#&uXsf?BQs1 zumRbd3a@ZGnD`JQ1X`Z=22fqU!o^S>%`iWCymy6M+>wOf`Mk-r)PiyFHBB2VY1n-8eu4L|Hu?M~XAr)Fu64_|8}%&HGj zZ7>Y}w&Eq?J*h>t%g4pdUXN9a8o6tUb!gPDniQZDAw4H=WQR#O9KdcgQ$8RKJd+khpRxys6sA+3d zxqH$HaY>6AE&JMkcq@#0s%U!HQz$TJd3&L~f*fUZqS(#{sS6Qr@Wl5dywwID5)C>% z97=gjD$sDV_dv*bQJg)J0dK#AEN65pOBTvSNjNSnEBj`f~cJwJ}~x-&icxyf3MtLMg_BKwgTA zQ`+&aPs!ff=M_}INFu~XZieHR*F9F9gBkk#IeorGn{OiKwJ$v64#N~XVlteu^dQLg znLMMJRf;tUC*S^ZPMwiE$YNrJ$`&mgT{>jRi5IpDz6$XxWOn_q-lLc4#2W-;##h%d z`XAI-tr^2s(2HR3G=Bf*2b$8USnIq9o}}?jHe{Cgm4eLl2y>%jEU^hgsL6!;wSHnd zkEv%x`n&NANmQ%WobtAzp7W(oYCYFV`dBcsFY6!7z3)4p%$`Nr&{;YrIVuE zJ>(iH(4M{hF^L?lFzQZg$mY1fx3-np243ukrldyzo=z0fNvKa|Lgx$d@_K+}gz=8Dt2>9CuJyB$^Yrj56eY_N-}=ef#c4m$dS?rH z{P=ac{o}2CQaM_rY2nwO8kZGEKU=qy6pd2 zSofCmmQ*;SNyAo+Z-qq?`%FD2&lQO1Nlohui7YH2uc#HcT^Y6OUA7=#`LO=JY)C!j zs{I;XoG3N*6Mg@g;!9eI3Yfo$K1n0&PfeMve%;6mXOg}ACci#*rq~c$_jMYH1FIv& zR)&$=F;9^`DrviKdgVHa!!g1+Pq3FUZ{BSVj=F7VMaHQY=Dubg!58@sQeIMb(w_*` z(HWRNWL)ZFIe8$K?3Jg$TXBNg{dGsyt0%>i)8}+SYwz&-!~4o1hpeZ^xI8`AgWoyi zY^&RE9bzn8u^+3Zfryq$6K~&K=(13Yx@N<5R~$JI_w;>cyen>Z=F@||&EBmwW8+C` z=w2<3xN9vDdTN7#`>IYRQJc_BLr{Hvx<#P(e7_z%^5cGVAjKd&4Dd!PyB#?`o%ut>sA- zS+#D>CDf~{Bn@{(Dt=zn{4p@~-m`e6JhJ=61^9T%TX;vyu#2WV z6sTq7KA~(blR^$^Ab*h)kLY-!hFcp-4xjN%xShBLBzwnN6em5IF*H;Q{JuEhSCS~^)134ciV?&o}jbNhvMvazqp)EanN8K7v2e$ABy%FV>z*h~slQ zc4$NtZadXb_pi^;Q&ijJOpoj z*RYn7h&I$q+_EdOvmYGv%`4u7k0-qSS_!2C={~D$f~^x18qmI-XPet=EIQca7liL!-`sSt(Z8Yru#_O9|tw)`lFU~bWB0i`4p2)bNB z8Hrq}?cT+E$;n<4BfHflR}CK^vbX2l+t0jD(@@7Ptaq#l9Cd}~$#Zj}p=;M|$VHs| zHC4WgHFZr+>O5g>^jfwsGVu0)k-7Kkdo87=Ia`LUxEvyb-L$9#h6V|Gts{nY;4jvs zMCRa49znfJO#`(zlme22T0WYAm)pHY+$#W9u70*}*tqil3)NwOpHX1brA-Z> zaamwAfNi?u%b>`Dir-AJ+8!F( zJuBq^|3LOlKbr-I3gP3IUVUM@&xd~a^nXLj|ECWpndwG%o)^OW@#9CbkV~Np^M(az z2Zx@?F?>EwX-r!*;4(Ywjd}q`7m!bOL`>Aun5pPF4obXq)_T>?8a?^iA|p2z>A~>p zlS|vq+KNtH1G5=yyeOj}0SGH|^YgZc#GgXIM9?XVgkbT4ONOqp(cp3WrfoOQ-&hKJSPH?+EMxMc8?)MbD0(^Y<@c8amYkf5m>%dC(v#Mu zIcp5r%K~oy@M4QqH9q*uSU@WNd2`t@U<6`&p)n-0&4_W z+tc`ecio#Sj^gUt{?RAhaTgt(Y_P2a$UCx92-IO>ijG53AM+SB5bTWb^Y558cH#Vd zfGATc-1t`L?Zm)@ij?k6Rm+iWdLx>+VY;%+pEzSF7i_vuGWgbWc=^k5V+Atqi%` zLGGH3Pb2_pA{xW`+yoy!Xe65PS$Jc&$8j9;&0Nt*z^g%OA55;%P&RZdnh)H*=<&sK zITiQ5bu$JCVihQWB*ySROGgJ8as&RBYaL=jiGxU4p ztY@}wl|&ef8{p%M6XPC_J6${VD>3YdTklOWD-W| zg?VbZu-A%+8sFPXzxFb$!wT#2Ud8p4s9iy^_`gFM1|DvAQ(Q+p4ZH+4ECISmMmjr9 zF#(_O7kpP#C_DPD33{3@h>g1~HxWxGQn~K^bfq(hi{YApf!IY$`YTFAzbvw5rM~?2 z2q6$uY@ONeYeubFC-9~m%gNE&NxT#4&3H!&=Er|td*-CWSLZf!12*C0u01a=?@WiV zAxQh%XNyAV9Z$=Yh^VdySubY#Z$~I2c7HDK*?hftF9^#8+Ot9X^xP69sKAnkdCG}~ z&J=fhKUZS0V?^Rjg06LZr<>RNeC^%$w3I1%NI^yrRla2p56g?D<3?=bAG94(m@SN0 zQi^&#f*tnB;+F=B0!sOh9T^Y-vJZ5h|0G(VUpyNFHD)_y);SS5OV7j!*DPBH)71wC z_!LhQDX;sb9>~tcYbs?$Vu*$C9MFmuD2p+Fw7);N#{ODd^wZ7;t zhXo9f7L;&&Pu!s_okh61;fpn6hUjqZ1XekO%6%4Oq3Z_@vIXs#%nUuhPCIw%e&(#O zzD>oa^Q2So;Nq9bFtOuP>ee<+ipG`}Da`%3w}jt0xyWZ#Rcs-X-^$uuaD-Ip&PE}M zrYtq$ay~f)(|y;7gPG)|@B#^u4(ZU_%6vnD2fE45Nz)aQw%khCTE|HLHnH5G|5-z9 z8>T6anR;7WjwtHF828AmF$(I;)!7_yf7|+M&AVunUp*uSFYUt>aoD;=N=n^gpj!LV z8I14i?8BzVfHcK7V)H8~uxvHJ_9+RlP)@t|dEDFixw0n9RkonBhul*2o0)LEdIt%7 zVKO8C1~dVRC+LfO`5_ij5<*FZ8eiRU4oYwB3RTXUeIs$B5?i zq9HQLhR%0vZLECAYHT0F6Zj@fsOP%UqC!|3k z)z`<~2Z4KLUJTwCe)UXUQN9$PdKeGYljR@s=~{ez;%qF%WXsy=ilkoy4YJ;cyqnVc zhT57%R((t7=$|IZF@E#tmxP4D=27AFQ7>2>?Jw&;*1E{ask$`ZKbZFA9?8@it9cUF zX8@W?FSLcX;-JDq*{h)&kR+ysT{v%6lv`I+X&6Lz>%NAKX4@LErd zm-a%^iKj&Hn-r~l>*E+_1guS^tBjWdQu<`cKF!tiApU!@+vp?EW5Dijck=_VsV{~I z%OQ3kMyW&c&W_?S3BhC^eBeVLe5IagRg|kQ0oV`fVHeyy-Ivk`tmV#92s@DUJajC8 zE*}OB=_At8jC3ab8Y-Vo9lH3M{5WVJBEP{9*{pgUg6q-t0mfTeA6w>n9;{W-PA?2M z$U;4L{L?PBpdsZebI3o;S9Xv;bgh4@c9N|a(3aQ0Cc?7 zKskjdXVs|WM2mR$x_M@hb2la9N6iDIxpl7lIt^R>m2tYr1E#jWYXC$xzgP62zM78$ z)li9STkfoX;L-K~u*94nWjzjl#yxqOYH4NFOjgwpl44$9@@uJOMjpJWT`XV6*XtfrJzS%D+48|@ep8YJ z(_yLM$_vU;TWe>>?MH!L-}b7#r>93wSS|&3lzQ7{dP$sq2mMN}{d!yX_V_v3?;JGH z<#!6|Bu)@@wbr0@JQjbh;_p`rMnNJe;Ft~7a}9okV4uyMS92wSlsXkA)Af4@+e+hl z)z+2U(087v{KOXiXmhaZihST$6_m)|ZpDF=3y+!xUx}q+q(5 z|D)Oazh1ri+txo;i{3#F_Vz94f+g-;^KB|HIt?&K!Z0_+bIL6*DV^__#Gg_@#zEy+ zQexTKL$i{!FNY$K-Go|vn9W9!pcA^7g&B@bXuFKu)Mj|k3oq-xDcfy~ls_-H3d*`? zFSzFQ8CU$Y9^bysA&sBi_@9?D005={s@L!M&r5yzPW%nFBN%ZjF(B>=N~&isQJe~Y zCGCPeXMK91ireG6X9-(5*f}0LRxO;ofnFxejy~4{=t(K1nE_|kIe}qziW!aBt?JaD zl1je9EVrckXLJ@xejma--Bo=xhXmwTqwscGisE2Z#&2AyA>EFPD$hAFQ^P$C3`BoL zO^Vp^-EEv4GPIp{Im?y(u)bkK3!(Oec9L2j6%cT`M^z8ybD!jKH0?#-0d*vZw6Y z{nD#pFn;}yELzTv_BJ-nAJ%*#Q4RN0l2Qb$af{PM@qO*O8(#^Cw*wC@&94_pJPQ-@ z5{&2@$JJbq-4CZjma>?987U6&+?Jrx{BF=pF}{wq;tzcU_?~pY zC3}wcI)UysBRz}Nt?eC6eW+RlzfnAHpX>=md={ULmPh3M{Yc0Q`9HQq4&3mM{Xo=gH|T!xlz2s?A4yh|X|!d%f)%G- z5;yYaXaAQ|kwWtQHCH*_KtBY1?z}W2gGjU1d14s)_BD4aBzn&3y#c{>)$^U(1>2!D zgC04!%@Fo`h=av5#VRDa=k^>Up@R(&n<^e*Teqm9P`e2|%w)%Kp28#Fe?{?Wg<$aC zWlQos0_N4I=1BA=Va_&P59|CoOGV zuXEGv#l#GMj^_w7W%83YJ;3-6<9URrz7S^x!GIg^#T#&dbZO10%Z=_VO2zo)W9hrJ z9_!kXJ(^@F-TwL7@D(T@i% zm%hEb2-6D)yKaEt?e_gfHXck^yGEN zc`_BX%Lk8>#oWtf+Ba{Xj}8M(!KfSo1pQe2EmW^fp)&`a2M)jfLhZboXRgGV(*~Em zy(Z5!apIQ8TjK+&8S}gD?(R+f{ZgH~pKZ?X^K$lgo?vZv`Hvj~SM^@bL;9+pkXT& z=eYuJ?;s*Gk^c2Y4BN4BMrn+PU}hgcC*<)+NMuw@y-3J=A$Pg3_2FhzY$@l>wipS- zi~Xy)k+;~i8gjfx0|L(@mESHFLIx3xx+){1_7Q8~+Ek$5ql;TmNVcaM0(L=VUIS## zrt#jV*&+&IvoN{$h^w7pom~Ja>4=5}+rvm_ zUs-d78I}YB2ew3$udL+o#6V=6W9ZL#} z;jND$Qy}X}l&x7U#ko!+1m#qWO2~Pady77ppj9wVR)H1v@U-Dd=|<^Qk+E`)UR!tpuUc2|g5E$ynFW&xWisj}it zCIjTw8voSdWYu(&-brK`M;+nKdfnRv`K0@co{Z9FqXDt2$TS|ax1xnz*5{Cz>5tC} zftkGVWc1dDYUmoMf3PCmh|0{BB}^RO^OEHmnchnD-Qu~tyZW+ytyVcLu|n-v27vVM zXH}a5xTNyx=-Q9Mv>K)pnC)AWx9r+B842Hdz6dB^ONCL)ys|WNY#YvAMOvR=8dqIj zmpn&yp!kCxCsO+FINy%W$PAbp?o$fx2RgClM~Gj77zp6`)L*uJGAR3=)%S=b>%?Bv z&|}5Jvhdr*o;v^BdQpe2hMu70zS-H;z?%yh!R*4j)A?5n+d7`9(lXqC)8g&=K?IQS zf1Y_4kd+#Uk4x%jQQQD1YJcU;C)~NqBISjW2cXrm|1E(c+14*3AM;D~hR12;*zsTb zPkKKlHBa{Vz3y`o*_`p*JI*rbn|TB=62}7-T$T4r7FpvroAAyVQN=$KT0{JILK~oS zJli4RZGq;IKk_db+|epp80{Tq!0}vGDT=zwJ(*mRKkB6{cUbcXKU4DTRSEuNF8vrR z=SjJN@&h8ytnLP{p#LFJHmFVa==U#?-|C1v-096H`zKB|qDfO=!5Kk+Em+{F)ZmHW zj)XQfF^Op}d*AR|MpXo#YN`ghs_}=pY^?t?B9B{tM|66CBCr{Ac{4s5eko=p<+1F| zh`&!kR|(JwTS?wo%0z_9&u5B{*9N$6ctI(1l=pAc0@V3eYk|(DEVyCVb4Lv>T`PohW!4le_ zu!3Ipdw-Ul4Q_C=`0t%w{6P!(aq53kL{f+?^z-?~-z)mZMjtAk+2~zlL8Sc4rgphP zcRL?iZbF)-cP0w#Pn<|E8;!hIdZqx<4N(riEa*6~RT2^qr*M991PraQw*jyjx$qY2V~ zY6#ZgL&S#Z?SJW{`%$16)S3x)hdV9(OaMZ#u^84VK8Kcy!Gf;1YyiJloS8oK<2 zXg@Rm*a-8Pjj$j`9iE*p*c(rD-DgitZTNL|ZF=gcFzI7o)~tP}!r2-!__*UrT8XkF z#Otc=-%|l&1WJ(;dnN#4XNgsI<2pCQjQRLomdV=jozwqQkAUTn z_|&IcJr>CQlkMF9&o`%waW1+%&$r_gS$T^Cejxf>u>Xpz=}vLZ=E?i7YP!`qjVsOq zMTqP<&8++PaIGOMhruXbQ|pH;R=<=5fl%S%RF>h(gU>=sWd&KxLP}S@5<#e3lC`za z%su~qQv0xLZniD7xr=uM`}+?9H4qrvH;F=X9(TM_Rxrz%zWI~AJ$DCFIkbiD(Q7@H zwdfV10MQ0kBjdLqu{1a+6E+N(K}M;Wr~S!>5w9=6>sAvqX5%Dd>$Z{+%(4c(Bqy}_ z36t=_CkW5{AX?`#?lm!!7^25Z9kpIzFue&wS4&>_I7hNO(ODAbAoAPd6Aiz-=dSG4 zSkw=L3Eg^(dtM9qvu;XY-NqzUGn`qFzZ{;joCkEz-!93X5kF&xC+gCj2mR0zn|Hp? zAb)4jl`qu8VC>rifFX`NEbo%jaW9M?qmsH`mpq ztI>H-W~?{7RX0?2B8l;&k}+ClUa1-CS|8k+3XG8#za^UMwG^s~E3?~e#tl=W*beXw zi9V{HdL&p`(iJC;QpT5BSOD>-`8NIMKBc*yKXuZY7Tre(zB*C;N{295XHX*kpSb1# zw7C$C7dcmM#5O3!E<6$-N6pkKR(IY!swJ}EedmGa&}yKSZg3X>K1Lgn(6jyHmJ&L| z3#`4wcZt+(uxZfBIT_qF4ue&+4v1&Y6pLvj%Af6dslT^p7G&z=^BNc+nIN<#foFTr z8)vj_3B&8Q4qJajfs*4B&_Cvn$yWVNuQd?kGurmw<-=fy@O1V+oR|Yz2+#=^t?<0p z5pI=Baus93;_9}fW94hD=e@o11wD6L1d$vL8hX80VX#XvZrJBm9tlF5lcT+rg`|OH z#*0_MCCr#D-fEe8jKME{1-OCVQl)biJh`ASD+QDZ7oTsOJHRCj&(K5E7~b43RfVPh zGu0@hL9hd;#=QcaH}&5bx-xw-*9C4oiq&CHBKjdfdC9YLuBY^??A*$uKH)Y(9I0Jx zMsp7vMM|ei)+}~~E0&>98gAIaPdraS18RU*tR0hwX;DEBeT;fQPM7+Hq|=(J}NQkYy0b^1u4M zVvXZyG)Sal)(Upf>=Ma9%_CGEqg=Aa`_;LO% zJSA`kbSXj!NjfCdW(%(?EydZ{*||sQ^+dY-?PoMKVJlmm<6ZoNefY+oRjfN(dyfXC zA0=61VTWiU>(`F&Y#Jmh=G_7nOS2i?q+DCQ4W$&OWB)u)48M~@!QlWQj?x*6^0NC+ z{R7p#MxrC!%nm;;`3T$CYeuQ*=x~M~9`|s_ym(4koZ(5($HVP7mQylY#z=^!qN8@J zp9CBK{yMK8R{C!a^`Rpq%2TWBNlgYcDM80{;$x2z{jZ+dqgV#y4nF>wCjJgxixgwM zz(fNjPtU`apVR)M<4OEhA*rRtkI(GEmQhntsN`IgZzH zD$E!@a=Y4py7s{4$O%J4L?m}AZ1#Y$&GhK~dyuHR@7_;Z!nXNim44nhMU#2~AA=JD zgBPMAq&{UqUo{-97P=c)A=y_4QwRE@kU_j-5x~C>N$~#5y zuTVVak5HVDDMA619uvw61jSyRm6H85&}_R1VB7Bu9Zy>xUn6=7>et5e1B31e=8Q2s z!+Crswj(L8Pm7Refy0^aO}-$CiY8L;eF-Ug@vLI#=R}h{HO06|1L8!A8kf6s-mI-> z^&+8a|CEUiKVY|T`4)xSZ2?DOd5Hu1OAU|+^FOcCL;@L{le%%+ozS#} z0&mLwDBpc1kFb}O_C`NbL@OvW4lUFR@-PV*wLUicV`S(;dRp_f-;S1GgkkD(8)??w z{`S7qdySF-hg*oEBkl)|0`TI~cXwJDQ}QXD%Lp;5h*07J=Ef&dCFKe`X1a+WNwAN6_Az52p4P8ZM)o%~ zua~Zk=!n0JuA;C@hEP|o3F^jd%|ac^ zeRyPGpZdXeeYZ8$Kn~}KtOxB10t2UX`$uIS;x z%F-f^Zw>~T`;Se*^jSN}rX-DwC8UeK0g#QD^|1bt>_EA|XRT3UL|;zCbfQcxByU$< z=6i%l(Q1oav$0JBRjx!%r9Wf3{gNN&1rxGjC-P2-mO3%H_P|UY4PnQ#$FJKBwuk`0 zAtlWBpHs2p1mWK^cHx|zZ;X&IpE*%=Wtli(R1z~&bYiHV%w~(q)p6`8EPNp49jCdr zj&0;d^?p_}h2KML3%cdlO9oD(6hE33JojjN3>`95U%DbMUvlgCwdWFM-Xv%TpB-=R zPXh}zLUE3nFtDD4AATh9$f^IzP;1Is_zwPAoS-u+;~9vm1P=3>R}hcvoD|R+qtvcH z5zK+@Wyb#eo%cmatg!~_kvpEa^F48Kbfs1W+++*i9;oec)cMVbFkKvpbT=Me2@lz{b8JWNNa_KfK;$Z~|kQ`(`eQ-9C z|JB}GMn&C4eZwjeA|MFTp`cRIAYGEu4NA8H0t4dE2uQb-fRfS;B120IAP7i<4Ba&} zL-U-`>$)%3y5F_lFYl*!J$z;UC->QV|MvdvbAF2Xjy|Tgi4W!SnN61gufdS9QhWXwSb%aof=^>AD2Hf#xOkga zg8bpbzu3PG$qLDXWC=B>yMG2KSfOIf2`ojZ#9m50V!oFk@5P(telg}NJzbEJ>1ir&#f~%umJpzhkDPL{xN4?z$|lN z!p{+xCqg$ZZUU%WJ3Pf5@1B zCNBV}cEaECxi_Ikp>?rSV+19S;gii*XBPjU1cO*K58&Ol$;RaK``DkSuP{`61rHGs z2g;efg5;mMUDH*G*Sn9$P0!jOy)-bw8$Z(UaSoY`Y8WZb{8Nbd`!Q$OgR9mgs2yM5 zPA=kuBNB#+YSt$T5Pp}%-&)@8FaQvo5>PM(N@WQ2x{FclAKzl}Mjjh7);-XCwB0jF z-^_`8Br%~oP3~b}^GKp5GxFib-}*R9$!da?j~bhwwMkka42Gh<9hmb_lc&C3H2Ol5 zc2H92I5ubwxp39u;LnuypGvquqWI~ZCy8px`@hSc8R$QS(1D}DzNmZEDxS;b2A5&( zwj<`6tgx!ASAhlm!)6oU@om|_jUyZFQVv$-R$x#=$V;$ZD`7$c zKv`xTMgP44`yB(+IU}5t_a0%kVEhXkPW-*y#i2uwMA0P>UZ|?AqtRtY<5M?Fpm>FE zkJZfL>>e_441an9q4zwi-_XM_>Y79|Ci%&jH7(zJ1ekS~D`<`K$>*I)V`f&A5Y;@; z9$5aWsR2q3X)ST(tu-y@Gy#}3Oq!sHwUC}t+3U9tturZ3M6Xl{YAEBMdOn~Ifxk7* zwxKNH451?oJqtH?s%&w`G!65?fQ#O{l3g?WqJUqSh$!n~4n$Tp2F>(n8&h%cP%>^M zt2ZO=|2lsX?QjU6(ne2X(`(e$M>MqVFx(9jOoIkZJ-drzuY(yXoZIz!Xi-qRy@wWu zg%9Aj+w!DR*Y2k~04?j)(Q(IC4t<8|U}PZuH%rr1Dnzt%b?h{ES4HX%&C&%vpL}nLDdEUo%LE@H;BHCB?8^mSntM%#v8e?y{GAq0g3aM z^fOw}8#~Y(E)=ARB_wEl9RZ6<8oue`lA|PGb`y_J&&7v#h|lc2;(S-o=Fzt{pd$jl zv15bP@Jk{CPOT%lS~ZJd#(NaqZ7~rFw(ygb!!J^xDM))4IEzu%c<@QlxgR?3-%bF1 zRp&)kCVb_O>xY`?UF495K#vJ4eZhJ51OCAIx2fNX3rd1&*-)q%54^&0J?Qk;>4@{{ zx;ny8sNN2|TrR-_4)Lj9!*A=4e2Bz9h|s%CVIJR9f(k%X$#BvKA$PP;a;q(;u0VTaKmOA2$O75?BRkH6S@mBGc?zmdkSXo=ET}t zZ(&-sxcl*HB9x5<+)vEc9pn~h5nBuLM@vJUX+VRJfG_Es{`ws7kR=HbMYvjeA7lUJ z0+2w#qtLmq6#J=O9hGdD?PWCJkoSGi1rF2Ct6;AQ{AR4QSCkMPZ*IazL}j?+iE>}J zu89WhF7sf^%+|fOtT}$VBWqEjDeIMm{f=II{)4BdUg=%C9R~>)L;rmTugq)e&qjk0 zw+G{*%OvR90s&W0F6mke5tO*GH>V5j(Yd>Msv{0=-$1kKB+!Dbyi>9L7zg+@#o2!{ zv1&wap>;QG>Iu;268%Bv|M~#HbLnr|Mk=B%c2E*4CXPbN+Zg5NXr_V|MThv>|L|)~ zut5jH5=#%B6V3$J?e#*Ul)30TL{fTZI4vABxhJ+4wKR3N#9445PcxjFfaTt#^ZS2T zLIA-%(ax66VRD#tAXle7ZD zQih49kX428N64o!dJW3Y_N_gm)Tp1AS|pk3P-vq1&8|LFiRUU8t=}VmbD6U**b9N4 zF@*gOL-q}T_|+H|Mwysb_2FI`S~%Q3+HIoj4@iQlSy$=m=#iod$!ca_&0cu+nf!4- zphTz)>-LPV1xCo~cJfP7uMcx2O+l1!Lmw{F2;e{Pf)+=wu!L?*lU z!byiYKt!#5j+SyW$j^V#$w&SaN(U+q(UNuI(OHuXOH9zE|29oFWn{!C4a&&>K-q#U zualc>wjj*_E<&2?y)Z%R#9qi&Uf=5MqE={KLmKW^<33PJ+S8X(cJ!$fnY#JCSFTgh(+r?98_eu?pa&_c6WDSG{pFDNje1v=v}{f8~O z!o`Tw&xtV}#xOR|2NJi|ta3LBKYaD#D)SU!muj!=TyU$-(C(;XXuGq}%ddN3NZ>@*a>K)fS@y*!>K2u%{o=~!~J#A zcLQrep&lQu{&unoV_~i*ZY_U;)6{FfgVTkc86nD#>8<5L>czd~fqG*Jqk{wOWL>wL z^vqHzk8+K&+(A$%MhbApvjF zLiF5}{jCLRsPNQB_SekSpnM@v7O}Ul53;%6dUQWV{e`QYUce1pjs5?F)ir9mWe%FV zhY6;AbPD!k3tz~k+px!~Z`UX5qbozSVKf7J=nz=Vd`LfX0n$%%C>2^KWv`jrl&25w z@|e<#Y`}KjP6OQG<{AGv^F@L6fzz_tFwE_J-UyiZ&H(mGJYmF3V%e{C4!z+aD$`e~ zhu^kRbd;Tv$sn**HzGS}eIpA9O4reBKYKz8Z2p+vc9h@j+@tIDr#vIH#C5!%2szcK zD{kv+a%j!$aFB3Jf0=QWYuWaP8^8HKsQ9GX7HJfGGbaL0VIBlJ)A+?%H9z}!Q5`Y) zaH#er6WowL!*M+H53CKX8@VM=eH*2Ei6Ry=+95XbvT2OlRks6mW*TCszsga^D$MEr zsYeB*Ees(I8Dqcr8vlUcVnijy*o-8{g{OkX{CHosnqZKl7B1( zI2}`MlUwfYgs4xn2YJOj4`Nk=aV2WVqV+W%c#+mDBz1gpLnILl)TAksK$j!a21ioo zkY6&Ke}!ryK0SV2TYQxB$g(+g`wHEolhyRrJy@beh*o$`{bb{8qrk6;s5x4z=mE`< z_++Q=&Q~8UK}I*F;C`X%2)4IvQbQncuA9cJxbXov7NXM1*DQzeVNf`GO=nDq=@H{P zIUMwzE!O-xI!E9CndOk@+J~-8SYe;m-fh$cgv6yPhv?3wiNn4Sv%#Kif!7~@$;cW= zz$Z|PVT+CgeldF=-Z_z9pMwVi)@g=K(|wz3aT@TJ8ksX;f7MM zN53qAvt#)93&Be;>ba>Tm>lYc?EDT2-_x_fB%G_5X0RTzs1<~$Rq;^|ts@SMo@kNDi^s;2-Ctux9JRtq970D6SwO25&;zF5F@d?QZ8j%{LQ5xQ)@Wz8P}L+KD2|v zjMmAVLJh>LmX6rTIIxAv7^Ui!=$K`w@J}BtlDYR!7VC;KQr!@I?hBpZMw+UJMUuxP zQ2g`?`9!ehz@M9_@+EnCsM) zNZ7;yyGu`)I^q*&2?>-DkFszB+#m{dd7@@K5q$1L))f#Sd-{}u7x4;Bq8BDc4Io%} zhxwnTd$!`i)_zHnK%pLLFMa|zhox4<4(f3DOcS<3!6vOqSA8wGN+m9ImyC2m{5nSa z>&pD?GYrel3B!kp{ZQ%q*IMx&$LAk@PmQ~Tise$0b`Y~sSHrt=dZ0;eGCPK?EIV?$hR+1o$7BgzOhlU&h zbM|IrX}1G6HsRdz(4Kh^;di+TOx_7kcA>QfqE4aLcUc`lgOir{=K1fb$^kCxLU3IO z2FMy_6bk|byBu66q&k_9t%j&dFMuS0Qp2m2uHg1Uh%RFhdLQHvS0iE0ZHAv13l6}K zimjKndG_xjn`oINH+KRaT*EgK$PRi>&~;nFKyVnuEM%3@9lco7M)Z45C_a=D#x?PgiIM`tPXnX?-%uruI zsZyj@VkzP|;`9@d|H-_wu&9VAA??iIVg;LM`GHo_$lS%Zq;oY*s3#7sfa&$rIeX@p zw7I0dmUJ7kJI%N?Fu_s$C$N|~dp6_HI{Z0WlW$1s#qN0=e{tMHrovZ;0t{HT1f<{Z zC6V0m`(Ye!umfSv5U4-@P%rK-!L-X0*Js+`r}kbuBxin$?l|x?GoyqEQ2z!5X)la$ zaQM>cOBL7|3XJ8$gxVfb#Z*c?BjOc<2isNNc_Ikn(7m+Izb#KP?qHl&xy&KXJBM^= zU3F3L!HH$pa||=nFD`B)H1Fh=OD7UQHY zx;Sg=`_0oGnvJ}0!w9A_JhZ+m&KSNZ2SL9ukJ7Vtg6wCu5Y+yjUsKE+@*lrvnFZuu zPXq2wZzyWnaz)Wm2X4FyE&C;f&{y1xep((JeCwwcVm>ya^YQ7NEJSy?Cf|w~RAs#U zmH#NT?vunGH#?}OEKva!KqOF=`0_pw6Ml&l=f;(($&nN)hvVbPxPGMHwFw6sJnW`o z^9&bms8~xG|Eds{s5Lw*|E$=cj?;&ZL^sJ>;f{W_i81;4#HFALbt@4x!mrzm5AY{- zvDtph2s9kVm=ievcKl2HMOGFezr<6x5*QFgE(!>rdz2d0L8Uf=e}lE9!)LkcfvRFi zd-cTLVjmg7dL+cFRro$gp|?cNFKOq%3J0$;Arrzpl#T8vbSeAOOJ1D{E;*dhq7d(! zA9N{LB%t^=dBymnk`8Ev;-x{Ymgq{uV`|Z#!DohD^&3Cm{eu>Ht0zF9$_MNXsd7>b55}w&`)b3tsfh}VI!9POX-)W z;DC##PCrun2D%UWDWw{v;)Lv0-H^~FHQAkV!o$Clleo{8WDKZ*IfOL@Ff!DE+?(>3 zMqXu2{8re3K=;?OPVQNNM%x>BAWfdHZ;|LQX_~4i^L~Bt0MtWst`t?E>xCXO#Nj%U zLdeDiSfY|-_0IhoAZq~)c7Qa^KWna&G;hqV5#Gtw{nh;YH6;>gioIm2=SN^rZqz-o zo)hDIh?7FVEM6_@<9*w+AwHblkO(D;*>#gk5=-^b^R#g@kSbZd3xeD?gcHJalYm^j z-Moh^&y}Ii`W089Vkb2(6-~G_ZHnQIR%ubWaQv`?#DNucgno|y7mJ~^)w>g<&U_UB zQ4YId)p!6wW8AnJNr<8nf13F86A78$xeTzej2ps81503x`>TUsR2ot{{izI20UQ(* zK{2BG7fxffd?e8HN)aHC9lem!9hCGq*I?-^mNsGM){W*}*@}QEVd{Fogfs=x zplL_>bbI?yVjBjMyTpfVx+UDeF0BZK!RW*^LXs=yDMYR{I36M{9$zi9i1aw5lUrOB znpMAeA)?WPj+ALM?cJe%9^#?)j;`y+ZiQ+RxhkZ3mE9#OmKmu+ZVlSRiqL)|fc91H zfqlNT)Xkvpxk!awfY)TNnS{W|N_()CC~#)!R>OW3xc_!Az1_o=QM9V|Pl4z0PPD}k zF6w2NN?jbyBz_-n&9%3XI50tbBpR4c8W^CObbLi4e&3((B;uB|6x;^k?fKjf38=wI zJZ{yvf}Ybg=p7VYA~HVf&Nu_1KjRx{%Sw4yB&dMU4H5w-xi?<3?yD0^ZdcwOo)h}) zs*Hh*En3EeOZ*GLk!HM--C?scJVDWw2tvsM&b1MO1J!rTFO377l58yE%UueT)GcWa zld_xdFuP2TxyqN!zw;(KvWi&0Zgt=s4up^ia2AdaB4DCLt()-=V2iI`WF4Mvw;E=frIYIN-!;mbK))X z3`!=eC4H`;RPNw83tkm6TZ{bI4<9A=oo!_5z`}Miue%NX`Ie&dSF-~5VM zX^8lRur?pN~ebVJQ@64McxJ6uS*1X?D_w1Ob+RGMI>zKSr>n z@plq4plg|b2#w%Q7yHy3{GwYDHHY1fG!WX0FGgF2NKxM>TOGHpfffx9Zb>&Ka!Pq} z=D9s{8JE^R@%(K*P>WkXyz}yHqq`9`H8>vLS+I$!dDt-=c%HA{mVmox)_KZ#RAc;Q z$nb5{lS-Sq+nRky1Xp54@NJz)+<@EUs1CF@_K*9ue@JSvOSQ5^#yRrNz~FugO6^sc z4X*3GX7<$O3n>Z~%dkDqWvL!Kcq%v3G1+ydc@HVG+M%XvetTy|&G<;0_w|PkFV9Py zA|6(AvlpBd7dlY#&O)oPz{rn2#z8?yrNUX3ao}< z#+x}oo8VJ?hB`F<8jd=dm)1%xBbt`K zC?S`&vAfts4tAU@;EokN1om|X{rWr?Pb$tFD(_!~XC%mABGh>bZcL2~MHPiu1GZla zKF~aRizNX0LIaZbf<1obIPvn)rgc-zM;Qhw=s)`Q8u^(vkBO@o`RMTueA3faw4kSi<3@@TN=h33Rr-t;E5qs^6na>a2-5cDH>HpexzFi%< zg6)EmlQC5enxh?4ak~$Md&%F9`iL>{%h!K={w3$i3+{$1>vW4@ zzZ5F970*Q>&lT>6R>VJ|&+S{cjfZulkp$XRa$Im>NJUpGx|L{vBJY|jnmpL+gOVD+ zI?L9$1M7?}2P>+j^@w8eTi==wfnEwc8nv-YbNrZu;GR&ho=YWJh?)$F6K85wMF!Gw z$Kl}LsYjQTVt$Ab}ZJSqr>}97xTVfEA=DhlZ38g790!tR#g}mo0 zD86aa7whQW(7k~Ty=i2GfyPAX1^19ylz2=+>1Xt#qRb>UR+`tItHy`W5rxo&###TO z08!aWO}Ct9^hilrW346KZo-lV;rKa%y9LHLxIYH(ex==1;iC7bdzOda^e&C0JXLal|f9qJImdCNgDQe+@lRRmzRgj)ONoz@sdC9^U-%dsulq_@^_afdOkOBg1zcR9A}QcF!=bB zrHVS3gsre&u1SQ!m1T3`nXjYXTgn36w-bcnM04g@zl{h_aB*~mII6c+tHn!2g>1(4Y^oj2cy5|9);U_yDq-)bLL~}nGQzir;w}UGP>;$yXYlrkV(Sd& zm_8yXl`^8mu#0Tuf>G{XpB)R}2?(?jYn}^%6KDM^v(3xr&ex-P@ws|h96Zem25>)~ zq<7cu%%q=Z`9es%gIX4(fe9 z%h}$i-AvalP5PhCjvvlh>~dLYn2K5&v+nE;2cmFf@_bI$sbHZnIsC`;&S|?XwrOpI z3&~H3z|z}`Wg>APQHnP@Oe>qzrQ|x&k#C(!H4vNo(L>{wfOCl5rURjy7QemzhIO1+ zgZPPBRlnU%mKxxWx~3nxdYj#HxOKhbXyQJy+`l#2{PDop38O@)$0^|bm+atMO6`!K zzRr3zRbIKAcq2XKw%#@+AHJO^PRCNxlG0@HJx#8Is(hJh@n*z_QZeAo(a5%s2qK?{ z!{iR|C7X?85c<|%(Gd-1q{KQ0Hrn6#X?M5uAAbWSp4&CHE!WioTyIjp+dt(g`}%tA^f`eLlTSFb^E~xxk9O3;@$Z>d0e!Ae-LD3n5-DF$Z3$ zXEkh)%L9oU1#6U_&7})QXl$Kdxq|{)`xctS+o7!!@lA~V7*Ar-GCV% z4SiJi@>eg@b(`)?#{6)NmFlvoLD;u4-+kuFMT*z7b$B_)cm>JrRaFuVEfV!$4aytw zqKf08%v=f;GVd*(#^Df+GYiMO!V4^qq%hanyZpHKW8z2M-cnCPDay)wYj1V$d%Z_r z!p{#gFT&GUH|Ux)8Hessfcw1%%`-E> zm0e{Wlf4n|V(lWECqqMPKe*zXn>V$V$1W36uLOCEPGo^gHQh=CbEBIZECbZqiurj% z9~5AkD}FV7lv{}f-K$&d3CfSlrweUm3~!tn3X>?5!;2Ci8^few87zH_HZ+YHY*7{eYr)uQ}SN!Y7BQlowFXBq5 zLLx)n^P1GF`T9bW0v;7)~ z+_{yxV00?-%`sttUN-7%)MgiMe8yB!#_)LkTCZJ4mzw3PMmF}{NnK8XGwgxZpA@-8 z?&sN+@n36*kBYK9WuLRR=BLMyaUAcza)svLskEe)$R17a!FlSY*fia{cMR=P(r1pM>{VmfD8$T}dt`}o=aiIX+aU%LcK0NQ9|^ni)VC!0 zRy?zcC~~Q}LFp6WeM)>d+cQxd>swU4uZR$_#2PWNF3>TJGRCz;d<#ctP9STPm!)H0 z?llf$1mAXj@KBSyH5_<5R7xE%DsiRnj4d}Q^2dK2 z!gyfaLXYX@k>t%Z!Huh}GwdDX(<4Dv99$#Qt{)q6SVm8Z+$R`E7kx0l0dmGp|e1$sAl5Z2b+J^Ar;xERRZ z!;Lvy*Hit}s;=)mRfccUnnmfBVj*PPOVN5o#=PoH3uJpb-?|4e9O}<_bNYn*CZN`@ zAqTIe)XIX)962ss?~i=q^JK7p#(f>4k2m|XetG=NT1nrp?zo6^N!61TCBf87Df;4m z6JyIbcVYOkSX>E(-=3@}21=>wKmz9tBc*rE3pF-8vI|au?_RKk$d7gAD3NQTGjmIs z?{gqusf;E8?R)LH9V z+rrV(eZNv#=Vp7hdEk2MIX=DP_m$D&fhs@9)Jn6aHf2DTq*Nj?t%P(X^AM)HuJ#rFb0)i<&cQ1?vzxahH26aS_sqhpHr7 zSwU&3*GST@U@}Qu#Z~)ee+>_LtQO{w8}-!#yW1-AiPmSNuSCC;`A*BA^3RHwqIKFN z{Lxiuo^Zyiwvwbeid{sr;<6{`BJZP#{4?g_Rg}-HiYPZelKzL z&UNsCL_LHDGfVuGR2X%EVNBfx&ExD|E5?6@*$$zb3jwk)(QPni3~84oA8c!W^}Lr^kYJI z6$^SQ;LQ3zOA7wM6bGh}aRlT3yPpjP@URk{wSB;UtN->|z-<#p4iY-uoWJ^c>jnDR zoc~e$Zy)IH($&Bu1Lo$t{_dwN3fMZYk2QDxXE@-eBnoev8`L}vlK$@JkjTWbI*Oc3Eok!HK>5pVH)E|R_*w5PzCP;vy55g%ex++45=Q0Z zzVvRLRW4X~`fW@>@zQ$r{0c{7)yoZ@hOeNwyAngpKq`ny?0i=py|c2w4=GaJ#w06?!9614hwsx z_355^l@mq%$WyX>9l#eb)k5AF|+qpCeJCT z#Yls$np>Hy{)oXL*oTsId7`A)Y#%UYqjo2o>A!w^%Vqpsb-ypf)y*JH$U~i0b#65M zz~>_3du2j~)^|tV0^O`JY-l!GNE(@F!;U|-mOCeyk52hG&RgNO}+f<@H+H zHhZt{eeBKy`7cs5)71Ww4aU-gfi7j+x%gujqeMzn)4KhG6velwMFUW>ebF>Vx+Rm+ z*}Lj_IyHEyw!`EK%W0IaeAzZja)W~4wdG$4UKLN%k0{+)n@4M*J~!Qq)0rDe$>rCb z#i@dgq;gEA79>fQz4xY%rdz9it}SLfZ1%bsaDh3o-Pk%=2qCHEuf;oPcztZG= zrPc9rd${83!cdd72UEi`uNuq73t8ER$u88v#*Gv~;88<*tD|-BtjKU;{beWfyMXI6 zi3h@qrLr|m8+m0fb00lf9s6=n&k@>T=DoZfSnSbXW{7V*NQME?qZ^WQBWXN{EWG$XMM2h4v}K zMtW%d1imkI5PXLwYC7a*$SmJ`*nB=%nvkw#L2hJ!2{RDCw?k>z$IGB%F^<@n~ zL%YfTTV1uv=a@CU$r0d%mBVxLZ7Vqu)GsEx^Ov{=1_lcrbGa)lcN8MPqU3Z-j2IV8h^N*od{Lur^++>A-0 zWNbgSl@B|AyB|AKvUt$1-sfT4EAGrVZ|e`9X!M>Ad771Z;A20!haq_V>2;_gdOgDK zF|q@kOmT$99Xf++$h<`K{ z#zXe1DN=6EuU6jp&}1j-eQF+s*W+dEMc`tiRROE2XTQr}wltf8U645$8?orluc^^r z+s%1)(aQLczkr1er4$wO;m#fbOG4Ot%ivjo=|_e^8D2uOJ@?A>nqFjjr!{`4eiE7H zGryS2r_rCI$5#YT%&Grq1+QmqQhVmEnxeV@%MJzC8abEGbWE$$i|Em^nstWngf&m5 z$4r+$`?)tYaQrAz)7pD+IZoGcboXQ>Z@GbQIZeaSxY7OQA+1;l7e?LsEix|8imk%U z1wBWw6f4=I1#ANY&+#x$tiB74`#$t`K~C?vNxxh5HYF{s?-l3!bxqNdsj6=Fo-gTo zPP6~;{%Mg`5It-{qv=@LbN0t*f*(@Y-$N1}I<`BP+hc#uICq?Tfz5THb{*-EP!w=9 zu3jIwzj{BYT(9INxF_@i=K~> zlG>H2o6i#7$By0FlPCbP)8FR-)GsqEj0(J~Jnr|M?r=o6_yzVu0w0VfhjH8ThNP1N z)#NIf=lYi}+r~vluc$;s5sRfGW+FaF*3#dKTZ2Mj(|$bfHtG7q>T}Z5Vy&Rj5=J0H zHBGe>d!EptS6nb*o1Pc-#!%!!C+8zddaiau1E%MVywZ`3sKed3d0cpR->BTQbLuGO zLQuTV%% z8Wrh2rSA;xGlW7kYd*x8d=HOt3bsJ*pyoGjmA^do{;he!@>wSl2KW5x$mcJ%{f8HO z_S#XwFNe{3CxPvbX}P_E?7I~zoNS@`m^d>KsFhncPip|dqNvK&S2AZJC^+JdQ$f8k z|HgYM+_pzlHCIJSX?oYMIkC^;y4RnE)PL9J-DeO_3Q|~9=t{9W+z@B?xYb6YtI!=n zVM$s%7R;RG!N4X;EIJj@9DHH8Eq{JW#N)*!f|%SsEZi)+?0o9BH=2w|2SSpLtr@Me z$(zxCoE^d1sN_>d`~9`E5m&bj94MqU?nA0dxC`oFXTTw}*-*~32YuwwCT&Du@eU%s z#A9ysd)nxxL@E0#$Jqhxuu*kup{-)k%OC!AIAxWj7op3kc6eOWS+-3#T+g#}7k?7% ztZ(JeU@u(9RY-kaE%TgubWZ5?cG}?f&S6Uk&vJ|tEB@Ajd-FmKi`yrkue8LhBS3QV zaNPF304sNNr&nWAPd_Lr>DlAq(&Wu|m5J~fS&1D04|aVNdf!)xk_(wEG!5iZWy3uj?e56T_8g=gpd8O~q>U^`CvtUUYJD;(Xbz zQFLq`wP8raUwgQEQMB=jh(93WVncreaeB+st9}uNB31sFTW#oRUsV+UF>b1IhY->= z{H}F&99M@gq{1` z4@@_n0vMOJQheS}BvV7KEZWB$=+PhZ*(W)q6}q}Zm~+odh~a+c>wJ!`7zSE-{;HQizD{ljqh!mLWoRtRHJ2(6|y?Q%{+)%(~1kFP_8Jf%Dyvo^2Y zEXgmUpP@{A-cdF@NYr=g_tD3U^!Co@ z;Tx?+{P`OF{thCaY>_DnDrjlY3*%s7R7sOtU&68D4d%&rgX7>Br?82}VW9oj zFJ$tlvgEp&r<(p+wSVmp$on6@L_hygDb}%!>8E)mt*lI*3xa55&5Qb#nAyo|A z5H9~A7T-AljEp?jlGEb;LoDAy0L=UZ+l8(Fg?HcpzBL>T@rg74hpXNa-{gb|Llz;U zf1$EafQvkK@@>5}{_Ex{BdLiabgpZ@V$O%>56P zF`+RgJh$Zd>0jM^)B|ubgf*&8A<_W-Cn5yAktj0eG5kNA5a)8r_b!nlW{+nU? z5rCLvX|+p?+5dIpXa>+EV~Ge-=)W0C>;UY>A?DJf3Xt%a`dz^Xcb-(8!1uXCGBHPn+MAf2=rqk5!ne)WxRQd-hSx?+%fmg=I-eFiHsw-v>>0?F-Mk zw~a~(R(|G$d?&>UKgI>_#uHRzanY|`pgp$rvV?Tl3WuLmYYaLrxKdM!=qWdagbaF1 zSm}_;?r&udTRmg{JwS2*$M+o3!Gv^Q342E}8IF{LtC@ zbk8Jt(Q@(}daANprh7YG-e z<=Z9cJ5s3mVKV&;vl^zFiv+`_1`*!Q&mCTuF`6r)k4VLp=rXpnFLzVo1x~h} zd5R%lq2cVg_z}44EGY$miAhWHoQSQk+A3u0%ueOZ`sM?SqrScNF3zc?_*rhHYMbYD zJwgO+=_`>hE{85HWU{lZ)A#h}`x~SbkNL}|f?}8EyQ5BKo0H=Y;st^7q!xK|lA6H{ z9_Rk1>MXnNF$S-FNkQ>}bHjxe=l79MuK-80EB#RN9(a4(OMMO|n zFzuFV({n%I)UVIZ^%=Kkv+|dD_qTca*XiXizkTYuKbyRAX2e4!=4o+F(1{_rPw@*)xJMVGTG*5aeHDu3tA3wh>Ml-Hx zoIqY%>AWSr8+P6J&#+3suxe8uMWBa8LMUbFeIf>7fJXFa7>pS-5JET6+jSNc@ctxbsOB1#_eGwiOG75ql z_&@aPNfoUlTYR%}7miSOjH4u_^`gB!=oi99gD{L@nnm9nM(OeS)PKLw!$mGtc7aoV z{r4&V1cvqI>mv|bVrsv()NH7xlyuJE{j7;tn))td6c{=E;2C5*oF2HA&Gq))tv=9lpB`H5mqo{S&R~S*M5OTq2B6rrzKWZbztn z!SOvhBFcB!g^#4KKeYw?%Nc~Sssos1~F@Q%?aoHOoaJpxVsH5z>t#H+5nn+9> zFF6isUV$)PC+@PxE_UA@)FoZQSd* zB?~OnTd;l@TGybyXn`Xn6kX2LHF{^aXXMh)!?9#?3wK`=Q_)WGjBKU!=Ke^d^jp-v zV^C>SbycCG;2$;c6sUm*pj!JsQz&tj4Jh`iAVf8CSV3?W!t1ihNX(i}vpa zfB)~xC8(Gf#=k$wmG*^?;!+38emVc;*%zT=hyVWP)&G9$!n*&p#Q&d`sN?WI?4htT z%u#37A>UQKS?#_{oR)5^Tx3zBTAuvFz@)u&{5l;el;`_m!Vivw9a>pKB_E6xUZhZh;1%2Rs18_7wAr$ZotvLQ)(cFUSZM5%9YUGs+ zn8cZI12*Rb4hGkY2bgXN(e}tWiyXv%80`K~lqn;+)yb}#H|FUZVj8-jfASJ;CL=3f zZ*C}7tna;3MCZ1`5cIhI-pB2#Sf?WF$mDdz@!v&uacqeL??Rf2F5K1dB?dVIBJy;b zD5GN>^VHWcH%W{(V1tUGE?_&XQ72l$O3ukbYrx_)@iXH))Fu#nfq&oMeXqfNSrUTl zJ$1+jOTanY=k#$iX*bCzUKhFu25f3|lh8xHaZ@&RJ`s8ej{vTZh_3t>FZ6WUv?~a- z1S@IYIPlv{^(9=wM|G1p#;(@Irg#Syzh^EoY4L5DQJAbmabG7T4eitMZd|YBndi>ng!)V#&5W?AaY-Gx+J=-} zhHIAZYgBn2lRIa}$uF@OFlNe=S9#L;dP{EdWsMAImY5MGi~BIkA7MMa%1H3uY>lo3 znRZc$h#I)QJwN{SDpmk;oV!R#eK9j!hYnAx;HGGAKc_D8Ruo%0UIk?)rC1=kL=Jjr_AO3HkK*( z#43#`ot$<4T~WPZXS5j4w>VToteZ&ZeB9sHheMQ7)sQcL`c}R_tjOT?osBnE)Z=eB zwy%8HPWziAzGV2yV((JqkELl16b`}+Z-I>r@9yzw=(J*ikBvQ}c30Bpsqd)EYj-yD z=5(1{2px#OmqvqT8Q+w}=$<5`x8KT5m zPduxmx2*}#-AwNwfuJJ%g&~qgycziL3fRN1IuK|3hBAYJ`=xED_)3R3{29`>E)B&L zc3o+QZtnGbMLt$0ou3|K&DFE=7@k(JLt2qx-#vVq^Nv{yy-%*`4MiTi=cVQgyKQ;E&d zZhUT`SxNFNxjLlXBf@A@*N&_$j#Me7wyEq&=4bW3A`8__l8$3X8ij$?`bfvOzwH>+ zt%rGAcf3~Z42{ztbo-Zo9Y9@SHQlp&zUz2&xOX*!XYkD!9kl{O;cYXXVQJ5LK1*pG zlg@X<2|fpOtfw{p+G?%0DG`lAY0t*nrDry7n;24v2nh=dXQ}4hEs0QE^on?$oHBV7 zBc@rnPSKXqOEjZE(fvb-#Z?1;wFj3U`c=^Q+Z;xGe*N{&1{IF|6x%@@Op7dGUY@B7Pe&z> zc1W;Z-G=$FCALv=11nXfxw}a3jhChyCXZev>)|UCRiT6Zwm8R=#xi*nm99x;(41sO z_~OmhbQ^5`@P(!P>{c2DmB2h3>QpPMO-Y}qPYlni$S+EiRZOmXuuxymt!Y`&Q;jxf zyDsl9v|dM(n@VB0D5FgMF>eQx=VEFs0s^=OZUl|H)m2?p_wTqTuLV6SK~055a4)qC zkl>UsZE#tQzIH zOg&4V7%jUallqhk#;UrLm1WUuAu1F5@Qqku(p|@^<4W2g={n}~wiYExIyAy%JXGP4 z4kj_Yp>}*Sl;gGDMYKN%@FHba)W=&PTn~!&njT>8OXRS$@UfLX8&{NX=SWFS*O1t^ zX^;{@H70O4E^pml*5=n2`N{LZ*3INgm7hRUmD=iK5S${b)`=73((jK7j|s%H3N`DA z-Q%^rTatb-{CaoyBay3!26W0Z<9npJ5q zo63wzg!n5nU-3|ratc)}!s|9ozrJx6zJx!T?p*m?U4=RgP5AhAY3JoQwZZisrX%nBV&!t{f_Ly+jf@U`jxjD))CU`+dIt+4fl6Zd8@QhPMlAm$Y(L`s?%G zak8UFSN!>$O+@s}Ukw>!+$%eHK8Ak{o1ZSrDHx-oHk4g(a#sG$BGJ{|I6DkJV<)0f z{z)w4*8Y+va)crHBhk_*Zr>-OcRdN(!nt{3&0WC?rk51iV4;ktVBRPDHC*-^_RAqT$S>x-olx_F$r2=i7AtZ$#^LA*%cQU3t&RH%WHkeiYXW{v3pPrkG zV_t*Sqe4{2$*NzC*kR@OXqKGo!!^9ao9z*JnxwlXHO zEt@&H@?S$4b>zE5rljeNV42~ejK<0-ac=0yn2=GsticN; z$A9g&8&Nk_#Z)@KP;ZblqA!hqn8$$FZp|YIsekPQHQUZ%86M2QbX9p9UKu$#u>Hb` zx%Gg8#D`+@a9iG)6fdkPKJ?YC$@@C|uX9HmtQaUb!PZf1R(9%E1)KKNgw8S63|%Lh zSj<1=p*N{<-z`jxOzsMg0}pffhkv6Sw@|P0n74xPBfH%#VULw0 zQz5QEAE?wGUwgW{a5EEk-p=Sov|ep;U4-e>G{>#b{-awDP2is8koi4P(Q0_H!z(=q zMSAJ(iPu}vDUa6jE~CYOcr*K@G3GtORVD_m8$@Iwb-8qYiWb>n?93>m58A!=#jV-Z zQ;2h7aueplX@>;vi{WznXH!y<_ZT)LS{A;7di*psxIH%*ihV1`Q~SB3jQep1vnclQ zar*}(k6f@AQS!~qT%p6F>?8FDAGp&ia}r06Hz#TtTW-&`hhn=2Wb*s*^E>hjaLdI9 z?pOyqe8p?MVI7-0vI`G<@xyy^1drdJTka^Oc1!*v$<@NmI4M4_b@iZx;^(rP6U$O% zd`2y}qe0#d{+07OMn6&q2Q{C@S3i?vxS8=Z;H_+`ZNkL$<1cFOsqgyi6E=nH&%B(F z!*(rn2-D=BEiP)D;kfT(P!W8SH1-!Zv{B^ByT6u_@3kMkvJrhzd?c4GzDym3)w@td%;i-Nuk^~tT`5dA zPx7Q!e zwJf8JzLB6gA+ww>^@HhiQD`cgx`F8H#do>y2OBtUAB;b>sNTw4wJ`9gwH-ciex=7? z(D!;bb@p5Fz_dUtQ$eU=?gQr8e7un|KRBh3OLSr-x3K;D=q}Oml(gvha!s+*z<`9W z>4P#l-p`9t6H7NgGZ>Prl&v+VOou!)B6S>YgnluqXp7YGc|UGw(K_Cp!!vv*pF6X> z;fDc2_2ZjdnZ3xMpx$I!7G61WvhfI+k!iHNGfY#s zdl>!FVBmy%!n`>#pkr%5!!#A3E8BcCL#kYJ1qfXNoN#YxN3gk9XX@J&+MGOt;!cCPm)%jXjFU}Wx9p5WdxItbaTC8CS#b+FhSh?oyC{ zRBAGk9r%vW?7>gCBT=1JfbWzaR_{$Uj6uNR92@t>AGkmhkt;oC}Gn3nA zaQqp@xQ;Q5)X&!R=1SN}g8P9KhU5`8h8|9k&J`ZkvG0Yi)+22_1#h`4VeQ^}zkcbT zIA%DC!2}Z<9+|2uEY_6jqyeB?ui7uW#%FuA1n+!$h*1A;@hsoI;@Ut;dm>yMSve66 zT2c4QE-s}2$|I{;>VI%jHfUsIRQS3z|L)0vsrc&yT!41T%-Jn2v@oC4c+cHj7KPy2 zU3oY?Ze!CI6c#ocRO#$`KQ{Rv`zhB^UM5C_lKlz?fSn8|eYz?i8oO({$=srLrVVEw z)8m6IKhT5t930)Lp}R})BRf_${ay?Nl`^7P;mzQkD2Pv`n^<7fZWQjn7k?%Z{n z2mo?U*P3&Ug{WK^ZrR`a7k0uAqv`2F1paH`6<15(66QN?@jslzytPEATuLp2*m)f_ zP(Mq*8Y72{3V2|l*oq>nq9LG*fAGCDI)m8JSVCSCR7%l)?oYn|a9>lrPyVqQ3v z>R|)n1(6BmSQF9FXq1bIIejf)K-qJ=6|bE}wP*D1Ke&YUcJdpefDOZ+T@f3r)Ztjp zBW~#q`y}|N{?V(am0OdaaVX52O*B-*>ArVMyV%-Zbk)jr)L^~U&hL4Z%i1ANY5M5; zBo8$sihQ0IG2Zjpyqzsf^92tD8tDl%0IQegn^$4f5*A;<^k6&C|FBi$ay)-UAd1rd z3gqC(nQLu@m%;nSgh5yyMMsK4StKkrCzSN%yq2*|~k>=@^P9%*h{mt|QJS-<0!pl?qbmFwJ|Wzfr@gzV8PnQ8m|V2TRNxxwAq!WN z)hT08YJRP0=OquFs=l=(bojT5Pjq>M6U~b7 zZ##*f%xRPe?jrNs#mY=U9wzMoQlpt_3CE@sc!^WWO~=jfp=+FwUMg^?wUk*SB6njc z?u~zCeC>~^xv4DG8ce8%z(_#gi;FtP1>*pI{4+*uUeJN(Q-6*>E3ba*0*}#?kdvUp zknmc=DOCEN^D)_|D%J6y(Arb41#)sls#Fir&ohkM&`Qleh4z`E>R7dJH?Kd?+u9?`J~w?&N;*&HXq&`gvgM-cYVY8(kB-x=s5th6q*kWA^UYTU+xYGSL8h7Dz@wT8|Q(W zf-{k12#-DdIi7Jdh|+fd^i_5=i3yC)7v~Gw<{65W{7)g#Yj;KnjaDN`P3OIR8uWB` zdxxw5Z4imSY~<+T@L_YHHI@T&T_FeB#Pe>mztP2^j3I-2n2ABU@ANXuF|li*fuV91 zLP?yAQ<#5y_E3L3)w1#V#`q*vBLlhZ+jy#*!YXF`*alBWCW!bx=7?ziaz}}~`6t&O zLm)jw6(sEj)ii`VF7p8UNQWN!_jyeJku%y)tHwSxfs{qk(@D_6+kINg6afMFiF#abh0Bb!W zxGan9x-uX>5*Km*StQq=7vj}N+Zuf;1I1M;a6NJBo3q;0wWbcPjWu^_zIDr0VO_Z6 z!c#_aqgx{oA)V`kjKWEe3n~sULI_c5X+~ooG##rA=FG0A&s~w@tvhjkfm~kp)jL$0 zY~|(nWpMPz7N^~Q0DDT6s>bgh3p~Eueo7=HS!os+C~r-`GZl4}?GGbvhix~zyLtlYj4H z04lwgl3bk(%N5V+I{8KF@Y~`xd<@r1FM_9=3wK#e=0n~qbAGe&)g4MF(IjH^D*IM$ z*@?8}d7S+B7cEP7NiMViXj8@CuY2e30fA9V*%md2QZ!xNoop1^%XoaZmqR6V+U7p| zGoUsE+$8zk%}Y+w!SmG;XkEEj7TGPsS8%U&4i9lJOI-->aUs_D>yPw^M!U6K#1SXq zsXhHJz2tjN4E1lyB+!Z<(z9VyCY(yiWhy7{ss|g!IpcW!;1V^lK0X^qceHon4ZCPK zV!5$u*S*NPA5tQ2bcf|)UfAUc@uN<-*Uaqkpd*qDVD}LZ_8o3A3E;L0AB8DstQytW z`P>y9Zbj;Y_~CYEr{OrTbE3=>8!@WO|4Nfp4}S??VSr>FSZyE`%ID0FV4K#U0Gu?L2nGqaPADORXw*c|EHu8Rbi#Rv?oBO*<+&Ec87XPzwc3dDrvXXzev*1dB*6 z7RDyaSdF!t;L7m1$F;}aX$gODWQ0m66U0_D5mQl`#|y0-Zo+bwkZOz^A^e3LTN;sb z@L8$sLP)AhQyluT<*zkmJm|KVo zLtlc`&@H7Ok*Hv!tBzAKK9>Nl6*#g>Z`_x=IQ8@E2j$7|lLD*N;F9q!ktBr3#> zKT)~=#7uT(M*k8l;q_-c7}@0y7b{co#cK>Bt*mSa@)iO97IDWnq zr7&18A@Rvuc=gkK3pcWt5G5SPWWkr{P=$YSS++F>5UQ5xW0~rZw(Q(+hktQIoNf8o;A{~lc4rrZ5;25#v5eF@ zpKD*{ko0uagzb~;%2GAPstm#GIyZz@4yC_8Ik|`W8?gMJ#FWgi)&FEBCM9K#R2v5V zUP5l_b#WCw;GaaOcu|Z+A3JJO>SHbLK_?nZ2grbh5LzKXdom@ClJLYbXO&m|SLC8% z=^P2daCb~q?D>Rc`g&{Yc2lQ*Ag2hbbwIGZ(r5=Z#-`0zrea$5Hi;7P{d0__+{FX_ zdFl(7*!DkcX+JESt7Au(%K;lR4*<*_YqLicmp9hvIer3hDDj~{Y)(rjn7xI2A=>Uh z?Ck;5uOn?^3?11`VN}YqhBy@{71tP}@C0EAIv?iJ&#^0M6=2zKq=@u1W96wOxTd%> zW6KA&tfhyOaW8Z(0@xlDUL9A)K;4@il(C)7mVLUQ@fNOEsMs2Ek(LYzFJtZY;`}>q z8Jgz^TU5LXEv;h)3XrYrT{yDFd6l0_tBmMMh0w!l>J$#kFM6SHq-}(&Q0M*glF!!& zoV6FMu#|fq1n-af0i!qW=Jl%kQ_A)0WEddNN&({d{$XSyd?UP;5wy=<_k{1)566)8 z@q*Lcmzaxx5ea9>0cMwk^xi}HQV}FN_}<1E!8Rk>y!#yi=V&n zuID61Q^%2tWTN&rU3*8@U?DLEsK=-7&7T*pr3nS4?IPxGR2QVzMvxYWRZ@+Hj4JYo zsmU+rCzJB!DslE^>9TYq^CY@lQCQPkzruioN9Uo4V0IWjN{-*2^`Gs`IlGc;cWrFm zc;IMla>G`)gi5ZVZPf-*6sY=0BA4bOeZOmSLp@N5S_HAsk{@bQe|~tdX$hqyGMrBK z>1&3zK_!WPLT)0UT33@Xr5RJG3X!Ky^Frr?HQB!!1BE`r5ri2cY z0*lDL9Wi2;{-`JQ+uXC|P@q<5xy{%(ylQlKkYhRDzmwxeRFNUW@c6r<04y_BDF5Nb zwy5Fq!7}wB1FMXFAg$XwywSEXcB&=rv0+M2n~CIQw>O4p808c_yRcZiBBKQM?%>)r znG`VsHO(NEWa_f8f*j4O92Q~2DPp%3!Kr?wk4QLA1Aa~{QOVFs3rhmk$CmbQcW&9= zeq|1D1bch)e=L`PcD#k})!gMZ_^4RKJuaGyyzwIV$Q2+I*Ppt^e55 z^D_Uiw@v1iAT?-5Ly5Sol*^#}jze7cbIO1pSPoyH1VHI~9J+2RB`Lj8(Vz~wgbLE`F z$;xTyLx#PZ5lJ-peA+6#;)UaYzb0zE{5M=Lm$1ZPGym>Uvpc$D>39}_)P7n)w(3R)+1Lp(B7?s1Gm2_US9MW%~lU*Twb>B%g|>UYUYQrCPcAb5VDLv zFewo+bO;UGu}BH*XD^4dP;4J~DVUhj3#{uqVNTmTvxhqX*76E*`ca2ecB0(7;_{u+ z?mB{%Xw@Ht#mW9^c}j6_oC9Y|f4~c7JfaE{WrtSsKlu;L5qjMaqG1b(42ifOo{wz| zWF2fT(o*wkWt$sPo$U-n7xh<)Bl!VDvvpF+A41W=ygTGNFGMf?Izo~z0l5$=5?|~jigbCWjqFUkVSq4vMl=T$&SZ|S4@+I!uFdkLU!iGn+}hcB&wNxaUX*Im?HSKk z!rTy4c?~r=ZgdC)a#_}@l>LV^Zvy1cq*)+xYk)J-p!#*7_GBt81W zHtwYOttfwf+HC?rE5v)nU;k`vls4GfmjA8Dn^ctlSZaYMUSuXCpa0sT&x1s6$1YUq zNe$j^!Y*wisDJp2d}!VP^ltfU0-Hg_HCu$&n-j@Rd$(36P*kLY=$u^b3H>ZlJ>46J zQ#=6AiDs=iO2gkHwcE1Rj*S7;fOK)Jc}?#tq?Ja-$RZ@cAMV@&ucvzOD4FH#|B*RWh?uy$XV z=f8Y6es5W4iYA|vTYHlf!~X$tv~1f4%XP(1MWx$~^!ghfs5vrFWpv%X@JIj_$E!yv zF*#?!P1D|@wf2khXi}UfmDcJWLJ%>O>vdPA4Ld-t07NE1WS5jljU_< zYAg{A^Y@+bD;Hk+C>c1W1GMs5XHrc<1W>}%jg57rrtdw~2}kE>tEGc=|3iSc&SaHQ z+SdZPUcdDr!KrR7>y^!qcp?QBEz+X*c>O&R%*otj%I$1#T={=#1CR}Xvrx3g^Pa4QCT7*^XLW0m-zT)n zOTc0)LS0h!b6lDE*i^Ax`Jaqcd8-B0(dBff-am|v7tP4zfw^vFhXQ@!D<{Z6hyA!0 z@|N(jc$l+e^^CY{Cpomxde{}HBz>wn#GK(QRj*0e^4SH6a|{xMNtmiD@F*!%!BKq`%oq6h^NLy4UMQh_grkRn5* zNcx25dpxb{wDNMMQt^qXr2MsV7eYSlU)HpuQELbKD$R(EV>Q!fDYZOv@YQ2`66-$8u%vzF1}gyW+k}rpf}H0M zBR&NJH0ZAAJ*17{H4e|`m@nj=1Y2ojy5V|a*b5DLq7??CpTzB$FK{tT-71$=AFN%e zlZr4Zg;MI=%~!Fp$p6F)Rj_+QpfkFHiTSq9bqwoGfUM!cJiUWy{O&1_x0aeua`|4R z=Ai^o#8EwU<59__XEsx%6w3ihW|C-??q6%Q25vXTv4Yse4Sdw}$kn)Lv?}{{9YPf0 zo}#2HZ3-1$^{*YKfH-GAWR zSv12tilir_fsWpfBqpPIrOIrkCieNOj%`*dzvXFz3yC0I!=v(eYQdq(P}+skX`7?v z9|8?Nht7I~gIUu-CqU;?=-7C7|Fwe%I0nQeG=H(MXg5ICCvD8FM_F02lz3S*=!sL_ z%otMTFwiXvQ+8N)7r!WC9{*hekG4G2m8xa1UH7w|hXlVD3kysCyb8p)^&`n)a5)O7 zUhDULY?;$5@t#ol?D}Sl%8kgn-=IS@iZd5>%MV02MiEb{yv_$&MHMV;&JhOEL9Y7vzEg|s1afSPK;}!Uf zlHC;(GaNX1zcEm>Ra@aE1q-bdFLbLJlq0af9y$F!@XFYj)b3f#j1Z^7xgK3P1I%ea zD+N4C?SDM?g!s@tOz%e0rZFH>e73z&(YOh~GT)-FxC0y36Aw9B&FwnvD% zO@D>CeKLxua(nXeyuM?UzzcdshNJkk;J$T80Ur#I@Q<2{-o59LgjtQ;=UQA{o;Kub zmu>SK;F&PKz0zp({4eUw^#s|d=OKRA&`Oy_OoIToH~dYdeArNH3$g=gyYtLcmi4I! zd^BYEjqKOIK~polZc}FmR??s@4$m5)6|h=+T*e0TkV&Wppan>MtE%cw53pQ0ExE{J z{+5)6uRtbm;(j0h!G&~JI+AyAYFNA8P9V_{W9Ic2TgX6`_1aD_!F4M{ivY(RWHK{H z@KV<;Syr#rR%CL`NXn0M1;H(aGpCSXdKw-oHO##A(H<`0$WHL&2Y#ToX|gloeV-_) z=pJB0g8D4hUM(=K?}UYfH06j~u292yQAGP#R0K#cN?^PfM+pmEUl5_pDTbJ*3&FLl zv*_*qhQh-j;;;U*J9=<8-dn2xGr0pIx{S|S0(HfRhAXRo1n^{X2X zb53l=9La!CI!(RLAzmoA$EW78%)BHhmB5Lya)3mJ_c7iT!Us4q`Sx3YJ!j1tzB~`^ z{kH*tiL^x_^*=vV85|lmavN8#cu}?_a`kq|w5*%V2Yl3|tBbd00Ts{@V~C0A^kzRN z_Y%9)7?ZHe?{-A;=4}9ToIH7n(nE=lM^Ygtx(>AjVnoJ^zic;Zcj?8sTbXRHHH?o4=iqd$04r!520#3!32YmX};hQ`~#p~reb))Py00WrbrTFYMlX2_@P=r~<#Xvy{TSIuHM*)~G z*r>&h&||Z^R7I`UJRWEJay!FUzj&pyzF4CrgL`J_}^ zV?QDL4F%Mt@zU71{U*wIRP`fW?UA43DI!9oQ4Vu=goxgFG01j971S{@K*nnicnBP< z-ErZQOBCkvqQeHYqmOcvCCF^^c(TU5Fmz*6~SB`*Oq;7ttc zxrcrs0#yyx?gzlBybhsMNtqnIN>D==u)SHmK38s40pd4phn$PoQWGAkIM((dAT)vust3kpAVheP(jb*jw;J85nMz&2!E#+sT|C%lb_x_(=EHSt z+Pxo*!SH!0>Z8N<$Lt#lMx#3qEqZcUsQbPpGBJQT6ZW4i@6W@`pFni5^LT=}8)nP1 zS2TJJD3t@IGEd>l_SG{Mr7jI#D?3n_+jbtUtgBN&;O>VRHmzF*{&2nJ!?oWEfU9Q# zZMA{gY^{H#%W&8ZCLrnt(tV7NJ07B`?QB)H;KX+!+(wuv`^jP8=(Y4r|#-Kp8c4D-uHSA9#-cNvf0+bhwW8|{$u-74zjY`D% z{{|W9{j-z8egn~16alzSI9#y@2?FtTL}MhYm((jN+GU%G>3QGImK*XB)*nqE6pmva zgelCKaL*nX*1gw#?|aN+a}Tvp48&C7qnypgJt*d&un@Ub!f?|Y==lr6E1AE)2~6G` zl(q8y8S?QV{)vu`M&Z~|ShvKw3gA28TK0}nw_jj^!4vQ&^FWE>0* zeKoNkmTs5iYZ{!SEbY#O2pc&W=o-&A+|E*8Hx{x}<}S~SbQS*}H_>nbt!V-Ly+Uaa zj!2%;NI6D%tL*)&;r7^?`}$JHJFGiLF1W_ERzzj^JTUvin@#Q7(BETv>yLl?o8{B} zpDq{2+{Z`T{w&uuGp>t=7R-LFfpULus?Bsi%6eh)sxpA8%Jn^;ScAj(xyA9~Fb0F? z-++4DTWC>NQN(i1v0x#8cb=<0p6yudkYJ1!2bQa8DW}yrT=3||nOCVUSX2d(0ei`x zxAkm~7}ZIAB#Sg5%wK2e1VQ5EoL@0sS9=L5+hZ}hd>;0iaNbzUj2MF_>!Fz)>j68ad{YDZnV2va4Q|U#-1&{rv zJJ1PWe-(e`Llj(3)aLi6GeAW89)%$!(s#J&D2Wjnz|F(+#IUHM(bZ%0od({ zPP2t7thDE{k`m?E^_g5UCY<1`;-n@6MdT_XZ9hOddYUJiN@^grvtY z7ul@*RQ=iQCmDzdO2q2PAI|*ZPvzOZeOtY}uGcn&w*xEf??;lIQL>Z>MQ632_V}nL z7P9?*XW!;}c9!FNpZ!MKW+!e$0@Tx+rugmIPDP>1E__smix`&ciU z>sX}6{Zmaz^1tS1{V(e!)E7Trz|=Vgu*urTQrvAzRq28L?U->v&4*_p?@{dE$Ds>? zkE)8!FvR5nm}8P&OYpO6a}&T+F28-M>2IST&zzo+bH9~A+?%jC&PM*c2M1_QE$`n8 z{XRS7B0osa*Zao?5*ZQfXC4Y4EVjfbGINRJ9vwHAtfF@RS?oXsjRhP(4|?9R8e6Hp zqazlsx4(+l9|deC{nrB&S7d-`TG&rvPBaLE8bawF9%G2n0Bx2k$Izemb2c*380E;m zEIEJfTDKK_^g>wwF2w9_1pmSOpM}(JB5__5?$*Ng`fFXRTPl-veyOa~6MI9FjmQzd5u>MSxwjX*)lh)Mo)T zVR+^5;l#TaqIjVN03Om}XMDEXm#$v25b~8XCGC6=pjoA((^f@;?gYO{g#0yUGcxZ; z*zD{s5(b(?|sc>&wx?r)8oh z{mA#W;9S>srb9)&Ys<3i>!p?2#MTUluc!&(kR2vRM3)0r*d1E5T zQvXmebv`(dY^2~98 zp6u`XSC z59Vd_(*&9lrF6gWC&s<&k4J;idF-2)T&2{-W{}@Nq#GN7!Tp5F2yuq98dx)4I!rFW zM`@T@K-pATpzNsdmkJXuN4!)Ox>QOy5H^H}s6{k?)M0G*Km1m#VL#OYsK^X@APML) zpVmdwFUR-p$d1hZXwy@=I3kZ2?=@lh@H$9$Nz^0t3m)U+x`p_@I{7JZmKk!;$8^em zmi$pMvc|KX_g5nO6?BX9b!m43!2I)wMTHX3EC-f74NQktmoK$!o)NUZ=xQjizQ5^c zoZ~-bSJfu_m?Skrj43!ehhV{H=QYX5VM-X0qa^ME}xa$GWX8C!JK6PMV>w;6V%ZaJcGT zRgU?G3wG+Y&SJ(p65&}cah--H^c!>K{q*isAf?DnS_%ggRD4c^IMKOz|3+dxFl~WW zB4li=-{qtL56<)8AXrcX%%ay?40VxyMCh$ADqa#^5#^XGcl=9h&j7L#ok%Ou#f9RE z*ps_F?fxEsGPhRc7#tdU(ma=cw7%$kDda{+eT?acu42uzsf*K_XXwKs4Z4g05jg$L z6ne!D)4aOn>z5vSxKDstj_$luRX{dX$XtF(*R62Cpv1Gb1&3TAcPr@f7@ zJUdK6BZhyoGJ+`c6V-=IK`rzdY8sU{G`9++j%h{H3489}c?BxUThvUO@GT?7%VF7J zzrVMfaU7a3-#`9`oAZyVB7y~!%K`|5nn%}Hc~>*uSc>eXQGZxXu0qo1Tz0{dYD%A1 zhC0TDZuq_q54?f3`^LvX;WkQ9=xwW+LqifXiu`0fHmy;i80md@LJBmi4*?y~o2^Zb zrrk|U$Z8gmP(98jcnmX&eRxe=6qv%VgiKi*a?0Gs;FZiEpG$A~>X3`l`728@N+}qb z_p=~wu0VY4(|y4XNbXybgpk{uu+T)>oafDWZIjMAG{@96m0N#7IPwE2m!&8zs8WS2 ze6$|cr<9f=1)cq)#mMnogCYD0L0|KXVH|7ZeL8LlSm;RDVdOF~`O7`R;$pSW%KB5@ zx=$0Q)~|Z#>R1iBp5bu-=$J9r&^8cj2a-^jrtIukZKrac)60EnOG9Ng9^L9IKm*(} z958SO%K4F@A47`zfSNn`$nrXZ^R7vK;u67kprkgWt#lW)w$&Ayzuc|12+waH%Kc>NlH!4h-DP_1%ex#(uA~l$?8{13X*59Sk>>c( zcKg`9$eA2Zyk(jlmNmsIzihvkHH>U)46*F`s(80o?r4o1>VfOMr@8;FM+gQ61e)Me za{y^!26DA2F!-uc{ij*^_SUl^2Mh9)v-)%r^EqhoqbJ_@4=){B>S~{5$r7_A{0|HC z0bK3`ndP^Be19$sYgUS53M2Gz7nYSn$U+9VwgL`*;?yI@3g~(jN5G!Q%M2N=M-sa2 zbrn22uC0hb=sahEjk{Y!rVwQje|0U6;%DySSbceye#ln2c~E!%WlsicFQE%oegX-C zh%T4`QCVsVQCjo}J*2_?q6P8U6uwq1zjsq9ZyB(*m;4|8gdhjC(BR#b3So1xzd_3X zDp)8B5~_?SsJ9fSicD9e{VB%hD$8&C}!ExJPQtPU-paMUoI4%ueeXw&acMu z6?&M~w+=n@ealXPup2F_Z~5U8)LSXi`sv2JfhCcyaJw*VJFg~2Hv9!p1s)9dJ4*bZ|s9$U|#R$=9mtSEk{`MN|Vvo=Ev6#uzE5nPT>?wuiig%r!^7Lx(+H zy;>r`wOfp*mHL_IjJ-!sWK3`TO1ov=AAl~BD{chc$jPC67Ap5N7k7?)hm zp3aYtdM(jU>xc-Y=t*@bir`&&rGe)bHQ$T+uI|o@oOC5h;i$z= z94s_*Xxwitt4;7yqYA}Eg^Sf?*eAH%+-&3)OOJz+5oKl!5bu6U37ly4y`fy~X|$#v z^i7j=Cno2<&utGZ*Y{EmWIl$UuDX8D)zq3rLCqmfCGvjaqSK24h`)U*6-Edis?$LF z&H%PBFFlP=7x8$21(n-_Zus$iJBDS>c!HbM^*?A6YT1GhTWQ0!nQ?Tpom!Ck0bf{ z21RCBMCI*p*!a8{^>@LVhU0lgXaq!{f}5V#)eLf)65>L)yBh~JfhZl!VMhk>MrFf~ zC*H@+OTG3^TPg4!y9T=}#!|uHdWL2AP2&Z*kMOPzPOaF~&)l^JH0gXX+ugejr}wFi z^IMR~U`CilfpSc|8V{BEG7clB<(6{k#{Vhl!9E?zmdrmOEAZV(dkHH`Ycv(kED&WCfYC< zqaVn!6z^|US4zVsplSI6W^XilrPzxiJe+Vl?0wc$kCdah{h?EG&U8t>69%*o-^Sph zhFv4}{IaaX=+?I0Oo+(D)}Wv1w)c*f!AGE{%Wu~-LKoR)sU)_{jqn#Hf+gTE*8+`^Y{>gO~dn0aQ3)LX+UO@C`v!+>7^nSDt#_jR78U zfKARzsRZf=bODsnHWCD0=F{?kZcKpg^Go7+ersW2-VOedtkTXBwY6WLaH_?Gn__5) z_)LD1SnJ%QrW(~H;5)IZMZfn0j5~D~y>u4$TE{YQW#Da%XC0_C@SH)D)^*yL&jPC( zcX>}`3dXb%qJ2E^>sdVXHg}Hb2(WhdzPAv&M!=SKaU)9O90(V}P)ETl19{_QTh`;( zl4BH@xx`7r#lo9HK&i@GCSTP0S8Vf0(eK5}6N~LFMhxSrjJMN2+I`zQKMBHUy04>= z8URREslXIMa6pJMsPIm~@8PCaeb`D*Y68*7>9gqaz9rno;J2(L$Wr;|T*Gm<(27v? z)PoT{_QUp^k)n#auPaHa@YwrwlZ2&1D>Co<(!(Ry^`Gv1SvsL6agk>VsiIw7ZL(f)0KQDydug1G3MHt&|$TNHD>0(f)j%Gn>z1AF<$+9KbAOOIJv?XYTI>0a?M zs0t>2p<#q-sA1D;5T6lJF#WqgxoclcAdyw}bS}kjFBjTN4U*{;+%j`sxHg`u08*L{ zV%nE;0Dk~?^=RhdhrN$LiNKHU62kZ9CwRY@6|bY2Ue#l^iN-&V7}cPMfCyz&w|HzVR`8NTS1*xdq&=%PG*!a8UprCK zNAJY#o$I)I){AQK5~43WiQ<<`6>hxq6aReNAbUQr*18n@>W)#%Q}FJv_Jb8)m6(Y$ z-RL_&F#+&j5$-j&hBHs@Hk>*z;QBj|nAHlX4L6H@19dW`v$1wdZjsamEuu;Pcf1eW zSX}G35v0RPIw&A4gssKB=qaLdx4~6r{7ZM>qon(DrB9!GAd6m=!o@f;3~{osl>CO_ z9mwr7QThj9>$XS+dRr_%RU*_Rb{Iks#waXI4#eO%>NkOW$Si@w7>hX>J+R zR!gYL{J%(h^LQxR@NYQ#zGV*~W#7xbD@*pBvXdy=AST&GWG{qlm3=2+7;8fIh-`yl zk}ZS8knKH3-QD-^dEWQ)KA-pf%Y0ndT-SM>=W%?G?{OU8^BN;hk0uxDx(d>aJ&`9H z3v7fNJHLa8)zcWu+XmkunyAPIkga1)i+(5U1*O3AwT_m<>M88Iw%&7H5`%UP;r9;8 zm~yk#^OfmQpd?7zY=wJk-{&+-kD~4E-|fp;(o#I!K%V_SbBaUGK4hx z;EESsiSGI|BGhK6r23N+zLG?3_kwEdbne>Z(pdT}7dGGCweZ78*F6jPi0B785z+?+ zgN~31S9?MXaWRGY)`yBiKa0jMl+V1B7zRqjS9hq6x({X;Z0xj=W<(OTMpR9hdZXi6lO2+!2t9(*Q z6*C`r%tpYr(vInZD{i$uPAB(~Srj6adYUOI?O}eMuDU-otA40>Qp)3H|2)}uoaRhL z$GBx%AF%xf^E!t3dgLdSrs0ClD|^UNZhWx|6x|XtJhsEGnK(O=k2n{X;IFkd+(;)7 z7bYj~+c`QSe7j6CV#!dghV&ETC+Cu9r{$Z(qu2Ky2t|II;pf`&K#Wm%&7J}ORa|Gr z3&EB59|v?*!%j_!e_i(YaO}A()1>s(BiK@^$NJ&@hBe)6UmwJ2+po>FQo=q=qGgZu zq5qW`?piGjp3e08w~wp|YaO!>+OkSp&@;G^Bc&tiE+JRVtfU^tvyn#LRY_@^`$uRzkmp#5Sgiu*Y5sQ3&O~Y|vV{ zq2$1Z$%|4{hkcu+a=Uk!xQ|n)(VtZ}Yiu*YSxcDvAol&ByVtRbmDHs^!dNpoj-El7 zY|J{P%R{!thPV%nD=?OnAN8nL+5CC)2_g0Ha!XV7nS?j;jr=`8h7IkoJ`I72OU8}I z0~OH75as?`KSXEAwBMMtEb24KlrL4${b5?R0#%c0Qkqj&?G0aR?|TNmE>=Zj=+kc% z6qG9p$()s$y$TE&;pkV3nHQTB`6|nLPiRb-uXY94YT(as{A{$Bo1VPB$Hr3EZFdTT z5}azU;@$&U{_`Y4tgPBkA1+&Y`B#v212cyO3>2k1CPuR?v1ORp7^t zGK}}E^T#i0vky+Q+j1lcaWPaMf=+WyhGoMfe3#`{{BB_8r`KbUias`F57~P!!HAS% z$Sj^(o8x2V)4Gpg*|17USX%a8Mu%@*hXP0nt=!xpO4r7=d`wvo>ro%*cY+&X$V%I) zL>A8p0%*|iKnw1oLKgp!S+E@tYMeGdvfu_zotbPwr<;Cy1CSZtPGi@B6v#W zkA^;#Q$1~ZT9+ry&o@Eeag0oY6{OXHPYQ?Iu#>`;N@6tC#Fvy+kd+Ph9v|9% z{y^bubvi+aF`7V4TU(j4AgH*|{*kv`D#_5lc5jRQY`Bs3c+9is=r|9&&1!yUr)n`A z9xV6eCF?72!m`)L{1F1^ans8(Hl+s_9e*W`cJi+?@+5J0SO>$tAG0mc7#5q>l~-PK zSc|hH?38Mgxb`J;F7H9tK=ViQ|LMM*QQ_CMRu!etL(OjvH*1Hyw8w)k{L1dly_)ex zWF=v@A^vb++y=~Lp3)KXX454YBV1;31x)uvdFKj`5HD+Y$fm4E9@-cCN#xNL^wFEv zY2-BS} zgWgwcT}n3~!wZZPHgDL#D&Ivw9-rhhrt?Zb$@&E`4#r7iw7yUfv$MOk- zhyc3__Cr){9bTeH0&+FeJoO&zqcT`8h$V;Q9*K z^`1?CUhc9;nrP5&z22iFw+sI6 zU5T|SSJO*PhIaxBawHbsd*uC)*Wwwk7gTSQ<`I-k`((3`bov8I5JQg$IdW$V{^d?J z#8X5p+jjE4IBW3v{%c&5P}2R!xJIq-4v+j{Z^tD>M}r#O!d5aG1%?;LM095DZ<{ep z@!gjV8zH~Ow4^+>=HTDMvf5cHUXH4a2OFsFm@RBQObod|u;JU&|gT4zBaa(Tbh z=-b7J)*V6Q4?&xO18<{>i+7d8$*+$3k(~^P^vv=Wwmvp>0?7mAE4_}?9k8vOkfmSc z*PuZk%d=oHc;La0!Hpja1#zdx`TqlY$I!w+^2 z-uuc<@2V%h826Ba=xa&ZZ)-4IwmnaFSAV6RmS%?-{Wdvsvd?ZPtWwj8=SwbC)si~m zqfUC2>H4#oT%DA)_{?WHmBFqg#Q5Cr4oF_d5~J~;dT{-Duo}0QwhP+1;Y=&+TcSs5~=Z_a_{rl-aGOv!+LsRl}dPJ z&?RYOwyy8B_+-%2deW$&Y~xs0!8ZEu3@or*9qA~IQwbJ~L`jtTZYk%D+kD;|pDVkv zgKJ!N%^;#xVWb9O>jE4?1O3O_tlP(lN%+vhJ{QOMt7u7T#CUWy)d`Pa1v~W`T08I4 zs#3*do6b?)ldI^!JbD(`>DIb%Abd4sVz*rz6~!s4Tyd-=Wrzc&F0dq&ON<6>J!1!P z*;AIfg}nbzs(i^Y=pKKONVr@_HWFGzf~7 zU(-RFx>Cr7dp*+0TXT~?(IS@{X<#$CIV7&8b%jm$*T1zYQzQOdf0i*%>X26wG9R#oe{!&R zxH4MF*E;)-ZC3VL=fu3{^~?YkhsAUpP)D20$L-1w#UB;@nvEmXWGzb9LH;nIMT)!Q zq2?^FMw4&PV=lY3F-s{3G>!i;JC9yZZa2BgfoL9mkShNr#Mh~;kC{|piu52nFj_ft`_UbUeF@=X{J0a z|Eb1??Oo+RT7VrWQ|qy&=tfK>F)GwhH0sIz(Q^-ah{hfA7m1mnMMe!|n90ctPlx*( zH1cm+T{dIl#2V+>GTEdXCcAs)WBoKL*In7bPMH$cCXeCzxjuKHuGF+0DOQE7>*X@w zEF^CMGaEWY3e-WKN}bIsrZfnFFQJDS%=l1|W5Y2dy6+(MM)`A;j(*g_V6SMl>}9Ln zDr0BI&>$%z>$Ud?t#1b9@-r+XxiPfdob-rjmTU^kS52>32StR7nej6mVS%63>o~`u z^Y7MthhSF?O4{q*M|gbIwG>n4zx&X~e`10*9W>DfVcNE&lBXA=E=fieZ7uQqh+u6&$wAJJP_y@ z3=i#9_5Kcn#7$js`{9tmk4={qohdZrsI9MBe!4#DyKy&MZhk>6uU!ZSt>)wUJ(U!3 zLOMB|73PH|6Xnh|_Uv|vIL^3L{iS4mhvhOb%Q}@V6Xqe9E9&*-PW!o*(cI;lb*vmJUK4kpz}LigeQToAnrN0%G(p)6_<5#v-kQ zjV!NI)rTj;louZ>nufLPX}|X>?1OY$Q$`o_B1?X`Qa3N^a;jg3u#djx{Nj9>xF;=B zj?2wouwzza{$0a_EvDEXhTv^e|&AJbre9EKF`>1DwYGJvYNTj|mn%ck=?s?^_Q#_O1MuHy5{ zuf^>mL{Gqnzq`pjO5B$+3lb&hP{EPaR`D@GZqg?);K(MhMRFR~&J?~2y~ZK!+%WjY zLQo6RCeeNz`va4gBId~kb;MbpW^^)T27YBN=M8A4U0+?!=@tnYgAf;Nhi#Lc6k&uE zzB#=$MTe6>#@yH=r^fV4<^9vR)uB-NvF{!WhxV1v>sXuCxO~=Q_ zrJX*C_@pL6>KIeI5R^XIK+BNNPM1In>`T%ApgP&oEX)B96Y*h3nx;w^=F?;~S#xMG zBwV_#__Eg|!&35&7CMp!p?#MP6WlSrz2E%>R&9)rA$7MZo)xN9mV=)^1I=4n_KXe=ZI2p88wiIe- z|ETro;Ky}vJw|*)!NyR*`S|HXllA$QV2Od;Va5cx-<)R4_1mq5ea1qxsE|PHce*qyjhg zYPdv){VzTt*VR4w$Rx-vg`;2K!Pq3=W}4AiRBi#E!*9^uDAZwQd}L|PiPR2i!dLJoJ*IHIud16l`$pPu(CLRoJbZ6L^RP!kmoM_=!17k`lo?Hy#oT7vwJ&OE0Zec z?6$PZ>gy_*_KJ!%Zefe`&uJi~lY<2WEXXIGIpmxo!I=?T-{x~@e=%QS(W0KkobXR@ zdYXCpVxTuEVag>ewP6EqZV~~;a;U1dhhy$1$(knIQEdH;XZ1WazE8>4CBtao!WhZw zKXl~yPb{!!vS)*OYMAB}rQza3TT=FX^W#er2Z_=02^LCwqf7YRMNYG(CpxkH(xvA3)Q zeFU@*`?_ZPmULs>ijUxz+0xpN>jro1bl_P&r?d^QuC8uT^2UWDaOImL{J;W&#TKE3m>t}7cZs$-IMGwIgSexIzKt3bsIErcG$L!ya zeFB;DQPMFq+$zXOwG<0N*k8wpCZnR6;EJjk>R~$K9 zuy5F>GObYHP>|T=V$`QH7dM15J~^F^b!8Fd+oq+9A$9*%!XkRp;ast&P&_mk9Zx2w zFs^1MG4*U`zM9{oIapu8DUajek+79y2duorsOLCQU5=VzvDe>iV!DtY*nELU!rvwtJv$T;1E^2bR^spjl5GxYEny{f@a)adoeFMZ(R z{Kw$5J{8JScdE*}4_hnx{CF_aPyGX4sLlmx{m46uI(L}v=A(_!YHtN5ylj~cqP(r% z3V62vy!}?XvJX7zqrO}fW+=^$oZ!kB` zo6tDzsdwZQ{xXzpU46DeEVLZ)RSa9*P^@tlp=3RO%qyg)V4q2WYBZLa5K3GgT^!SU zO#=Jg_X9Cp$2L^po#c7aXgkHI`y;R79ZS6WR+xTnw?cYnyqSEy$3JC z30W2GRX>>Prl6kBmeR8o=fExwhqT-T)ev7v7eeFIHUIAMv084cNq3VRjn({dcjzmt zELw(4ZI>!VtE03w0Rur~&O`JihN|0}%v+nquU%MKSwo-rmM#r^nAgiS(oi%L#(2l8 z^tEY^dXXUVo=@;&f>-Mjy-$R~0y4I^)ZQeLqiJXf1&(d4jvnKp)n1=Q+6wa{g(oW% zHE}R+ss+~hW{ba6R-tqsX{fQ9qHfg-gav%%*qsowod)&4w-`3nqp#*Y$9Es-iO+%R zp4o6i=gV(XGNw(%gKY|LLIdV|7x*+@STFBtOXN8l`H?)v*jfd~$hpX_>bO!!!xB>|;-q|Xk<~V$G+(3h^LBf=8T5D`RRz3?h^^V3`vw;WG*X6{H{TQ$Zd8s%-OcW z#RRA(ERmR#AU3a-p`P3^C&cvKV<+9_dVJV6QyQH1y$^Zu;31>0e8?#aJwn1vj=}_&>5#YOxaiwTiqsY=U}&=v0vAo&TX>Hi<}J%ADb2YYA-zsb zURktTKNpwS;1_@UmYR+JHSan^)?RW}@#@Bp$oYYRToGsC*quk9d;K>fo< z+OkAGes!5(QMhf^S(V`&iLy;^>U>u&_||wVl6Jt$IRP%InT{G_g?jc_Ig7-7WO!&CLfT;Q zpN|)!Eqwdv&ZW41yDj#0jVJoNhK*kH4MZ725rRH67iA@q#~d*fy~@lTSp6a9!;S4* zO!Gb>eL`1Y{g=)oHnbAp-6(2$`)F zo-;xQm@g|0B7;9Ko^1$lsilXI$kaZlSE;0*!%LY|zyncH`kJ=U@}^E-^-bv7Wzlm9 z)ACi)XK55iQ2$=bWXM;#Uk}_PqqnH7H1#@SB$U2>Z9H7#O3g`OXjfD$m)pB2|8)EF zw}sjRV*`G{8=~9Ljo>49slwp{;>~7xLQrK26~lPKTAM7`ce%pgJ7tOXzaBM8U;hk~ zA=lU8h6R+=rU-1@7B>em5{f#@k3q@FiQu0Uj~TOUuhWtr0do16{qisJN^tyy@Tb@7+(wjPt*H;Y#TgGik_t+cL67#wLDeyHRBNVI-a7C(6;I>G(r ztDBv-rTl%>pt9iU(e4j!np&{79h2|8F^?3sN_Fj!L7S$Bdsl2g;P&EHRo=cGRiS^% zj3j6(V$&L8G(kvI%DWdJlRaM@g6Z@-3P2c;vttNfv?+)cJ=ZzyvF%3O(|==?(Y!QA zx}KHCGmNYu@!39(nMg67zxBg(D4~Ljs3cSV$Xc#sO&1eY^vZtrKGP4o!>s42+Dfyb zn7fLp$&y?_bJi}#ze0YDxXSg>?|5OlE;9*pFFgHPlkG#Z#?E9?@Tnrl%@5OVIXPXSrlA?X2=yVC_=Z zDZ#l8F%Jt|YyYEQ&Z+1WlgC?&B5Y{ohkas9Z^a|LkmGU_cDaY7SsqfY8$WdutnYcP zDVbr^zW5JE+^lu&OgAz8hM|^=S=e${xm*OkWku|BNcp(!Yh`>xTuzn`Ge zN2v3bor2r$r>3u0DG2OY;o;8i=2j6XCoQfKf79)} z2Z@efs8qKOl%;FQW7rE&0sM{jWZQwgFOGS2e>98poMRM@2~Lr;YkGHhncUnc(o1N?p5RlSwj91%441I^1 z2O$0>u`=q!NYZXJ0k7pk8EC0^A;b2B0gmtGb>ZsVYgL~Ly~#Y>$+h*lItcstv$9V{ zU3_{=-P$kDP$c-GGQ^nI0`@LYUAC26d|R01I`qwNLHI^KTUWBP`csth)DO{=n2$SF z&IK%9yICte^PNewa_Y&JE>#achU~Xst4Ky9ntVZOxG2TE!lh7n?;X`;&S4Y^%Kh5S zq$HE!)JRLVi84FR)@;~t6mqwDSFF?|t{aqLQcnObr1=ec|JwIn(C(ACd9dYs-=q)c zASv98kARy`5~&j4T587)-Y7NBnqyk`#H5f(J) zO=$=y)X$KLX;)GhnV)S_X=s4q$b*Lplk=_m zGU)gaCrF5}?lCSm=xMfmeiNp3%1&kZCiGBtkg&f6*Ay_u)6x9$Kv1SQo_shU47%I! zB+8N{(9L$m?50)nBP;7%uc;QJgy-AikBVmp4P6_O3kRA3k$uoQ@+u?O8gND1{NR!# zz++FQ>V)PBTCoJSO;TfLaP_4<3Bozhzep6k>^69B79P3(tmF9eWqRag&|p?7dwRXs zBY26UF8IhCK8z)=GArzSfI#jB21k$r{`jS8z0cTGy@>>nSg79kw6*+$FkE!kg2w7J zDYmm4qDwDu?PicB@}!4-jZstvaN5&N#x+F&Z-f@Ib<5Egk#xlS`0yQc{CwVXb|*+; zBBOvpFY?4{i%~0UplQ?+2h41Ca3IJAZYxo?T?eXnb`2$m;aX`^@gGL6^oY9PxDdB& za1^dk;X#0iUG#4r@v%Aa8M-V4gTH zad9<26fUwMD{K?7T^m{K<(2H6sNwDf*$X27rj-gP3kiZMsFty?E@z{kUP;nDHe_xb zFZ1fqS5|$&7ksV$@nN`Hm)hNuq^nUO6de zo^?>JL+ho))R6@%c@M-1%~VXbm^UfaIgACxSH0@U@fYRpB15&G#_x+1$|Nqv^q1^| z@FNqz{{DbnP^MlBE`O|vyf`w26FYd-Sl|#C7!||qXV1Aivx{2r(Y>*XxRrw+wSrSR zf<_j|`dT!xX;E)7KL=JepcJgiYHkWKKei}(VOfHzWFrbctUuEX+zIr5-~*HpN?HNu z-mztXXq0li;?1(PBUwv`Q1FwJ(p8LINr6;}CL%zQ+VP}A{CboiGunw=2cN|GVQJHZMyAnrt zb+ysaeVP21cHXFLJ0^(8H5nAD`{_*=W3#=s+s>WCmQEE4!71%6y){=v*=AAOhjo}} zu&T~XkT0u^%KofL?LotD?5-SLR_a3rFO*(Ler^pMVzt@>xUzih+w(l8czV3Z%3a62 zH3onhDCOfqN)U+rSRu@D7a*8@F?m*|iG2a5ZfoXYmTR3U=mI)O+J>IwY`hi=7d`lB zwz+U4`9;Q>PY?qC=EUj7HOHRZ>40m`GU*xJH{I=^}UTqePA zTp)4LuuXgCaB~jAV{S3JUEq&EWXx-G{!Pd8!lVVZ+h) z1C1rVXJ8XLcY_+%%l#^S+wEsX`VBa!?SE!N7=NyM?;yz~+P<@sVPdM@Czd98t<1o%D)^$w|h@kK8aKQ2p_}TO;AJq8u!Zc8?DnUx%PR^>WKo8 z-dC&JrxzHBXZiz4#UZaVU&0(XB+`;DPyqhH10QY=whJ$PhwiZM3RY#hq+T8@LW@}B)^*c1;@tojfN zSCSLMv|u}}bKO{>0w_T9auh&>tnK@2rG0<*d!Ii?39r}vN$PsN(h{Up@{hfoPJc)fyWTQ6#9KmOT< zV83o5t;6|plu5DaCP*G;XAH3OjFlhU^Sa*_Q6joIeTn=EsJr15451>f2j5Vn+%2*_b52cwm z^08-8LqUJwmRjqb2n{bAz6rZfFFNFsVbr0G!5~!S2Lk?nH7_;TRLU#^YXM*-5Rdnu>f?g8(gQ|L?q9od2)Y>@>O2RBpt z2D@si&O(*tm1x?h(${p2bwl}qZaBPQlQqZuA?OW7PLzLgrUvP-&C07rzwqM$W~SxV zbB;e`>d5kF_MGo_+%BqYn4Q~deuED!xwfC!cB^Ka$cv$L)mr$$j6@Eya=Y(ObIomV zC|3RIC%Y6pr?S{2j&T;-9qV(!bNs?TzRyV#2nG9778*z4hn&j#N)k>&xyGH$6SRF1 z<~bYj5&GkU-uX)Z^j7-^vuWzHkm#K>N;$!IxJ^I>N~Et``qiiv5pV278pPPJPlD~_ zG;pqYB3tjpQn*gUB7^m>GG0VTB>=M?HVi!zMg`MZm_9LeY7T<_+VO9C3|ETv&kNu> z>zf3G2gs-Mqn=(If?3vlr>${O$-Zsir#G(X=uDJo2tHh#UqP1vPR%YwghQb*4H^nd zsB->JP!^b6h=VtHisdZ3g4t^|`zd>T=2B0lDk#zVPv*n!8OHx`Q^g1Mukbs3ra(}H z2)!B1V1bo-)S(t9D~Sy3=>edyZPQ2f6gfb> zDf*_6#n9Ay*?|_(=u>)u=d2Smn|H3P@8RJS!Hi`Zgzwgw;>bOHmKdS0_lR~?Y{a3# z<5j5yafkXQbWiB};+TKEU-U7IR6O|u+qHEHC`Wy8z3BQ7GbR<=K)ONz!%3#t-d=QA zdoGU(KFU~?zFiVt?Vr|br<{6SOuE&|O7tQf9zuqnMaAABDA03WOn!6EI1~(d7~8r6 zLvBKPh&!TwLPcd96F<4D`4HR0HnEIX;LN>D7PmtF>5~5R%9BOoV+Q2!ss4seX5ln` z`vVI`b@R(G*T*q`utXz_ZMZE#1474Woe^`nU=YW`w}$7u;`tt*aQH-(RGZ8*aASc# zbES@K^_aFI*O}#iU^&a0kXo~0(0O5{LMB{p9Y$8u>767Nt z4VY}^h+V>(1n#5mze$fVa*oDZVsY+pF-X+T+;u|gx*aX>Bk8vcqD|qlRe1N>J(&r)5 z)-YU>*E}P&)*Ndn7yb?G+krBzs zaTe^bww4H5vH$xm2%#nQUh2XS_K6h0+!#9)K%?51(0cRQ6VF0E)(&OR-rph1CLZniY#IPJKt(vHYO8t1 z5(hlu$$u9c@C>;kZ#?dUTXt;FFJ73v>@})0RKV&u(C+D2V8X6cSs$=WdCKYp09?kW zGFZeBA;GEw?ggoH)adreKcjQF_PV*t&zMFXtl;m+49w}c(54{RR~!rudLG-p*G~wf z@{;|LwRKaSqz7;=BI+G3T41SJe=IdJ z!>et=jB?XzjoAFTh2_lczW5mEl>N2nEj>u?x$A@-)-i*B6?(TL4Jb;G>IfIC)8@5z z@D$l8m+VL{Xwoi5AajIP7M|d^N&ycE+T3n#GY2quJpwD$nR{}}zP&|P*6O!TDway0gu0x^l)m#Ms)cd#*4;9Gob|nZj*4^qe}zKAdpEKTuAWaXyOJy z0c9N)XvW3IymvKQxe7cLqe?VbM@tN-avHWba0~pVeL{5tfVhA|n+5-d24I_PM;iZe zI}jh%VYLbHBf&qX>Fq`V4X^COXaCdt&m!bSB8#5cnTC?nEDgv+N7`9Xwf`R`0FD-) zW@C>Q{l6X!P0tzN1v6av~90NH~e zi;Gq(X`=MstSuv!pZX#kpZVTo)wZA%Z);#VMgNc3d=Qyoa`n;4=s8vy?p8W=Uzvmp zWjr*9DiS6aQOBL}lW5yZXi669C3Tb`KGZ$S*E2Jmp-rCXbIEnp{o^yXLV|wFd!`yW zvy0IGfbsI(#>T7fU(h0U0@AiO)vC^Qw5&)F0&mE%1@70=@z5oW<8zMJXED*F67jdZ zYHd03Z!R?xs1`< zU2dZV=L`RPJ{F+HA4wb5nKHyVd|{HZyA81Mt20(3HoTd=HXOnOqL4KhxI){XD1?tm ze#!va&p2t1C5B)eI5jSFj$QjH~=C9MUv(u54Qm{61 zp9c?YhPC8aXFv21a9L@8d;iWU`&0i@n&CILjRMkc`ZNh4OtX};*ZY>HOjaMIVKqGe zLKC;m=#{S~01*?oVe3TbA%5R#-+@|~%L9@e3d!^lPU#Ekk1@c(T}yVK)=-M_ zDxp$@%)LYWVLy`6I43b7ta~@HYKuCKh?9wnk3~Wj?Au|5EY!_`g|Bk+?pemIg0III zy^bfVgFAgI3HC<9=*iMvE{q031^>+(4JWW^qm#tZOMf%zA#9J1iwK{wNE~>&w5X{% zkqf*_H-!n(<}E?nq2f?Exf_^lD;M>dgb(%Jfx(#q>{bDyLJ~B)8dP~XX+^$7{Gtwn z^GODOCpLxf>CXPmtqz6s1{>O!4isRyx?0^o8`&3-Blsz#WZjb*0ePmig#P&=nsV^Y zr_Y9m)a&}h(trI-!i6UyZNxi{HC#jR*~!i`&ARyI=~(lq=4GiK{nd_R(?}7~+o_XJ zf~n9V1GnQ=iizd__ud!ek;=4?RSl(W;NjJmUE^0^%a87`_NIk4Cfm#U80io&9bX#o zx(Nwyl5f=`o@Z9n=10U{}taME~TDX0-hkz%{y(+aDyq(%OZuZmbr{;milEx zndC*HGC+sxrK#gcgQcrl^3k-@T_@DY_G!nCKE;Ra{n~w071tRGvH`XZ@hbJ>O-H!$ zT>7R!1{=%Guo_>p-vh@h^cL!X9z27j*3fGGy$N$+pQ!1R_MBYo{WSD*Ivi=gEgsTW z@yRyVeifK3XNY4RQzg55Fk7C|bbjz&4>@dG6Eyilk#qD< z*9YDg--I-9D%u2JNA_eW}&L zO0>P@j$W7)aECMZ#K;g4qk$m!#cVVtjT%w+@<{O>1K}cvFibqPQzw;=+9vg*I(S0R ztsV?eh#y|oSJQcLC*iRM=sZR>z58%nu}BwnY7I9o8dkZT^74?D=3=;~VwT~nSDdhU z8>Dbo=SiN~ccsfi&r{?^h-=&ym6R*t#b9HXUYvm{Zf;=}cR%f8&_RO-w=AY!9#g#KCEi&hK;V z+>>kMlrMYSwpnA}tCWx6g^8*Jmb!kSP0+r! z@5$-3%6h5I6fWn3sN*#BgyGffo-HP}ISptWCKJyzM~EMZK?=`T{w*J|rFqX3q%dwQ zKicq+bOD2g7XW>^!ovd{&hKoxGY&e5FDx>GO{9TQV8H-zns3aTul4zzLBG5DY^MRB zrDs zO%w~y@&92P{it(Ly(L1O+dlyzW>X$W)B(X2!VNC`FRp{FNdQAACzmF$_kpGT=MZ)X zETXIDtb;wm0Y`rPn?3*M+p@}OxtSawp4y#__TP(wIP__0`E20nNSh<%oJ6tsi|%(3 zy~v>@FDdfIL|CH_KUB~3@tfZjMG4{W*GQlJ4h>$*CKbGYHQvTD-%HJ?YT22eFyH(0 zWR-Xi4jM_oEhxERj7l&idIT}oA_`Op*e)8)#TT#L61`v&2&F}+fQi*6jWB_5ovBgy zqqTdIpX*v|y(VBx?h?6*j}e00dy@X2BquEDj0Lh#V;3m;;2HKFLzl7l&?of>H!Hiq zd7L8MW>Z^*mzwExy>o*D=E(tb?IysQWL?$MGhRM(QrTzd@UD^(=OU{>}rk&t31P--Z0UL8+$m5AK(U zpVhtO8E&P0c+mYMk1e_~Lnw~fsN!v1CQzy1*`#V>^BRO6q)i5*8`0kk|YYGH-W2&xwr&(e8Y-GC20TQi!tWg;HsurxKNxj)7) zuV2pZ2vpAwORQ(ly~oK39?S3=C$BPOf|ElF{2-gs&V{%4$7xFIHJ_)6r`w;OkCOWN zVfFG=2H{$cD{Ap1vp@F4%CJsOjCvlT|}67dmP)j@{q#VXapkaf9ZE zT){VAQOlhPmejyn2Y}xSc}V`tgkW!4gv9IZ$Sh+TV^l|KfgUb30;|q0zd_Hqtoo{vN-vxR0;AkBSit*R z&pdc1+<@cSO4dGX+4X?q%mMJ+vNMTDHy;#JyhHHeqGyziu0l7po#X6NO zaZM*PW*YX=)tabdHr!2D(!_*r%j8&s*k-$sS`OI5t7vWyEu8Q}-CpzR{gFt^N_-|1CuP^)uiLqz>pP}V{K=gM6_!sQ{Kiw+824YJ;gA?y&KVdkZz03px z!cd8~0R)d5TTtOx10Mu6m3ZSaJn`Qt&(eeHtU%uaEy#yJ$>~8m+sjX9lW>U^ys5D2 z9!U?+tyz0nPnt0)f+oXOFG(Hs5x%p>WD|WEMwo|9coK2{6btd8y2>A}`MmMSEtlV< z1~d8UI&Bl!dN84KKOFp~+pZAJ{$>eU`nbTrVhWMR<0-)gO32 z*?v|M-~hqt9EC0&9Gl@=VRN5;`@4TRvFcZ_Z(+dpLMT@c`TOlN_&ZPw>n&lSF106Y>$b;-_<@Ki-pW;(4BjP&vu(U#RR3<{ zeH)w|F5o!&#Se^NKa$%+;jD`Id-KshOLJCQ`cLfpe_YKy9!Og7q^_Ps=Mr6Ht&`P_ zPt7+)vt{^>7S3Fd{C^3kf8n`W2?)xff2>nTexDT)e)D})kOW$u4JP%&XZ=bX&D+$t z4d1jW8H=U?SAo6y{(tXR<|!zUd3z^KbNsIFcH=P?t)07e&G0)m`-X(Ig&mekNFKFb z7pzxAp7_9a0zgqFix@p6>e4#jh-fbq0)>G%>3??=*Uv=7rGshD>5Tg#E~95!E(CsF3~T9{c)25`1D3kyC*hp9`50`ezO z_Ab%#>IS4R$m6|hBaM_e?cKb6?d9GZU}ND`5c()eLzV4RGjpk%R@Ce*?#gI_&0ILP zE{hB%fX5!DmSqrAl75^Zkh;I@-S{k60?(dPIw{#7cK}&wc38wAe zJ^jDh`|7ADyKjF`Qc6;!8>Er$ZUpHZTBJj|Lqb}l1q7sPL~!Wt?(Ps!8kDa447|qs zUHA9rZ>_uTx~%!I2@M$$U z1|t(<)*;mRwrafDn~6kXeFTXIT*yvF!*Ck{Ei^-^gt{D1Mfp3@VEp(w)V{ABG;7R6 zN>OejMdQK7E(ww3u3iM5&^HSThpj9^9-MMk$!E+ve>1%-^FWW7w5;fN+cHrrz>jRM zpJm_!2#xWG;#7_lGY4l@OZ!PNNz7Y;ZYsU2ki*c32b7$RKq(OwkXP=u6ycf4S|q`F zY-R6SJ8!w4Ph5wi(ofY9+Xn=9 zhAu4}8tM*L1p-05yHGWzAc`Ee^NInOC+7L>;uFngV=kk{QFHsH#fpm)U!lHXo5QJQ))WC@G@yni34F!hSo$jq;8s@vfv95oSW>ow zy|X6(%=P(`#z98M3WJ@#9gWVkO2#7NZMUw)0X87!wsc*R5g>VdBSk`-Lv+UdQ;_jj zF2M2?|9YMsl$!jl-|kidzJ-SCoDlw!WNytf(M1C7!53tpr7eh(TyZ8RNt9~lSI%x%z|Adn3|N7{U$HXjW@7fCU-FGJX%VfbtQM4hD z<83bh*EF|jwA-U#h|dcCjsVA!{-iDHmaH7cVi=8n(D~2C0!nlV;AG0BCV^Nf z;6}KqQ{18@PoQ3OAxnc%#}aS%qYmyP5+(>-1q6V7_yL}H3JCqWxJ|#2+0|2QMf*g-oOdxy~O;#~iDHtH%PmcNVz1OBa^oP_PMb%cT^ zqC1HAODxo1RPm@IemlJTOyS=v2w-W$ZXe$L#`rVPDiUCJ{9DkHv^qhEb@VZ}97jFt((bGK zp}yM7L)KxGppPYSgu|RbP7U(z>_egSCFT(O6u-ly5)UBS#81hm8u1L!xE0iH*k-_whAG0b zhEga$fU+9JN?2cJRFOj;XKwlLSPZUCA3Lt5S=VQ--m%|q&xf~>7neXOzCc>O->6kc zDb)e+dHs#i?-4|Op)7lME-7`M!hy#E0)#{8IbwQhz-_V+f3Qu^jw z4kmpGNFC$ttAcVahs2=qi4Bko`3+CWhF4D{GY_-xHH6H{JPeGFt}{j=P=;u{9t z9Lo{`$mk9~q|_?*#HTI>n+*q5imQ7x+uyO792jphFF!yC9BcFAJXyg4_%J8(Dy0Cn zvs40F8up22DdGMFxJ>MT+ni;EWz$~-iF z`A-zi`;EeO53~h`{sY(gQRbZY`->PQJc(33l<8BB+!T-2;ZK5;qM99__#%O>D1jW< zD+81OfHrr;!5?4au`H&k>Ro>LD=LUZC&2xiY`~sd{GA1IN>a$)=6@JjZpe`j=*!zS z9!8AhRTmG#rqp8qynm8e40nPIg*SBPKjiH)eGwdikuw_Eau9qMkthZYb${nF{3jp@ zurokGeAP#DNqg4}Yv+TP?uoO0oQv>F8zsiu02#%;J0lvrWD7Lyn2HR$_n}b9{)GJA zXNELrb@_8>pc+J|C|r#|W+93+r+7ryJRc0%YWJG)d|$o4)ZoBMf;HN4d|P%8IPD%0 zW*NAutuDb%9D->p% zx2PpECPl1-0|^P@Lq?iVEIJ>;3{5@)cGAiH&JwMvG1Nr)$l$}z%z(=RWJY0P>i0%g z#U!&5&bJVLGyTZHZVf~#-yh>VL{c#Sfi3o^p6-h?R~-iSg$qTMm0IXsV+~hQW3<{D zc<8u?{&8G@9pnonN1hq|&K-e^NWWya^{+FuB3d>^1oj?+MUSUnBg@qVhx2u zTG9#-KqFjPZEqj@?cf$B>^lX;w`?MhvQjvw?C0+OPU3N>2j+LER7drIY^( zkRe*<%$swxMD3dc&C3~UG51&irhF0iS5^{OVa-097si10M6^YEg(mWsN19;OiceaG zT3Z9T{Z+#MVQQ?nbw4|lpN5NEtS1{5Mqp$X1-eKAqPO~6Mg96^LV*k}KnrpE6Qe&( zpMHTzZzRp_uqAypwtt0Jp`WtQj~F+mI-D4x{_Dp;C+qf0?7Nb<_y1!|a3>!rn2viN zyOMU?!Jl7K3rNy@hPTw1i>Fx#&q-2as^tk zV6Eo$x4!(5m!YQh#-8i9d-2Z-*2CDh)93>X(x5a~$Y|(aLC(A*RhGKf4f8sg6+UF=iI~9UR|3CmcyfFG@zw-ZfXsIyqnKd+;#`B4)W`uN9p!GUa2>Jv ziilI=R(E?0nRe7zII^)i7Y$YXN`jfS#)^{Wa>^VYVoXA{T|WKo6yDMGHL%USFCW
+Zcfnk7*+#k#GAj!N8vQQlAP2 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 diff --git a/docs/use_cases/scf_to_cps/by_income_decile_comparisons.png b/docs/use_cases/scf_to_cps/by_income_decile_comparisons.png deleted file mode 100644 index 9adb8d1d6c4565e266f8505d6f026f7b38564b0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55602 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 diff --git a/docs/use_cases/scf_to_cps/imputing-from-scf-to-cps.md b/docs/use_cases/scf_to_cps/imputing-from-scf-to-cps.md deleted file mode 100644 index 18e09c7..0000000 --- a/docs/use_cases/scf_to_cps/imputing-from-scf-to-cps.md +++ /dev/null @@ -1,924 +0,0 @@ -# Example: imputing wealth from the SCF to the CPS - -This notebook demonstrates a full pipeline powered by the `microimpute` package and specifically the `autoimpute` function used to impute wealth variables from the Survey of Consumer Finances to the Current Population Survey. - -The Survey of Consumer Finances (SCF) is a triennial survey conducted by the Federal Reserve that collects detailed information on U.S. families' balance sheets, income, and demographic characteristics, with a special focus on wealth measures. The Current Population Survey (CPS) is a monthly survey conducted by the Census Bureau that provides comprehensive data on the labor force, employment, unemployment, and demographic characteristics, but lacks detailed wealth information. - -By using `microimpute`, wealth information can be transfered from the SCF to the CPS, enabling economic analyses that require both detailed labor market and wealth data. - -```python -import io -import logging -import zipfile -from typing import List, Optional, Union - -import numpy as np -import pandas as pd -import requests -import plotly.graph_objects as go -from plotly.subplots import make_subplots -from pydantic import validate_call -from tqdm import tqdm -import warnings - -from microimpute.config import ( - VALIDATE_CONFIG, VALID_YEARS, PLOT_CONFIG -) -from microimpute.comparisons import * -from microimpute.visualizations import * -from microimpute.utils.data import preprocess_data - -logger = logging.getLogger(__name__) -``` - -## Loading and preparing the SCF and CPS datasets - -The first step in the imputation process involves acquiring and harmonizing the two datasets. Extracting data from the SCF and the CPS, and then processing it to ensure the variables are compatible for imputation are crucial pre-processing steps for successful imputation. This involves identifying predictor variables that exist in both data sets and can meaningfully predict wealth, as well as ensuring they are named and encoded identically. - -```python -@validate_call(config=VALIDATE_CONFIG) -def scf_url(year: int, VALID_YEARS: List[int] = VALID_YEARS) -> str: - """Return the URL of the SCF summary microdata zip file for a year. - - Args: - year: Year of SCF summary microdata to retrieve. - - Returns: - URL of summary microdata zip file for the given year. - - Raises: - ValueError: If the year is not in VALID_YEARS. - """ - logger.debug(f"Generating SCF URL for year {year}") - - if year not in VALID_YEARS: - logger.error( - f"Invalid SCF year: {year}. Valid years are {VALID_YEARS}" - ) - raise ValueError( - f"The SCF is not available for {year}. Valid years are {VALID_YEARS}" - ) - - url = f"https://www.federalreserve.gov/econres/files/scfp{year}s.zip" - logger.debug(f"Generated URL: {url}") - return url - - -@validate_call(config=VALIDATE_CONFIG) -def load_scf( - years: Optional[Union[int, List[int]]] = VALID_YEARS, - columns: Optional[List[str]] = None, -) -> pd.DataFrame: - """Load Survey of Consumer Finances data for specified years and columns. - - Args: - years: Year or list of years to load data for. - columns: List of column names to load. - - Returns: - DataFrame containing the requested data. - - Raises: - ValueError: If no Stata files are found in the downloaded zip - or invalid parameters - RuntimeError: If there's a network error or a problem processing - the downloaded data - """ - - logger.info(f"Loading SCF data with years={years}") - - try: - # Identify years for download - if years is None: - years = VALID_YEARS - logger.warning(f"Using default years: {years}") - - if isinstance(years, int): - years = [years] - - # Validate all years are valid - invalid_years = [year for year in years if year not in VALID_YEARS] - if invalid_years: - logger.error(f"Invalid years specified: {invalid_years}") - raise ValueError( - f"Invalid years: {invalid_years}. Valid years are {VALID_YEARS}" - ) - - all_data: List[pd.DataFrame] = [] - - for year in tqdm(years): - logger.info(f"Processing data for year {year}") - try: - # Download zip file - logger.debug(f"Downloading SCF data for year {year}") - url = scf_url(year) - try: - response = requests.get(url, timeout=60) - response.raise_for_status() # Raise an error for bad responses - except requests.exceptions.RequestException as e: - logger.error( - f"Network error downloading SCF data for year {year}: {str(e)}" - ) - raise RuntimeError( - f"Failed to download SCF data for year {year}" - ) from e - - # Process zip file - try: - logger.debug("Creating zipfile from downloaded content") - z = zipfile.ZipFile(io.BytesIO(response.content)) - - # Find the .dta file in the zip - dta_files: List[str] = [ - f for f in z.namelist() if f.endswith(".dta") - ] - if not dta_files: - logger.error( - f"No Stata files found in zip for year {year}" - ) - raise ValueError( - f"No Stata files found in zip for year {year}" - ) - - logger.debug(f"Found Stata files: {dta_files}") - - # Read the Stata file - try: - logger.debug(f"Reading Stata file: {dta_files[0]}") - with z.open(dta_files[0]) as f: - df = pd.read_stata( - io.BytesIO(f.read()), columns=columns - ) - logger.debug( - f"Read DataFrame with shape {df.shape}" - ) - - # Ensure 'wgt' is included - if ( - columns is not None - and "wgt" not in df.columns - and "wgt" not in columns - ): - logger.debug("Re-reading with 'wgt' column added") - # Re-read to include weights - with z.open(dta_files[0]) as f: - cols_with_weight: List[str] = list( - set(columns) | {"wgt"} - ) - df = pd.read_stata( - io.BytesIO(f.read()), - columns=cols_with_weight, - ) - logger.debug( - f"Re-read DataFrame with shape {df.shape}" - ) - except Exception as e: - logger.error( - f"Error reading Stata file for year {year}: {str(e)}" - ) - raise RuntimeError( - f"Failed to process Stata file for year {year}" - ) from e - - except zipfile.BadZipFile as e: - logger.error(f"Bad zip file for year {year}: {str(e)}") - raise RuntimeError( - f"Downloaded zip file is corrupt for year {year}" - ) from e - - # Add year column - df["year"] = year - logger.info( - f"Successfully processed data for year {year}, shape: {df.shape}" - ) - all_data.append(df) - - except Exception as e: - logger.error(f"Error processing year {year}: {str(e)}") - raise - - # Combine all years - logger.debug(f"Combining data from {len(all_data)} years") - if len(all_data) > 1: - result = pd.concat(all_data) - logger.info( - f"Combined data from {len(years)} years, final shape: {result.shape}" - ) - return result - else: - logger.info( - f"Returning data for single year, shape: {all_data[0].shape}" - ) - return all_data[0] - - except Exception as e: - logger.error(f"Error in _load: {str(e)}") - raise - -scf = load_scf(2022) - -# Create mapping from desired variable names to SCF column names -scf_variable_mapping = { - "hhsex": "is_female", # sex (is female yes/no) (hhsex) - "age": "age", # age of respondent (age) - "race": "race", # race of respondent (race) - "kids": "own_children_in_household", # number of children in household (kids) - "wageinc": "employment_income", # income from wages and salaries (wageinc) - "bussefarminc": "farm_self_employment_income", # income from business, self-employment or farm (bussefarminc) - "intdivinc": "interest_dividend_income", # income from interest and dividends (intdivinc) - "ssretinc": "pension_income", # income from social security and retirement accounts (ssretinc) -} - -original_columns = list(scf_variable_mapping.keys()) + ["networth", "wgt"] -scf_df = pd.DataFrame({col: scf[col] for col in original_columns}) -scf_data = scf_df.rename(columns=scf_variable_mapping) - -# Convert hhsex to is_female (hhsex: 1=male, 2=female -> is_female: 0=male, 1=female) -scf_data["is_female"] = (scf_data["is_female"] == 2).astype(int) - -predictors = [ - "is_female", # sex of head of household - "age", # age of head of household - "own_children_in_household", # number of children in household - "race", # race of the head of household - "employment_income", # income from wages and salaries - "interest_dividend_income", # income from interest and dividends - "pension_income", # income from social security and retirement accounts -] - -imputed_variables = ["networth"] - -weights = ["wgt"] - -scf_data = scf_data[predictors + imputed_variables + weights] - -weights_col = scf_data["wgt"].values -weights_normalized = weights_col / weights_col.sum() -scf_data_weighted = scf_data.sample( - n=len(scf_data), - replace=True, - weights=weights_normalized, -).reset_index(drop=True) -``` - -```python -import ssl -import requests - -# Disable SSL verification warnings (only use in development environments) -import urllib3 -urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - -# Create unverified context for SSL connections -ssl._create_default_https_context = ssl._create_unverified_context - -# Monkey patch the requests library to use the unverified context -old_get = requests.get -requests.get = lambda *args, **kwargs: old_get(*args, **{**kwargs, 'verify': False}) - -from policyengine_us_data import CPS_2024 -cps_data = CPS_2024() -#cps_data.generate() -cps = cps_data.load_dataset() - -cps_race_mapping = { - 1: 1, # White only -> WHITE - 2: 2, # Black only -> BLACK/AFRICAN-AMERICAN - 3: 5, # American Indian, Alaskan Native only -> AMERICAN INDIAN/ALASKA NATIVE - 4: 4, # Asian only -> ASIAN - 5: 6, # Hawaiian/Pacific Islander only -> NATIVE HAWAIIAN/PACIFIC ISLANDER - 6: 7, # White-Black -> OTHER - 7: 7, # White-AI -> OTHER - 8: 7, # White-Asian -> OTHER - 9: 7, # White-HP -> OTHER - 10: 7, # Black-AI -> OTHER - 11: 7, # Black-Asian -> OTHER - 12: 7, # Black-HP -> OTHER - 13: 7, # AI-Asian -> OTHER - 14: 7, # AI-HP -> OTHER - 15: 7, # Asian-HP -> OTHER - 16: 7, # White-Black-AI -> OTHER - 17: 7, # White-Black-Asian -> OTHER - 18: 7, # White-Black-HP -> OTHER - 19: 7, # White-AI-Asian -> OTHER - 20: 7, # White-AI-HP -> OTHER - 21: 7, # White-Asian-HP -> OTHER - 22: 7, # Black-AI-Asian -> OTHER - 23: 7, # White-Black-AI-Asian -> OTHER - 24: 7, # White-AI-Asian-HP -> OTHER - 25: 7, # Other 3 race comb. -> OTHER - 26: 7, # Other 4 or 5 race comb. -> OTHER -} - -# Apply the mapping to recode the race values -cps["race"] = np.vectorize(cps_race_mapping.get)(cps["cps_race"]) -cps["farm_self_employment_income"] = cps["self_employment_income"] + cps["farm_income"] -cps["interest_dividend_income"] = cps["taxable_interest_income"] + cps["tax_exempt_interest_income"] + cps["qualified_dividend_income"] + cps["non_qualified_dividend_income"] -cps["pension_income"] = cps["tax_exempt_private_pension_income"] + cps["taxable_private_pension_income"] + cps["social_security_retirement"] - -mask_head = cps["is_household_head"] -income_df = pd.DataFrame({ - "household_id": cps["person_household_id"], - "employment_income": cps["employment_income"], - "farm_self_employment_income": cps["farm_self_employment_income"], - "interest_dividend_income": cps["interest_dividend_income"], - "pension_income": cps["pension_income"], -}) -household_sums = ( - income_df - .groupby("household_id") - .sum() - .reset_index() -) -heads = pd.DataFrame({ - "household_id": cps["person_household_id"][mask_head], - "is_female": cps["is_female"][mask_head], - "age": cps["age"][mask_head], - "race": cps["race"][mask_head], - "own_children_in_household": cps["own_children_in_household"][mask_head], -}) -hh_level = heads.merge(household_sums, on="household_id", how="left") - -for name, series in cps.items(): - if isinstance(series, pd.Series) and len(series) == len(hh_level): - if name not in hh_level.columns: - hh_level[name] = series.values - - -cols = ( - ["household_id"] - + [ - "farm_self_employment_income", - "interest_dividend_income", - "pension_income", - "employment_income", - ] - + ["own_children_in_household", "is_female", "age", "race"] -) -cps_data = hh_level[cols] -cps_data["household_weight"] = cps["household_weight"] - -household_weights = ["household_weight"] - -from policyengine_us import Microsimulation -sim = Microsimulation(dataset=CPS_2022) -net_disposable_income = sim.calculate("household_net_income") - -cps_data["household_net_income"] = net_disposable_income -``` - -## Running wealth imputation with autoimpute - -After harmonizing the two datasets, the `autoimpute` function from `microimpute` can be used to transfer wealth information from the SCF to the CPS. This powerful function streamlines the imputation process by automating hyperparameter tuning, method selection, validation, and application. - -Behind the scenes, `autoimpute` evaluates multiple statistical approaches, including Quantile Random Forest, Ordinary Least Squares, Quantile Regression, and Statistical Matching. It performs cross-validation to determine which method most accurately captures the relationship between the predictor variables and wealth measures in the SCF data. The function then applies the best-performing method to generate synthetic wealth values for CPS households. - -By enabling hyperparameter tuning, the function can optimize each method's parameters, further improving imputation accuracy. This automated approach saves considerable time and effort compared to manually testing different imputation strategies, while ensuring the selection of the most appropriate method for this specific imputation task. - -```python -warnings.filterwarnings("ignore") - -# Run the autoimpute process -imputations, imputed_data, fitted_model, method_results_df = autoimpute( - donor_data=scf_data, - receiver_data=cps_data, - predictors=predictors, - imputed_variables=imputed_variables, - weight_col=weights[0], - tune_hyperparameters=True, # enable automated hyperparameter tuning - normalize_data=True, # normalization -) -``` - -## Comparing method performance - -The method comparison plot below shows how different imputation methods performed across various quantiles. Lower quantile loss values indicate better performance. - -```python -# Extract the quantiles used in the evaluation -quantiles = [q for q in method_results_df.columns if isinstance(q, float)] - -comparison_viz = method_comparison_results( - data=method_results_df, - metric="quantile_loss", - data_format="wide", -) -fig = comparison_viz.plot( - title="Autoimpute method comparison", - show_mean=True, -) -``` - -![png](./autoimpute_model_comparison.png) - -## Evaluating wealth imputations - -To assess the imputation results, a comparison the distribution of wealth in the original SCF data with the imputed values in the CPS allow examining how well the imputation preserves important characteristics of the wealth distribution, such as its shape, central tendency, and dispersion. - -Wealth distributions are typically highly skewed, with a long right tail representing a small number of households with very high net worth. A successful imputation should preserve this characteristic skewness while maintaining realistic values across the entire distribution. Examining both the raw distributions and log-transformed versions of wealth values can better capture important information for evaluation. - -```python -def plot_log_transformed_net_worth_distributions( - scf_data: pd.DataFrame, - imputed_data: pd.DataFrame, - title: Optional[str] = None, -) -> go.Figure: - """Plot the log-transformed distribution of net worth in SCF and imputed CPS data.""" - - palette = px.colors.qualitative.Plotly - scf_color = '#1f77b4' # palette[0] - cps_color = '#9467bd' # palette[1] - scf_median_color = scf_color - cps_median_color = cps_color - scf_mean_color = scf_color - cps_mean_color = cps_color - - def safe_log(x): - sign = np.sign(x) - log_x = np.log10(np.maximum(np.abs(x), 1e-10)) - return sign * log_x - - scf_log = safe_log(scf_data["networth"]) - cps_log = safe_log(imputed_data["networth"]) - - scf_log_median, cps_log_median = np.median(scf_log), np.median(cps_log) - scf_log_mean, cps_log_mean = np.mean(scf_log), np.mean(cps_log) - - fig = go.Figure() - - # histograms - fig.add_trace(go.Histogram( - x=scf_log, - nbinsx=150, - opacity=0.7, - name="SCF (weighted) log net worth", - marker_color=scf_color, - )) - fig.add_trace(go.Histogram( - x=cps_log, - nbinsx=150, - opacity=0.7, - name="CPS imputed log net worth", - marker_color=cps_color, - )) - - # medians (dashed) - fig.add_trace(go.Scatter( - x=[scf_log_median, scf_log_median], - y=[0, 20], - mode="lines", - line=dict(color=scf_median_color, width=2, dash="dash"), - name=f"SCF median: ${10**scf_log_median:,.0f}", - )) - fig.add_trace(go.Scatter( - x=[cps_log_median, cps_log_median], - y=[0, 20], - mode="lines", - line=dict(color=cps_median_color, width=2, dash="dash"), - name=f"CPS median: ${10**cps_log_median:,.0f}", - )) - - # means (dotted) - fig.add_trace(go.Scatter( - x=[scf_log_mean, scf_log_mean], - y=[0, 20], - mode="lines", - line=dict(color=scf_mean_color, width=2, dash="dot"), - name=f"SCF mean: ${10**scf_log_mean:,.0f}", - )) - fig.add_trace(go.Scatter( - x=[cps_log_mean, cps_log_mean], - y=[0, 20], - mode="lines", - line=dict(color=cps_mean_color, width=2, dash="dot"), - name=f"CPS mean: ${10**cps_log_mean:,.0f}", - )) - - # layout - fig.update_layout( - title=title if title else "Log-transformed net worth distribution comparison", - xaxis_title="Net worth", - yaxis_title="Frequency", - height=PLOT_CONFIG["height"], - width=PLOT_CONFIG["width"], - barmode="overlay", - bargap=0.1, - legend=dict( - x=0.01, y=0.99, - bgcolor="rgba(255,255,255,0.8)", - bordercolor="rgba(0,0,0,0.3)", - borderwidth=1, - orientation="v", - xanchor="left", - yanchor="top", - ), - ) - - # custom ticks - tick_values = [-6, -4, -2, 0, 2, 4, 6, 8] - tick_labels = [ - "$" + format(10**x if x >= 0 else -(10**abs(x)), ",.0f") - for x in tick_values - ] - fig.update_xaxes(tickvals=tick_values, ticktext=tick_labels) - - return fig - -weights_col = cps_data["household_weight"].values -weights_normalized = weights_col / weights_col.sum() -imputed_data_weighted = imputed_data.sample( - n=len(imputed_data), - replace=True, - weights=weights_normalized, -).reset_index(drop=True) - - -plot_log_transformed_net_worth_distributions(scf_data_weighted, imputed_data_weighted).show() -``` - -![png](./autoimpute_best_model_imputations.png) - -The logarithmic transformation provides a clearer view of the wealth distribution across its entire range. By logarithmically scaling the data, the extreme values are compressed while expanding the visibility of differences in the lower and middle portions of the distribution. - -This transformation is particularly valuable for wealth data, where values can span many orders of magnitude. The plot above, shows how closely the imputed CPS wealth distribution matches the original SCF distribution in terms of shape and central tendency after the imputation performed by the QRF model. The vertical lines marking the mean and median values help gauge how these statistical properties have been preserved through the imputation process. - -## Comparing with other methods - -```python -donor_data = scf_data[predictors + imputed_variables + weights] -receiver_data = cps_data[predictors + household_weights] - -donor_data, normalizing_params = preprocess_data(donor_data[predictors + imputed_variables], normalize=True, full_data=True) -donor_data[weights[0]] = scf_data[weights[0]] -receiver_data, _ = preprocess_data(receiver_data[predictors], normalize=True, full_data=True) -receiver_data["household_weight"] = cps_data["household_weight"] -receiver_data["household_net_income"] = cps_data["household_net_income"] - -mean = pd.Series( - {col: p["mean"] for col, p in normalizing_params.items()} -) -std = pd.Series( - {col: p["std"] for col, p in normalizing_params.items()} -) - -from microimpute.models import * - -def impute_scf_to_cps(model: Type[Imputer], - donor_data: pd.DataFrame, - receiver_data: pd.DataFrame, - cps_data: pd.DataFrame, - predictors: List[str], - imputed_variables: List[str], - weights: List[str]) -> pd.DataFrame: - """Impute SCF data into CPS data using the specified model.""" - model = model() - fitted_model = model.fit( - X_train=donor_data, - predictors=predictors, - imputed_variables=imputed_variables, - weight_col=weights[0], - ) - imputations = fitted_model.predict(X_test=receiver_data) - - cps_imputed = cps_data.copy() - cps_imputed["networth"] = imputations[0.5]["networth"] - - return cps_imputed - -quantreg_cps_imputed = impute_scf_to_cps( - model=QuantReg, - donor_data=donor_data, - receiver_data=receiver_data, - cps_data=cps_data, - predictors=predictors, - imputed_variables=imputed_variables, - weights=weights, -) - -quantreg_cps_imputed["networth"] = quantreg_cps_imputed["networth"].mul(std["networth"]) -quantreg_cps_imputed["networth"] = quantreg_cps_imputed["networth"].add(mean["networth"]) - -weights_col = receiver_data["household_weight"].values -weights_normalized = weights_col / weights_col.sum() -quantreg_cps_imputed_weighted = quantreg_cps_imputed.sample( - n=len(quantreg_cps_imputed), - replace=True, - weights=weights_normalized, -).reset_index(drop=True) - - -ols_cps_imputed = impute_scf_to_cps( - model=OLS, - donor_data=donor_data, - receiver_data=receiver_data, - cps_data=cps_data, - predictors=predictors, - imputed_variables=imputed_variables, - weights=weights, -) - -ols_cps_imputed["networth"] = ols_cps_imputed["networth"].mul(std["networth"]) -ols_cps_imputed["networth"] = ols_cps_imputed["networth"].add(mean["networth"]) - -ols_cps_imputed_weighted = ols_cps_imputed.sample( - n=len(ols_cps_imputed), - replace=True, - weights=weights_normalized, -).reset_index(drop=True) - -matching_cps_imputed = impute_scf_to_cps( - model=Matching, - donor_data=donor_data, - receiver_data=receiver_data, - cps_data=cps_data, - predictors=predictors, - imputed_variables=imputed_variables, - weights=weights, -) - -matching_cps_imputed["networth"] = matching_cps_imputed["networth"].mul(std["networth"]) -matching_cps_imputed["networth"] = matching_cps_imputed["networth"].add(mean["networth"]) - -matching_cps_imputed_weighted = matching_cps_imputed.sample( - n=len(matching_cps_imputed), - replace=True, - weights=weights_normalized, -).reset_index(drop=True) - - -qrf_model = QRF() -fitted_model, best_params = qrf_model.fit( - X_train=donor_data, - predictors=predictors, - imputed_variables=imputed_variables, - weight_col=weights[0], - tune_hyperparameters=True, -) -imputations = fitted_model.predict(X_test=receiver_data) - -qrf_cps_imputed = cps_data.copy() -qrf_cps_imputed["networth"] = imputations[0.5]["networth"] - -qrf_cps_imputed["networth"] = qrf_cps_imputed["networth"].mul(std["networth"]) -qrf_cps_imputed["networth"] = qrf_cps_imputed["networth"].add(mean["networth"]) - -qrf_cps_imputed_weighted = qrf_cps_imputed.sample( - n=len(qrf_cps_imputed), - replace=True, - weights=weights_normalized, -).reset_index(drop=True) - - -def plot_all_models_net_worth_log_distributions( - scf_data: pd.DataFrame, - model_results: dict, - title: Optional[str] = None, -) -> go.Figure: - """Plot log-transformed net worth distributions for all models in a 2x2 grid. - - Args: - scf_data: Original SCF data with networth column - model_results: Dictionary mapping model names to their imputed dataframes - title: Optional title for the entire figure - - Returns: - Plotly figure with 4 subplots - """ - from plotly.subplots import make_subplots - import plotly.graph_objects as go - - # Create subplots - fig = make_subplots( - rows=2, cols=2, - subplot_titles=list(model_results.keys()), - vertical_spacing=0.15, - horizontal_spacing=0.12, - ) - - # Define safe log transformation - def safe_log(x): - sign = np.sign(x) - log_x = np.log10(np.maximum(np.abs(x), 1e-10)) - return sign * log_x - - # Calculate SCF log values once - scf_log = safe_log(scf_data["networth"]) - scf_log_median = np.median(scf_log) - scf_log_mean = np.mean(scf_log) - - # Define colors - scf_color = '#1f77b4' - palette = px.colors.qualitative.Plotly - model_colors = palette[:4] - - # Plot positions - positions = [(1, 1), (1, 2), (2, 1), (2, 2)] - - for idx, (model_name, imputed_data) in enumerate(model_results.items()): - row, col = positions[idx] - model_color = model_colors[idx] - - # Calculate model log values - model_log = safe_log(imputed_data["networth"]) - model_log_median = np.median(model_log) - model_log_mean = np.mean(model_log) - - # Add SCF histogram (grey/transparent) - fig.add_trace( - go.Histogram( - x=scf_log, - nbinsx=150, - opacity=0.3, - name=f"SCF (weighted by sampling)", - marker_color='grey', - showlegend=(idx == 0), # Only show in legend once - ), - row=row, col=col - ) - - # Add model histogram - fig.add_trace( - go.Histogram( - x=model_log, - nbinsx=150, - opacity=0.7, - name=f"{model_name.replace(' imputations', '')}", - marker_color=model_color, - showlegend=True, - ), - row=row, col=col - ) - - # Get y-axis range for vertical lines - fig.update_yaxes(range=[0, 2000], row=row, col=col) - - # Add median lines - fig.add_trace( - go.Scatter( - x=[scf_log_median, scf_log_median], - y=[0, 2000], - mode="lines", - line=dict(color='grey', width=2, dash="dash"), - name=f"SCF Median", - showlegend=False, - ), - row=row, col=col - ) - - fig.add_trace( - go.Scatter( - x=[model_log_median, model_log_median], - y=[0, 2000], - mode="lines", - line=dict(color=model_color, width=2, dash="dash"), - name=f"{model_name} Median", - showlegend=False, - ), - row=row, col=col - ) - - # Determine correct axis references for annotations - if idx == 0: - xref, yref = "x", "y" - elif idx == 1: - xref, yref = "x2", "y2" - elif idx == 2: - xref, yref = "x3", "y3" - else: - xref, yref = "x4", "y4" - - # Add text annotations for statistics - fig.add_annotation( - x=0, # Position on the x-axis (log scale) - y=5000, # Position on the y-axis - xref=xref, - yref=yref, - text=f"Median: ${10**model_log_median:,.0f}
Mean: ${10**model_log_mean:,.0f}", - showarrow=False, - bgcolor="rgba(255,255,255,0.8)", - bordercolor="rgba(0,0,0,0.3)", - borderwidth=1, - font=dict(size=10), - xanchor="right", - yanchor="top", - ) - - # Update layout - fig.update_layout( - title=title if title else "Log-transformed net worth distributions by model", - height=800, - width=1000, - showlegend=True, - legend=dict( - x=0.5, - y=-0.2, - xanchor="center", - yanchor="top", - orientation="h", - ), - barmode="overlay", - ) - - # Update x-axes with custom tick labels - tick_values = [-6, -4, -2, 0, 2, 4, 6, 8] - tick_labels = [ - "$" + format(10**x if x >= 0 else -(10**abs(x)), ",.0f") - for x in tick_values - ] - - for i in range(1, 5): - fig.update_xaxes( - tickvals=tick_values, - ticktext=tick_labels, - title_text="Net Worth (log scale)" if i > 2 else "", - row=(i-1)//2 + 1, - col=(i-1)%2 + 1 - ) - fig.update_yaxes( - title_text="Frequency" if i % 2 == 1 else "", - row=(i-1)//2 + 1, - col=(i-1)%2 + 1 - ) - - return fig - - -# Create dictionary of model results -model_results = { - "QRF imputations": qrf_cps_imputed_weighted, - "OLS imputations": ols_cps_imputed_weighted, - "QuantReg imputations": quantreg_cps_imputed_weighted, - "Matching imputations": matching_cps_imputed_weighted, -} - -# Create and show the combined plot -combined_fig = plot_all_models_net_worth_log_distributions(scf_data_weighted, model_results) -combined_fig.show() -``` -![png](./imputations_model_comparison.png) - -Comparing the wealth distributions that result from imputing from the SCF on to the CPS with four different models, we can visually recognize the different strengths and limitations of each of them. The implications of using one model instead of another for imputation will be further explored by evaluating the impact wealth imputed data has on microsimulation results. - -## Wealth distributions by disposable income deciles - -Lastly, to confidently say that our wealth imputations are coherent with other household characteristics, we can compare the average net worth values per disposable income decile for each of the four methods used. - -```python -income_col = "household_net_income" -wealth_col = "networth" # e.g. "net_wealth" - -decile_means = [] - -for model, df in model_results.items(): - tmp = df.copy() - - # Create 1–10 decile indicator (unweighted) - tmp["income_decile"] = ( - pd.qcut(tmp[income_col], 10, labels=False) + 1 - ) - - # Mean wealth in each decile - out = ( - tmp.groupby("income_decile")[wealth_col] - .mean() - .reset_index(name="mean_wealth") - ) - out["Model"] = model - decile_means.append(out) - -avg_df = pd.concat(decile_means, ignore_index=True) -avg_df["income_decile"] = avg_df["income_decile"].astype(int) - -fig = px.bar( - avg_df, - x="income_decile", - y="mean_wealth", - color="Model", - barmode="group", - labels={ - "income_decile": "Net-income decile (1 = lowest, 10 = highest)", - "mean_wealth": "Average household net worth ($)", - }, - title=( - "Average household net worth by net-income decile
" - "Comparison of imputation models" - ), -) - -fig.update_layout( - xaxis=dict(dtick=1, tick0=1), - paper_bgcolor="#F0F0F0", - plot_bgcolor="#F0F0F0", - yaxis_tickformat="$,.0f", - hovermode="x unified", -) - -fig.update_xaxes(showgrid=False) -fig.update_yaxes(showgrid=False) - -fig.show() -``` - -![png](./by_income_decile_comparisons.png) - -QRF clearly presents the most consistent and plausable realtionship to disposable income, with a gradually increasing average as the deciles increase. This plot also supports the behavior observed above showing the extreme negative and positive predictions that OLS and QuantReg produce at the left and right tails, respectively, and Matching's underprediction at every decile. From baf9181a2ffe2e4a93ea20a7c636ddfc641abe88 Mon Sep 17 00:00:00 2001 From: juaristi22 Date: Fri, 27 Feb 2026 19:19:49 +0530 Subject: [PATCH 4/5] fix minor test bugs due to pandas new data types --- microimpute/comparisons/metrics.py | 35 ++++--- microimpute/config.py | 2 +- microimpute/evaluations/cross_validation.py | 12 ++- microimpute/models/mdn.py | 36 +++++++- microimpute/models/ols.py | 3 +- microimpute/utils/dashboard_formatter.py | 6 +- .../visualizations/comparison_plots.py | 91 +++++++++++-------- .../visualizations/performance_plots.py | 8 ++ tests/test_metrics.py | 4 +- tests/test_models/test_imputers.py | 8 +- tests/test_models/test_matching.py | 2 +- 11 files changed, 139 insertions(+), 68 deletions(-) diff --git a/microimpute/comparisons/metrics.py b/microimpute/comparisons/metrics.py index c963962..29336ec 100644 --- a/microimpute/comparisons/metrics.py +++ b/microimpute/comparisons/metrics.py @@ -175,19 +175,25 @@ def order_probabilities_alphabetically( return reordered_probabilities, alphabetical_classes +# Accept numpy arrays, pandas Series, and pandas ExtensionArrays +# (e.g. ArrowExtensionArray) which newer pandas versions produce for +# string columns. +ArrayLike = Union[np.ndarray, pd.Series, pd.api.extensions.ExtensionArray] + + @validate_call(config=VALIDATE_CONFIG) def compute_loss( - test_y: np.ndarray, - imputations: np.ndarray, + test_y: ArrayLike, + imputations: ArrayLike, metric: MetricType, q: float = 0.5, - labels: Optional[np.ndarray] = None, + labels: Optional[ArrayLike] = None, ) -> Tuple[np.ndarray, float]: """Compute loss for given true values and imputations using specified metric. Args: - test_y: Array of true values. - imputations: Array of predicted/imputed values. + test_y: Array-like of true values. + imputations: Array-like of predicted/imputed values. metric: Type of metric to use ('quantile_loss' or 'log_loss'). q: Quantile value (only used for quantile_loss). labels: Possible label values (only used for log_loss). @@ -198,6 +204,13 @@ def compute_loss( Raises: ValueError: If inputs have different shapes or invalid metric type. """ + # Convert array-like inputs (e.g. ArrowStringArray, pd.Series) + # to numpy before use. + test_y = np.asarray(test_y) + imputations = np.asarray(imputations) + if labels is not None: + labels = np.asarray(labels) + try: # Validate input dimensions if len(test_y) != len(imputations): @@ -291,9 +304,9 @@ def _compute_method_losses( log.error(error_msg) raise ValueError(error_msg) - # Get values - test_values = test_y[variable].values - pred_values = imputation[quantile][variable].values + # Get values as numpy arrays (handles Arrow-backed dtypes) + test_values = np.asarray(test_y[variable]) + pred_values = np.asarray(imputation[quantile][variable]) # Compute loss _, mean_loss = compute_loss( @@ -327,9 +340,9 @@ def _compute_method_losses( log.error(error_msg) raise ValueError(error_msg) - # Get values - test_values = test_y[variable].values - pred_values = imputation[quantile][variable].values + # Get values as numpy arrays (handles Arrow-backed dtypes) + test_values = np.asarray(test_y[variable]) + pred_values = np.asarray(imputation[quantile][variable]) # Get unique labels from test data labels = np.unique(test_values) diff --git a/microimpute/config.py b/microimpute/config.py index c2b0eb7..ba5896a 100644 --- a/microimpute/config.py +++ b/microimpute/config.py @@ -55,7 +55,7 @@ "ols": { # statsmodels OLS uses default parameters # LogisticRegression params for categorical targets: - "penalty": "l2", + "l1_ratio": 0, "C": 1.0, "max_iter": 1000, }, diff --git a/microimpute/evaluations/cross_validation.py b/microimpute/evaluations/cross_validation.py index 664adb8..05f7a19 100644 --- a/microimpute/evaluations/cross_validation.py +++ b/microimpute/evaluations/cross_validation.py @@ -265,11 +265,13 @@ def _compute_fold_loss_by_metric( for var in imputed_variables: metric_type = variable_metrics[var] - # Get data for this variable - test_y_var = test_y_values[var][fold_idx] - train_y_var = train_y_values[var][fold_idx] - test_pred_var = test_results[quantile][fold_idx][var].values - train_pred_var = train_results[quantile][fold_idx][var].values + # Get data for this variable, converting to numpy to handle + # Arrow-backed dtypes (e.g. ArrowStringArray) that pydantic + # won't accept as np.ndarray. + test_y_var = np.asarray(test_y_values[var][fold_idx]) + train_y_var = np.asarray(train_y_values[var][fold_idx]) + test_pred_var = np.asarray(test_results[quantile][fold_idx][var]) + train_pred_var = np.asarray(train_results[quantile][fold_idx][var]) # Compute loss based on metric type if metric_type == "quantile_loss": diff --git a/microimpute/models/mdn.py b/microimpute/models/mdn.py index fe78e68..1649ecb 100644 --- a/microimpute/models/mdn.py +++ b/microimpute/models/mdn.py @@ -64,6 +64,19 @@ message=".*have no logger configured.*", module="pytorch_lightning.core.module", ) + warnings.filterwarnings( + "ignore", + message=".*isinstance.*LeafSpec.*is deprecated.*", + ) + warnings.filterwarnings( + "ignore", + message=".*given NumPy array is not writable.*", + ) + warnings.filterwarnings( + "ignore", + message=".*Trying to unpickle estimator.*", + module="sklearn.*", + ) # After import, also update the rank_zero_module logger from lightning_fabric.utilities.rank_zero import rank_zero_module @@ -148,6 +161,25 @@ def _generate_data_hash(X: pd.DataFrame, y: pd.Series) -> str: return hashlib.md5(combined.encode()).hexdigest()[:12] +def _get_package_versions_hash() -> str: + """Get a short hash of sklearn and pytorch_tabular versions. + + Including package versions in the cache key ensures that caches + saved with older versions are automatically invalidated when + packages are upgraded, avoiding deserialization warnings. + """ + import sklearn + + versions = [sklearn.__version__] + try: + import pytorch_tabular + + versions.append(pytorch_tabular.__version__) + except (ImportError, AttributeError): + versions.append("unknown") + return hashlib.md5("_".join(versions).encode()).hexdigest()[:6] + + def _generate_cache_key( predictors: List[str], target: str, data_hash: str ) -> str: @@ -168,7 +200,9 @@ def _generate_cache_key( predictors_hash = hashlib.md5(predictors_str.encode()).hexdigest()[:8] # Sanitize target name for filesystem safe_target = target.replace("/", "_").replace("\\", "_") - return f"{predictors_hash}_{safe_target}_{data_hash}" + # Include package versions to invalidate cache on upgrades + ver_hash = _get_package_versions_hash() + return f"{predictors_hash}_{safe_target}_{data_hash}_{ver_hash}" class _MDNModel: diff --git a/microimpute/models/ols.py b/microimpute/models/ols.py index e0ed4ee..f2fb6e8 100644 --- a/microimpute/models/ols.py +++ b/microimpute/models/ols.py @@ -59,8 +59,9 @@ def fit( y_encoded = y_encoded.fillna(0) # Default to first category # Extract relevant LR parameters from kwargs + # Use l1_ratio instead of penalty (deprecated in sklearn 1.8) classifier_params = { - "penalty": lr_kwargs.get("penalty", "l2"), + "l1_ratio": lr_kwargs.get("l1_ratio", 0), "C": lr_kwargs.get("C", 1.0), "max_iter": lr_kwargs.get("max_iter", 1000), "solver": lr_kwargs.get( diff --git a/microimpute/utils/dashboard_formatter.py b/microimpute/utils/dashboard_formatter.py index fe8dbb6..5d56309 100644 --- a/microimpute/utils/dashboard_formatter.py +++ b/microimpute/utils/dashboard_formatter.py @@ -700,10 +700,8 @@ def format_csv( # Generate histogram data for each imputed variable for var in imputed_variables: # Check if variable is categorical or numerical - if donor_data[ - var - ].dtype == "object" or pd.api.types.is_categorical_dtype( - donor_data[var] + if pd.api.types.is_string_dtype(donor_data[var]) or isinstance( + donor_data[var].dtype, pd.CategoricalDtype ): # Categorical variable hist_data = _compute_categorical_distribution( diff --git a/microimpute/visualizations/comparison_plots.py b/microimpute/visualizations/comparison_plots.py index 4e1b85a..53248cf 100644 --- a/microimpute/visualizations/comparison_plots.py +++ b/microimpute/visualizations/comparison_plots.py @@ -200,11 +200,19 @@ def _process_dual_metrics_input( ): std_results = ql_data["results_std"].loc["test"] + # Loss values in results are already averaged + # across variables, so create ONE row per + # (method, quantile) to avoid duplicate bars. + variables = ql_data.get("variables", ["y"]) + var_label = ( + variables[0] if len(variables) == 1 else "average" + ) + for quantile in test_results.index: - for var in ql_data.get("variables", ["y"]): - row = { + long_format_data.append( + { "Method": method_name, - "Imputed Variable": var, + "Imputed Variable": var_label, "Percentile": quantile, "Loss": test_results[quantile], "Metric": "quantile_loss", @@ -214,21 +222,20 @@ def _process_dual_metrics_input( else np.nan ), } - long_format_data.append(row) + ) # Add mean loss if "mean_test" in ql_data: - for var in ql_data.get("variables", ["y"]): - long_format_data.append( - { - "Method": method_name, - "Imputed Variable": var, - "Percentile": "mean_quantile_loss", - "Loss": ql_data["mean_test"], - "Metric": "quantile_loss", - "Std": ql_data.get("std_test", np.nan), - } - ) + long_format_data.append( + { + "Method": method_name, + "Imputed Variable": var_label, + "Percentile": "mean_quantile_loss", + "Loss": ql_data["mean_test"], + "Metric": "quantile_loss", + "Std": ql_data.get("std_test", np.nan), + } + ) # Process log loss if available if ( @@ -240,35 +247,41 @@ def _process_dual_metrics_input( ll_data.get("results") is not None and not ll_data["results"].empty ): - # Log loss is constant across quantiles + # Log loss is constant across quantiles. + # Same as quantile_loss: one row per method, + # not per variable, since values are aggregated. if "test" in ll_data["results"].index: test_loss = ll_data["results"].loc["test"].mean() test_std = ll_data.get("std_test", np.nan) - for var in ll_data.get("variables", []): - long_format_data.append( - { - "Method": method_name, - "Imputed Variable": var, - "Percentile": "log_loss", - "Loss": test_loss, - "Metric": "log_loss", - "Std": test_std, - } - ) + ll_variables = ll_data.get("variables", []) + ll_var_label = ( + ll_variables[0] + if len(ll_variables) == 1 + else "average" + ) + long_format_data.append( + { + "Method": method_name, + "Imputed Variable": ll_var_label, + "Percentile": "log_loss", + "Loss": test_loss, + "Metric": "log_loss", + "Std": test_std, + } + ) # Add mean loss if "mean_test" in ll_data: - for var in ll_data.get("variables", []): - long_format_data.append( - { - "Method": method_name, - "Imputed Variable": var, - "Percentile": "mean_log_loss", - "Loss": ll_data["mean_test"], - "Metric": "log_loss", - "Std": ll_data.get("std_test", np.nan), - } - ) + long_format_data.append( + { + "Method": method_name, + "Imputed Variable": ll_var_label, + "Percentile": "mean_log_loss", + "Loss": ll_data["mean_test"], + "Metric": "log_loss", + "Std": ll_data.get("std_test", np.nan), + } + ) self.comparison_data = pd.DataFrame(long_format_data) @@ -805,7 +818,7 @@ def _plot_stacked_contribution( ) if title is None: - title = "Rank-based mmodel performance by variable (lower is better)" + title = "Rank-based model performance by variable (lower is better)" fig.update_layout( title=title, diff --git a/microimpute/visualizations/performance_plots.py b/microimpute/visualizations/performance_plots.py index 8e9de4a..6c88f70 100644 --- a/microimpute/visualizations/performance_plots.py +++ b/microimpute/visualizations/performance_plots.py @@ -67,6 +67,14 @@ def __init__( # Handle different input formats if isinstance(results, pd.DataFrame): # Backward compatibility: single metric DataFrame + # Note: passing a bare DataFrame loses results_std, so error + # bars will not be shown. Pass the full cross_validate_model + # output dict to preserve error bar data. + logger.warning( + "Received a bare DataFrame instead of the full results dict. " + "Error bars will not be available. Pass the full output of " + "cross_validate_model() to enable error bars." + ) self.results = {"quantile_loss": {"results": results.copy()}} self.has_quantile_loss = True self.has_log_loss = False diff --git a/tests/test_metrics.py b/tests/test_metrics.py index 302df50..ca416c8 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -1289,8 +1289,8 @@ def test_compare_distributions_return_format() -> None: assert len(results) == 2 # Check data types - assert results["Variable"].dtype == "object" - assert results["Metric"].dtype == "object" + assert pd.api.types.is_string_dtype(results["Variable"]) + assert pd.api.types.is_string_dtype(results["Metric"]) assert results["Distance"].dtype in ["float64", "float32"] diff --git a/tests/test_models/test_imputers.py b/tests/test_models/test_imputers.py index 762d45d..7c50ef0 100644 --- a/tests/test_models/test_imputers.py +++ b/tests/test_models/test_imputers.py @@ -264,7 +264,7 @@ def test_imputation_categorical_targets( # Default behavior returns DataFrame directly assert isinstance(predictions, pd.DataFrame) - assert predictions["categorical"].dtype == "object" + assert pd.api.types.is_string_dtype(predictions["categorical"]) # Test probability predictions for models that support it if model_class.__name__ in ["OLS", "QRF", "Matching"]: @@ -279,7 +279,9 @@ def test_imputation_categorical_targets( # Check that we still get the categorical predictions assert isinstance(predictions_with_probs[0.5], pd.DataFrame) - assert predictions_with_probs[0.5]["categorical"].dtype == "object" + assert pd.api.types.is_string_dtype( + predictions_with_probs[0.5]["categorical"] + ) # Check probability format prob_info = predictions_with_probs["probabilities"]["categorical"] @@ -333,7 +335,7 @@ def test_categorical_return_probs_false( predictions = fitted_model.predict(X_test) assert isinstance(predictions, pd.DataFrame) assert "categorical" in predictions.columns - assert predictions["categorical"].dtype == "object" + assert pd.api.types.is_string_dtype(predictions["categorical"]) assert set(predictions["categorical"].unique()).issubset({"A", "B", "C"}) # Test 2: Explicit return_probs=False with quantiles should return dict of DataFrames diff --git a/tests/test_models/test_matching.py b/tests/test_models/test_matching.py index e6c8e40..7c01bff 100644 --- a/tests/test_models/test_matching.py +++ b/tests/test_models/test_matching.py @@ -208,7 +208,7 @@ def test_matching_mixed_types() -> None: predictions = fitted_model.predict(X_test, quantiles=[0.5]) assert predictions[0.5]["target_numeric"].dtype == np.float64 - assert predictions[0.5]["target_category"].dtype == object + assert pd.api.types.is_string_dtype(predictions[0.5]["target_category"]) # === Edge Cases === From 55f0a130034843057019bd1f249e8856430b2df8 Mon Sep 17 00:00:00 2001 From: juaristi22 Date: Fri, 27 Feb 2026 20:36:47 +0530 Subject: [PATCH 5/5] changelog --- changelog.d/maria-paper_review.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/maria-paper_review.fixed.md diff --git a/changelog.d/maria-paper_review.fixed.md b/changelog.d/maria-paper_review.fixed.md new file mode 100644 index 0000000..2354004 --- /dev/null +++ b/changelog.d/maria-paper_review.fixed.md @@ -0,0 +1 @@ +Updated paper and package documentation with latest changes. Fix pandas 2.x compatibility for Arrow string types and dtype checks.