- Description: Python modules for data preprocessing, feature engineering, machine learning modeling, statistical analysis, and visualization of the LIFETRACE dataset.
- Purpose: Provides reusable, documented code for reproducing the analyses and figures presented in the LIFETRACE dataset paper.
- Language: Python 3.10+Let's
modeling.py: Feature engineering pipeline and XGBoost modeling utilities for predicting wellbeing metrics from multimodal daily signals. Includes lag/rolling feature generation, leave-one-group-out cross-validation, SHAP feature importance analysis, and baseline comparisons.plotting.py: Consolidated plotting module for generating all publication figures — EMA completion distributions, valence trajectories, walking protocol adherence, blood biomarker trends, and anthropometric summaries.ttest_analysis.py: T-test statistical analysis for discretized outcome comparisons. Discretises future targets (e.g., sleep hours, boredom) into low/high classes and performs independent t-tests with Bonferroni correction to identify significant feature associations.
All modules are organised around explicit responsibilities, keep side effects (file I/O, logging) transparent, and are safe to import as libraries or execute as standalone scripts.
share/
├── data/ # Original dataset files (CSV)
├── img/ # Generated plots and figures (no subfolders)
├── out/ # Analysis results and model outputs
│ ├── results.csv # Model evaluation summary from modeling.py
│ ├── feature_importances/ # SHAP plots from modeling.py
│ └── discrete_outcomes/ # T-test results from ttest_analysis.py
└── src/ # Analysis code (this directory)
├── modeling.py
├── plotting.py
├── ttest_analysis.py
└── README.md
The LIFETRACE dataset is required to run this code. Dataset files must be placed in the ../data/ directory.
The dataset is available at:
For access instructions and requirements, see the README.md file on Zenodo directory.
pip install numpy pandas polars scikit-learn xgboost scipy matplotlib seaborn- SHAP: For feature importance visualisations in
modeling.pypip install shap
- statsmodels: For Bonferroni correction in
ttest_analysis.pypip install statsmodels
cd share/src
python modeling.pyOutput:
out/results.csv: Model performance metrics (RMSE, MAE) for all targets and horizonsout/feature_importances/: SHAP beeswarm plots for each target-metric combination
What it does:
- Loads and merges EMA, wearable, and contextual data
- Generates lag features (1–3 days) and rolling statistics (7-day windows)
- Trains XGBoost regressors with GridSearchCV and leave-one-group-out CV
- Evaluates models on holdout period (days 29–49)
- Compares against global mean, per-user mean, and lag-1 baselines
python plotting.pyOutput:
img/boxplot_49days.pdf,img/cdf_42days.pdf: EMA completion distributionsimg/positive_valance_boxplot.pdf,img/negative_valance_boxplot.pdf: Valence trajectoriesimg/walking_consistency*.pdf: Walking protocol adherenceimg/steps_and_sport_time*.pdf: Activity trends and availabilityimg/blood_metrics*.pdf: Blood biomarker distributionsimg/age_distribution.pdf,img/sex_*.pdf: Anthropometric summariesimg/*_city_vs_park.pdf: City vs. park group comparisons
What it does:
Aggregates plotting routines originally scattered across multiple scripts into a single, import-friendly module. Each function can be called individually or orchestrated via generate_all_plots().
python ttest_analysis.pyOutput:
out/discrete_outcomes/discrete_analysis_*.csv: Feature-level t-test results with p-values, Cohen's d, and significance markersout/discrete_outcomes/discrete_analysis_*.txt: Metadata summaries (thresholds, sample sizes)
What it does:
- Reuses the feature engineering pipeline from
modeling.py - Discretises continuous targets (sleep hours, boredom, loneliness) into low/high groups (40th/60th percentiles)
- Performs independent t-tests between groups for each feature
- Applies Bonferroni correction for multiple comparisons
- Reports effect sizes (Cohen's d) and significance levels
from modeling import DatasetPaths, ModelingConfig, prepare_daily_dataframe
from plotting import PlotConfig, plot_valence_boxplots
from ttest_analysis import run_analysis
# Load preprocessed data
paths = DatasetPaths()
config = ModelingConfig()
daily_df = prepare_daily_dataframe(paths, config)
# Generate a single plot
plot_config = PlotConfig()
plot_config.ensure_output()
plot_valence_boxplots(plot_config)
# Run custom t-test analysis
outputs = run_analysis()
print(outputs) # Dict of written file pathsEdit ModelingConfig in modeling.py:
validation_cutoff: Day threshold for train/validation split (default: 28)lag_days: Number of lag features to generate (default: 3)rolling_window: Window size for rolling statistics (default: 7)future_days: Prediction horizons in days (default: (1, 7))shap_max_display: Number of features in SHAP plots (default: 15)param_grid: XGBoost hyperparameter grid
Edit PlotConfig in plotting.py:
font_scale: Seaborn font scaling factor (default: 1.5)
Edit DiscreteOutcomeConfig in ttest_analysis.py:
targets: Tuple of target column names (default: ("sleep_hours", "boredom", "loneliness"))future_days: Prediction horizons to analyse (default: (1, 7))low_percentile,high_percentile: Discretisation thresholds (default: 40.0, 60.0)alpha: Significance threshold after correction (default: 0.05)
- Random seed: Not explicitly set — XGBoost early stopping introduces minor non-determinism. For exact reproduction, set
random_stateinXGBRegressorinitialisation. - Z-score normalisation: All percentage-based and continuous features are z-scored within each participant using statistics from days 1–28 (training period).
- Data interpolation: Training data uses Polars
.interpolate()to fill missing values; validation data retains raw missingness to reflect real-world deployment. - SHAP computation: TreeExplainer runs on training data only; plots may take several minutes for large feature sets.
- Ensure the column exists in the merged daily dataframe
- Add column name to
select_feature_columns()exclusion list if it's a metadata field - Rerun
modeling.pyorttest_analysis.py
- Define a new function in
plotting.pyfollowing the existing pattern:def plot_my_new_figure(config: PlotConfig) -> None: """Brief description.""" df = _load_csv(config, "my_data.csv") fig, ax = plt.subplots(figsize=(8, 6)) # ... plotting code ... _save_figure(fig, config.output_dir / "my_figure.pdf")
- Add function call to
generate_all_plots()
Modify feature_engineering_pipeline() in modeling.py to add new feature transformations (e.g., polynomial features, interaction terms, different window sizes).
When using this code, please cite the associated dataset and paper:
Paper:
Francesco Bombassei De Bona, Ioana Andreea Câmpanu, Marc Langheinrich, Martin Gjoreski, and Georgiana Juravle. 2025. LIFETRACE: A Longitudinal Multimodal Dataset on Daily Physical Activity, Well-Being, and Habits. Proc. ACM Interact. Mob. Wearable Ubiquitous Technol. 9, 4, Article 161 (December 2025), 33 pages. https://doi.org/10.1145/3770676
Dataset:
Francesco Bombassei De Bona, Ioana Andreea Câmpanu, Marc Langheinrich, Martin Gjoreski, and Georgiana Juravle. 2025. Data from "LIFETRACE: A Longitudinal Multimodal Dataset on Daily Physical Activity, Well-Being, and Habits" [Data set]. Zenodo. https://doi.org/10.5281/zenodo.17249917
For questions about the code or dataset access:
- Author: Francesco Bombassei De Bona
- Email:
francesco.bombassei.de.bona@usi.ch