Skip to content
USI-PCCPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

8 Commits

Folders and files

Repository files navigation

DOI DOI

LIFETRACE Analysis Code

Overview

  • 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

Modules in This Directory

  • 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.

Directory Structure

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

Dataset Access

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.

Installation

Requirements

pip install numpy pandas polars scikit-learn xgboost scipy matplotlib seaborn

Optional Dependencies

  • SHAP: For feature importance visualisations in modeling.py
    pip install shap
  • statsmodels: For Bonferroni correction in ttest_analysis.py
    pip install statsmodels

Usage

Running the Complete Modeling Pipeline

cd share/src
python modeling.py

Output:

  • out/results.csv: Model performance metrics (RMSE, MAE) for all targets and horizons
  • out/feature_importances/: SHAP beeswarm plots for each target-metric combination

What it does:

  1. Loads and merges EMA, wearable, and contextual data
  2. Generates lag features (1–3 days) and rolling statistics (7-day windows)
  3. Trains XGBoost regressors with GridSearchCV and leave-one-group-out CV
  4. Evaluates models on holdout period (days 29–49)
  5. Compares against global mean, per-user mean, and lag-1 baselines

Generating All Figures

python plotting.py

Output:

  • img/boxplot_49days.pdf, img/cdf_42days.pdf: EMA completion distributions
  • img/positive_valance_boxplot.pdf, img/negative_valance_boxplot.pdf: Valence trajectories
  • img/walking_consistency*.pdf: Walking protocol adherence
  • img/steps_and_sport_time*.pdf: Activity trends and availability
  • img/blood_metrics*.pdf: Blood biomarker distributions
  • img/age_distribution.pdf, img/sex_*.pdf: Anthropometric summaries
  • img/*_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().

Running T-Test Analysis

python ttest_analysis.py

Output:

  • out/discrete_outcomes/discrete_analysis_*.csv: Feature-level t-test results with p-values, Cohen's d, and significance markers
  • out/discrete_outcomes/discrete_analysis_*.txt: Metadata summaries (thresholds, sample sizes)

What it does:

  1. Reuses the feature engineering pipeline from modeling.py
  2. Discretises continuous targets (sleep hours, boredom, loneliness) into low/high groups (40th/60th percentiles)
  3. Performs independent t-tests between groups for each feature
  4. Applies Bonferroni correction for multiple comparisons
  5. Reports effect sizes (Cohen's d) and significance levels

Using as a Library

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 paths

Configuration

Modeling Configuration

Edit 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

Plotting Configuration

Edit PlotConfig in plotting.py:

  • font_scale: Seaborn font scaling factor (default: 1.5)

T-Test Configuration

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)

Reproducibility Notes

  • Random seed: Not explicitly set — XGBoost early stopping introduces minor non-determinism. For exact reproduction, set random_state in XGBRegressor initialisation.
  • 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.

Extending the Code

Adding a New Target Variable

  1. Ensure the column exists in the merged daily dataframe
  2. Add column name to select_feature_columns() exclusion list if it's a metadata field
  3. Rerun modeling.py or ttest_analysis.py

Adding a New Plot

  1. Define a new function in plotting.py following 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")
  2. Add function call to generate_all_plots()

Customising the Feature Engineering Pipeline

Modify feature_engineering_pipeline() in modeling.py to add new feature transformations (e.g., polynomial features, interaction terms, different window sizes).

Citation

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

Contact

For questions about the code or dataset access:

  • Author: Francesco Bombassei De Bona
  • Email: francesco.bombassei.de.bona@usi.ch

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages