High-precision circadian melatonin profile analysis
Project description
melafit
Python package for high-precision circadian melatonin profile analysis. Features a variety of baseline cosine functions for curve fitting (Van Someren & Nagtegaal, 2007) and a robust cost function for superior convergence, even with sparse data (Gabel et al. (2017)).
Overview
melafit is a Python package designed for high-precision modeling of 24-hour melatonin secretion. While standard cosinor or harmonic analyses fail to capture the physiological nuances of the melatonin "wave," melafit implements several baseline cosine functions including bimodal, skewed and bimodal-skewed modifications. This approach accounts for the characteristic baseline, asymmetry and dual peaks often seen in high-resolution circadian melatonin data.
Furthermore, the library utilizes a specialized cost function developed to overcome common optimization hurdles (trivial all-zero solutions), ensuring stable convergence even when working with sparse or incomplete time series.
Installation
The workflow described below is based on Miniconda as the package and environment manager. Create a dedicated directory <YOUR-DIRECTORY> for the melafit repository, navigate to it, and clone the repository:
cd <YOUR-DIRECTORY>
git clone https://github.com/vitaliy-ch25/melafit.git
cd melafit
Then create and activate the conda environment, which ensures all dependencies (Python 3.12, NumPy, SciPy, Pandas, etc.) are correctly configured. The environment configuration file ./melafit.yml explicitly uses conda-forge as the sole package channel, ensuring reproducibility and avoiding potential conflicts between packages from different channels:
conda env create -f melafit.yml
conda activate melafit
This will create a fully functional analysis environment, including a number of supporting data manipulation and analysis packages (numpy, scipy, pandas, openpyxl and matplotlib).
Updating
Navigate to the cloned repository directory and pull the latest version:
cd <YOUR-DIRECTORY>/melafit
git pull
Then update the conda environment to match any updated dependencies:
conda env update -f melafit.yml --prune
This updates both the dependencies and the melafit package itself to the latest version.
Getting Started
Code example and some dummy data demonstrating melatonin profile curve fitting with this package are included in ./examples/ and ./data/. Copy sample scripts and datasets to your working directory and start from there. If you have performed the steps above as described, your script will 'see' all the required packages from any location. Simply make sure to use the virtual environment melafit you created.
Data preparation
Follow the Excel table format and column naming conventions as in ./data/:
- Participant for study participant ID
- Date for dates of the respective samples
- Time for sample timestamps
- Mel for melatonin level values
Key Features
- Bimodal Waveform Fitting: Implementation of the Nagtegaal & Van Someren (2007) model for superior physiological accuracy.
- Optimized Convergence: Leverages the robust cost function described in Gabel et al. (2017) to ensure reliable fits across diverse datasets.
- Sparse Data Support: Capable of reconstructing full profiles and estimating circadian phase from limited data points, as well as determining dim light melatonin onset (DLMO) with partial data.
- Research-Ready: Direct derivation of phase markers from continuous, fitted waveforms.
Scientific Foundations
If you use melafit in your research, please cite the following foundational publications:
Human-Readable
- Van Someren, E. J., & Nagtegaal, E. (2007). Improving melatonin circadian phase estimates. Sleep Medicine, 8(6), 590-601.
- Gabel, V., et al. (2017). Differential impact in young and older individuals of blue-enriched white light on circadian physiology and alertness during sustained wakefulness. Scientific Reports, 7, 7620.
BibTeX
@article{vansomeren2007,
title={Improving melatonin circadian phase estimates},
author={Van Someren, Eus JW and Nagtegaal, Elsbeth},
journal={Sleep Medicine},
volume={8},
number={6},
pages={590--601},
year={2007},
publisher={Elsevier}
}
@article{gabel2017,
title={Differential impact in young and older individuals of blue-enriched white light on circadian physiology and alertness during sustained wakefulness},
author={Gabel, Virginie and Reichert, Carolin F and Maire, Micheline and Schmidt, Christina and Schlangen, Luc JM and Kolodyazhniy, Vitaliy and Garbazza, Corrado and Cajochen, Christian and Viola, Antoine U},
journal={Scientific Reports},
volume={7},
pages={7620},
year={2017},
publisher={Nature Publishing Group}
}
Authors
- Vitaliy Kolodyazhniy – Lead Developer
- Christian Cajochen – Scientific Lead
Revision History
v0.1.2
- Improved documentation
v0.1.1 - First PyPI release
- Enhanced function
fit()to support custom waveform functions with user-defined initial parameters and bounds - Changed named parameter order in
fit():cost_fandcost_pare now the last two parameters - Fixed returned type hints in
func_defaults() - Additional unit tests for new functionality
- Improved README
- Package registered in Python Package Index PyPI
v0.1.0 — First public release
- Dictionary support for waveform function parameters throughout the package: all functions accept both
dictandnp.ndarrayfor parameter input - Named parameter constants:
BCF_PARAM_NAMES,SBCF_PARAM_NAMES,BBCF_PARAM_NAMES,BSBCF_PARAM_NAMESandPARAM_NAMESlookup - New utility functions
params_to_array()andarray_to_params()for conversion between array and named dictionary representations fit()now returns named parameter dictionary asres.pin addition to the standard scipyres.xarrayfit()now acceptscost_pdictionary for passing parameters to the cost function (e.g.{"eps": 1e-6})- New utility function
params_to_string()for human-readable parameter output - Fixed
area_cog(): baseline subtraction and bin size normalization - Unit tests for all public functions in
fitting,markersandutils
v0.0.9
- New function
func_defaults()infitting.pyfor standalone access to default initial conditions and constraints for all waveform functions - Improved cost function:
epsparameter for more robust fitting - Optional
thresh_absparameter inmarkers.midpoint()for absolute threshold support - New example script
example_dlmo.pyand dataset for DLMO detection from partial data - Previous example renamed to
example_full_profile.py - Improved type hints, docstrings and README
Initial revisions (v0.0.1 – v0.0.8)
- Full implementation of melatonin profile analysis as described in Gabel et al. (2017)
- Waveform functions:
bcf,sbcf,bbcf,bsbcf - Markers:
amplitude,midpoint,DLMOn,DLMOff,area,cog - Utilities:
read_data,prepare_part_data,compute_wave,day_profile,abs_threshold,time_to_phase,phase_to_string,phase_diff - MIT license, packaging metadata and README
License
This project is licensed under the MIT License. See the LICENSE file for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file melafit-0.1.2.tar.gz.
File metadata
- Download URL: melafit-0.1.2.tar.gz
- Upload date:
- Size: 22.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00b3f7cd6fc8d31785da06ac925c5abec84093d324ad56aa46405ed60e3dbad6
|
|
| MD5 |
1d2c801488cc944b546966212c8f3b95
|
|
| BLAKE2b-256 |
567db405e77011fb6cbf4e4a921aa70ea73009f2384336050887b950e51a859e
|
Provenance
The following attestation bundles were made for melafit-0.1.2.tar.gz:
Publisher:
python-publish.yml on vitaliy-ch25/melafit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
melafit-0.1.2.tar.gz -
Subject digest:
00b3f7cd6fc8d31785da06ac925c5abec84093d324ad56aa46405ed60e3dbad6 - Sigstore transparency entry: 1537337172
- Sigstore integration time:
-
Permalink:
vitaliy-ch25/melafit@848eb3a355423498643b34fba99cbb13be81cc7b -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/vitaliy-ch25
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@848eb3a355423498643b34fba99cbb13be81cc7b -
Trigger Event:
release
-
Statement type:
File details
Details for the file melafit-0.1.2-py3-none-any.whl.
File metadata
- Download URL: melafit-0.1.2-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
101062ef15eb345eca9754fe8c03603438b7ddeff6dd84cfc4f34ce0b7c2048b
|
|
| MD5 |
148326164b50b68801997fd9489d0490
|
|
| BLAKE2b-256 |
0935ec35e80007bc7b1cb442f701118bd0b81c2a6282eead7561456a64e63ce1
|
Provenance
The following attestation bundles were made for melafit-0.1.2-py3-none-any.whl:
Publisher:
python-publish.yml on vitaliy-ch25/melafit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
melafit-0.1.2-py3-none-any.whl -
Subject digest:
101062ef15eb345eca9754fe8c03603438b7ddeff6dd84cfc4f34ce0b7c2048b - Sigstore transparency entry: 1537337281
- Sigstore integration time:
-
Permalink:
vitaliy-ch25/melafit@848eb3a355423498643b34fba99cbb13be81cc7b -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/vitaliy-ch25
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@848eb3a355423498643b34fba99cbb13be81cc7b -
Trigger Event:
release
-
Statement type: