misaem: Logistic Regression with Missing Covariates
misaem is a Python package that implements logistic regression for data with missing covariates. It is based on the Stochastic Approximation of the Expectation-Maximization (SAEM) algorithm. The algorithm relies on Metropolis-Hastings sampling within the MCMC step to handle the imputation of missing data, under the assumption that the covariates follow a multi-variate normal distribution.
This package provides a robust method for parameter estimation and prediction under Missing Completely at Random (MCAR) and Missing At Random (MAR) assumptions. It is a direct port of the misaem R package and is designed to integrate seamlessly with the scikit-learn ecosystem, adhering to its API conventions for ease of use.
🌟 Key Features
-
Robust Handling of Missing Data: Employs the SAEM algorithm to handle missing covariate data during model fitting and prediction.
-
Predictive Power: Can be used to make predictions on new, incomplete datasets.
-
scikit-learn Compatibility: Follows scikit-learn's API, allowing for direct use in pipelines, cross-validation, and other standard workflows.
-
Statistical Foundation: Provides estimated coefficients and their standard errors, enabling statistical inference.
💻 Installation
You can install the package via pip:
pip install misaem
🚀 Getting Started
Here is a full example demonstrating how to use SAEMLogisticRegression to fit a model, make predictions, and visualize the results.
import numpy as np
from misaem import SAEMLogisticRegression
import matplotlib.pyplot as plt
# 1. Generate Data
np.random.seed(1324)
n_train = 1000
n_test = 300
n_features = 5
cov = [[1,0.75,0.5,0.25,0],
[0.75,1,0.75,0.5,0.25],
[0.5,0.75,1,0.75,0.5],
[0.25,0.5,0.75,1,0.75],
[0,0.25,0.5,0.75,1]]
X = np.random.multivariate_normal(mean=np.zeros(n_features), cov=cov, size=n_train + n_test)
true_beta = np.hstack([0.5, np.random.normal(size=n_features)])
linear_pred = np.hstack([np.ones((n_train + n_test, 1)), X]) @ true_beta
probabilities = 1 / (1 + np.exp(-linear_pred))
y = np.random.binomial(1, probabilities)
X_missing = X.copy()
missing_mask = np.random.rand(n_train + n_test, n_features) < 0.2
X_missing[missing_mask] = np.nan
X_train = X_missing[:n_train,:]
X_test = X_missing[(n_train+1):]
y_train = y[:n_train]
y_test = y[(n_train+1):]
# 2. Fit SAEMLogisticRegression
model = SAEMLogisticRegression()
model.fit(X_train, y_train)
# 3. Predict on test set
preds = model.predict_proba(X_test, method="map")[:,1]
# 4. Evaluate
accuracy = np.mean((preds > 0.5) == y_test)
print(f"Accuracy of SAEMLogisticRegression: {accuracy:.4f}")
coef = model.coef_.ravel()
se = model.std_err_.ravel()[1:] # remove the intercept
plt.figure(figsize=(8, 4))
plt.errorbar(range(len(coef)), coef, yerr=1.96*se, fmt='o', label='Estimated Coef with 95% CI')
plt.xticks(range(len(coef)), [f'X{i}' for i in range(len(coef))])
plt.plot(range(len(coef)), true_beta[1:], 'o', color='red', label='True Coef')
plt.legend()
plt.show()
⚙️ scikit-learn Integration
The misaem package is compatible with scikit-learn's API, which allows you to seamlessly integrate it into your machine learning pipelines. For instance, you can combine it with data preprocessing steps like StandardScaler.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from misaem import SAEMLogisticRegression
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', SAEMLogisticRegression(random_state=42))
])
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
accuracy_pipeline = np.mean(y_pred == y_test)
print(f"Accuracy of SAEMLogisticRegression: {accuracy_pipeline:.4f}")
📚 Reference
This package is based on the SAEM algorithm for logistic regression with missing covariates. For more details on the methodology, please refer to the following publication:
Jiang, W., Josse, J., Lavielle, M., & TraumaBase Group. (2020). Logistic regression with missing covariates—Parameter estimation, model selection and prediction within a joint-modeling framework. Computational Statistics & Data Analysis, 145, 106907.
🤝 Contributing
We welcome contributions! If you encounter any bugs, have feature requests, or want to contribute to the code, please open an issue or a pull request on our GitHub repository.
Metadata
Release files for misaem 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| misaem-1.0.0.tar.gz | 44.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| misaem-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 54.8 kB
Release files / misaem-1.0.0.tar.gz
| Download URL | misaem-1.0.0.tar.gz |
|---|---|
| Size | 44.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3d9130fbe8fdb61ef70723833c0f01ac277cb96a4062e3bfeaef1c1ef624ebbf
|
|
BLAKE2b-256 checksum How to use checksums |
e6431c88eefe3c919f025afd64e7748face7070fe3d1d2d42dadf940511335a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.23
|
Release files / misaem-1.0.0-py3-none-any.whl
| Download URL | misaem-1.0.0-py3-none-any.whl |
|---|---|
| Size | 10.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
61edf45ade5a5c8021221889ae232a7fb520714e3006a5b4c111b6d7afd7068f
|
|
BLAKE2b-256 checksum How to use checksums |
ec0d731e18c473cd13a281aa58a12aada6f1ace491f1f38db7e480cc67e6bdb7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.23
|
Security for misaem 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.