Skip to content

Latest commit

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sleep_classifiers

This code uses scikit-learn to classify sleep based on acceleration and photoplethymography-derived heart rate from the Apple Watch. The paper associated with the work is available here.

Basics

This code has been updated for Python 3.9. The original version of the code used Python 3.7. You can get the source code to generate the figures in the paper here, but you'll need to pull the data from here and add it to the data folder to run the pre-processing step.

Data

  • Data collected using the Apple Watch is available on PhysioNet: link

  • The MESA dataset is available for download at the National Sleep Research Resource. You will have to request access from NSRR for the data.

Pre-processing the data

To convert the raw data into features that can be interpreted by the classifiers, you want to run preprocessing_runner.py. This script is located in the source/preprocessing directory. Here are the steps you need to follow to run that code:

  1. Download the data.
  2. Paste the heart_rate, labels, and motion folders into the data directory in this repository, overwriting the empty folders
  3. Run preprocessing_runner.py. This will take in the raw data for each subject, and use it to generate features to be read in by the classifier. The saved features will get saved to the folder outputs/features/, with the filename corresponding to the type of feature. For instance, the activity count feature for subject 781756 will appear as 781756_count_feature.out.

Notes

  • Generating all the features should take about five minutes
  • The features are text files, and if you want to see what they contain, simply open them in a text editor.
  • You should see print statements that look like this: Cropping data from subject 8692923...
  • Followed by print statements that look like this: Getting valid epochs... Building features...

Making the figures.

The file analysis_runner.py can be used to generate figures showing classifier performance. This script is located in the source/analysis directory. You can comment and uncomment the call list of functions at the bottom of the script to only produce the figures you want to run.

The figure will be saved in the folder outputs/figures as .png files.

The list of available analysis functions are as follows:

  • figure_leave_one_out_roc_and_pr(): Makes PR and ROC curves for the Apple Watch data by training on all but one subject, and testing on the holdout subject

  • figures_mc_sleep_wake(): Makes PR and ROC curves for the Apple Watch data by training on a random subset of subjects, testing on the holdout subjects, and then repeating this process many times.

  • figures_mc_three_class(): Trains on a random subset of Apple Watch subjects, tests on the remaining holdouts, and generates the "three-class" ROC described in the paper

  • figures_leave_one_out_sleep_wake_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for sleep and wake metrics.

  • figures_leave_one_out_three_class_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for wake, REM, NREM metrics.

  • figures_mesa_sleep_wake(): For MESA data, generates ROC/PR curves for sleep-wake

  • figures_mesa_three_class(): For MESA data, generates wake/NREM/REM analysis

  • figures_compare_time_based_features(): Comparison of time-based features for Apple Watch data; requires MATLAB to run.

Notes

  • This code will not execute if you haven't run preprocessing_runner.py to generate the features first.
  • These figures can take a long time to run.

General notes

  • In the blue motion-only classifier performance lines in Figures 4 and 8 in the paper, labels for REM and NREM sleep are switched. NREM sleep is the dashed line and REM is the dotted line.
  • The subset of the MESA dataset used for comparison in the paper are the first 188 subjects with valid data, in order of increasing Subject ID.
  • Enough people didn't have MATLAB that I've made the circadian feature (which uses MATLAB) not included by default. Instead, the default circadian-like feature is a cosine waveform. You can re-add the circadian feature by setting INCLUDE_CIRCADIAN = True, though this requires MATLAB.

License

This software is open source and under an MIT license.

About

Classify sleep from heart rate and acceleration via Apple Watch

Resources

Stars

223 stars

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - ojwalch/sleep_classifiers: Classify sleep from heart rate and acceleration via Apple Watch · GitHub
Skip to content

Latest commit

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sleep_classifiers

This code uses scikit-learn to classify sleep based on acceleration and photoplethymography-derived heart rate from the Apple Watch. The paper associated with the work is available here.

Basics

This code has been updated for Python 3.9. The original version of the code used Python 3.7. You can get the source code to generate the figures in the paper here, but you'll need to pull the data from here and add it to the data folder to run the pre-processing step.

Data

  • Data collected using the Apple Watch is available on PhysioNet: link

  • The MESA dataset is available for download at the National Sleep Research Resource. You will have to request access from NSRR for the data.

Pre-processing the data

To convert the raw data into features that can be interpreted by the classifiers, you want to run preprocessing_runner.py. This script is located in the source/preprocessing directory. Here are the steps you need to follow to run that code:

  1. Download the data.
  2. Paste the heart_rate, labels, and motion folders into the data directory in this repository, overwriting the empty folders
  3. Run preprocessing_runner.py. This will take in the raw data for each subject, and use it to generate features to be read in by the classifier. The saved features will get saved to the folder outputs/features/, with the filename corresponding to the type of feature. For instance, the activity count feature for subject 781756 will appear as 781756_count_feature.out.

Notes

  • Generating all the features should take about five minutes
  • The features are text files, and if you want to see what they contain, simply open them in a text editor.
  • You should see print statements that look like this: Cropping data from subject 8692923...
  • Followed by print statements that look like this: Getting valid epochs... Building features...

Making the figures.

The file analysis_runner.py can be used to generate figures showing classifier performance. This script is located in the source/analysis directory. You can comment and uncomment the call list of functions at the bottom of the script to only produce the figures you want to run.

The figure will be saved in the folder outputs/figures as .png files.

The list of available analysis functions are as follows:

  • figure_leave_one_out_roc_and_pr(): Makes PR and ROC curves for the Apple Watch data by training on all but one subject, and testing on the holdout subject

  • figures_mc_sleep_wake(): Makes PR and ROC curves for the Apple Watch data by training on a random subset of subjects, testing on the holdout subjects, and then repeating this process many times.

  • figures_mc_three_class(): Trains on a random subset of Apple Watch subjects, tests on the remaining holdouts, and generates the "three-class" ROC described in the paper

  • figures_leave_one_out_sleep_wake_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for sleep and wake metrics.

  • figures_leave_one_out_three_class_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for wake, REM, NREM metrics.

  • figures_mesa_sleep_wake(): For MESA data, generates ROC/PR curves for sleep-wake

  • figures_mesa_three_class(): For MESA data, generates wake/NREM/REM analysis

  • figures_compare_time_based_features(): Comparison of time-based features for Apple Watch data; requires MATLAB to run.

Notes

  • This code will not execute if you haven't run preprocessing_runner.py to generate the features first.
  • These figures can take a long time to run.

General notes

  • In the blue motion-only classifier performance lines in Figures 4 and 8 in the paper, labels for REM and NREM sleep are switched. NREM sleep is the dashed line and REM is the dotted line.
  • The subset of the MESA dataset used for comparison in the paper are the first 188 subjects with valid data, in order of increasing Subject ID.
  • Enough people didn't have MATLAB that I've made the circadian feature (which uses MATLAB) not included by default. Instead, the default circadian-like feature is a cosine waveform. You can re-add the circadian feature by setting INCLUDE_CIRCADIAN = True, though this requires MATLAB.

License

This software is open source and under an MIT license.

About

Classify sleep from heart rate and acceleration via Apple Watch

Resources

Stars

223 stars

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ojwalch/sleep_classifiers: Classify sleep from heart rate and acceleration via Apple Watch · GitHub
Skip to content

Latest commit

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sleep_classifiers

This code uses scikit-learn to classify sleep based on acceleration and photoplethymography-derived heart rate from the Apple Watch. The paper associated with the work is available here.

Basics

This code has been updated for Python 3.9. The original version of the code used Python 3.7. You can get the source code to generate the figures in the paper here, but you'll need to pull the data from here and add it to the data folder to run the pre-processing step.

Data

  • Data collected using the Apple Watch is available on PhysioNet: link

  • The MESA dataset is available for download at the National Sleep Research Resource. You will have to request access from NSRR for the data.

Pre-processing the data

To convert the raw data into features that can be interpreted by the classifiers, you want to run preprocessing_runner.py. This script is located in the source/preprocessing directory. Here are the steps you need to follow to run that code:

  1. Download the data.
  2. Paste the heart_rate, labels, and motion folders into the data directory in this repository, overwriting the empty folders
  3. Run preprocessing_runner.py. This will take in the raw data for each subject, and use it to generate features to be read in by the classifier. The saved features will get saved to the folder outputs/features/, with the filename corresponding to the type of feature. For instance, the activity count feature for subject 781756 will appear as 781756_count_feature.out.

Notes

  • Generating all the features should take about five minutes
  • The features are text files, and if you want to see what they contain, simply open them in a text editor.
  • You should see print statements that look like this: Cropping data from subject 8692923...
  • Followed by print statements that look like this: Getting valid epochs... Building features...

Making the figures.

The file analysis_runner.py can be used to generate figures showing classifier performance. This script is located in the source/analysis directory. You can comment and uncomment the call list of functions at the bottom of the script to only produce the figures you want to run.

The figure will be saved in the folder outputs/figures as .png files.

The list of available analysis functions are as follows:

  • figure_leave_one_out_roc_and_pr(): Makes PR and ROC curves for the Apple Watch data by training on all but one subject, and testing on the holdout subject

  • figures_mc_sleep_wake(): Makes PR and ROC curves for the Apple Watch data by training on a random subset of subjects, testing on the holdout subjects, and then repeating this process many times.

  • figures_mc_three_class(): Trains on a random subset of Apple Watch subjects, tests on the remaining holdouts, and generates the "three-class" ROC described in the paper

  • figures_leave_one_out_sleep_wake_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for sleep and wake metrics.

  • figures_leave_one_out_three_class_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for wake, REM, NREM metrics.

  • figures_mesa_sleep_wake(): For MESA data, generates ROC/PR curves for sleep-wake

  • figures_mesa_three_class(): For MESA data, generates wake/NREM/REM analysis

  • figures_compare_time_based_features(): Comparison of time-based features for Apple Watch data; requires MATLAB to run.

Notes

  • This code will not execute if you haven't run preprocessing_runner.py to generate the features first.
  • These figures can take a long time to run.

General notes

  • In the blue motion-only classifier performance lines in Figures 4 and 8 in the paper, labels for REM and NREM sleep are switched. NREM sleep is the dashed line and REM is the dotted line.
  • The subset of the MESA dataset used for comparison in the paper are the first 188 subjects with valid data, in order of increasing Subject ID.
  • Enough people didn't have MATLAB that I've made the circadian feature (which uses MATLAB) not included by default. Instead, the default circadian-like feature is a cosine waveform. You can re-add the circadian feature by setting INCLUDE_CIRCADIAN = True, though this requires MATLAB.

License

This software is open source and under an MIT license.

About

Classify sleep from heart rate and acceleration via Apple Watch

Resources

Stars

223 stars

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ojwalch/sleep_classifiers: Classify sleep from heart rate and acceleration via Apple Watch · GitHub
Skip to content

Latest commit

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sleep_classifiers

This code uses scikit-learn to classify sleep based on acceleration and photoplethymography-derived heart rate from the Apple Watch. The paper associated with the work is available here.

Basics

This code has been updated for Python 3.9. The original version of the code used Python 3.7. You can get the source code to generate the figures in the paper here, but you'll need to pull the data from here and add it to the data folder to run the pre-processing step.

Data

  • Data collected using the Apple Watch is available on PhysioNet: link

  • The MESA dataset is available for download at the National Sleep Research Resource. You will have to request access from NSRR for the data.

Pre-processing the data

To convert the raw data into features that can be interpreted by the classifiers, you want to run preprocessing_runner.py. This script is located in the source/preprocessing directory. Here are the steps you need to follow to run that code:

  1. Download the data.
  2. Paste the heart_rate, labels, and motion folders into the data directory in this repository, overwriting the empty folders
  3. Run preprocessing_runner.py. This will take in the raw data for each subject, and use it to generate features to be read in by the classifier. The saved features will get saved to the folder outputs/features/, with the filename corresponding to the type of feature. For instance, the activity count feature for subject 781756 will appear as 781756_count_feature.out.

Notes

  • Generating all the features should take about five minutes
  • The features are text files, and if you want to see what they contain, simply open them in a text editor.
  • You should see print statements that look like this: Cropping data from subject 8692923...
  • Followed by print statements that look like this: Getting valid epochs... Building features...

Making the figures.

The file analysis_runner.py can be used to generate figures showing classifier performance. This script is located in the source/analysis directory. You can comment and uncomment the call list of functions at the bottom of the script to only produce the figures you want to run.

The figure will be saved in the folder outputs/figures as .png files.

The list of available analysis functions are as follows:

  • figure_leave_one_out_roc_and_pr(): Makes PR and ROC curves for the Apple Watch data by training on all but one subject, and testing on the holdout subject

  • figures_mc_sleep_wake(): Makes PR and ROC curves for the Apple Watch data by training on a random subset of subjects, testing on the holdout subjects, and then repeating this process many times.

  • figures_mc_three_class(): Trains on a random subset of Apple Watch subjects, tests on the remaining holdouts, and generates the "three-class" ROC described in the paper

  • figures_leave_one_out_sleep_wake_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for sleep and wake metrics.

  • figures_leave_one_out_three_class_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for wake, REM, NREM metrics.

  • figures_mesa_sleep_wake(): For MESA data, generates ROC/PR curves for sleep-wake

  • figures_mesa_three_class(): For MESA data, generates wake/NREM/REM analysis

  • figures_compare_time_based_features(): Comparison of time-based features for Apple Watch data; requires MATLAB to run.

Notes

  • This code will not execute if you haven't run preprocessing_runner.py to generate the features first.
  • These figures can take a long time to run.

General notes

  • In the blue motion-only classifier performance lines in Figures 4 and 8 in the paper, labels for REM and NREM sleep are switched. NREM sleep is the dashed line and REM is the dotted line.
  • The subset of the MESA dataset used for comparison in the paper are the first 188 subjects with valid data, in order of increasing Subject ID.
  • Enough people didn't have MATLAB that I've made the circadian feature (which uses MATLAB) not included by default. Instead, the default circadian-like feature is a cosine waveform. You can re-add the circadian feature by setting INCLUDE_CIRCADIAN = True, though this requires MATLAB.

License

This software is open source and under an MIT license.

About

Classify sleep from heart rate and acceleration via Apple Watch

Resources

Stars

223 stars

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - ojwalch/sleep_classifiers: Classify sleep from heart rate and acceleration via Apple Watch · GitHub
Skip to content

Latest commit

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sleep_classifiers

This code uses scikit-learn to classify sleep based on acceleration and photoplethymography-derived heart rate from the Apple Watch. The paper associated with the work is available here.

Basics

This code has been updated for Python 3.9. The original version of the code used Python 3.7. You can get the source code to generate the figures in the paper here, but you'll need to pull the data from here and add it to the data folder to run the pre-processing step.

Data

  • Data collected using the Apple Watch is available on PhysioNet: link

  • The MESA dataset is available for download at the National Sleep Research Resource. You will have to request access from NSRR for the data.

Pre-processing the data

To convert the raw data into features that can be interpreted by the classifiers, you want to run preprocessing_runner.py. This script is located in the source/preprocessing directory. Here are the steps you need to follow to run that code:

  1. Download the data.
  2. Paste the heart_rate, labels, and motion folders into the data directory in this repository, overwriting the empty folders
  3. Run preprocessing_runner.py. This will take in the raw data for each subject, and use it to generate features to be read in by the classifier. The saved features will get saved to the folder outputs/features/, with the filename corresponding to the type of feature. For instance, the activity count feature for subject 781756 will appear as 781756_count_feature.out.

Notes

  • Generating all the features should take about five minutes
  • The features are text files, and if you want to see what they contain, simply open them in a text editor.
  • You should see print statements that look like this: Cropping data from subject 8692923...
  • Followed by print statements that look like this: Getting valid epochs... Building features...

Making the figures.

The file analysis_runner.py can be used to generate figures showing classifier performance. This script is located in the source/analysis directory. You can comment and uncomment the call list of functions at the bottom of the script to only produce the figures you want to run.

The figure will be saved in the folder outputs/figures as .png files.

The list of available analysis functions are as follows:

  • figure_leave_one_out_roc_and_pr(): Makes PR and ROC curves for the Apple Watch data by training on all but one subject, and testing on the holdout subject

  • figures_mc_sleep_wake(): Makes PR and ROC curves for the Apple Watch data by training on a random subset of subjects, testing on the holdout subjects, and then repeating this process many times.

  • figures_mc_three_class(): Trains on a random subset of Apple Watch subjects, tests on the remaining holdouts, and generates the "three-class" ROC described in the paper

  • figures_leave_one_out_sleep_wake_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for sleep and wake metrics.

  • figures_leave_one_out_three_class_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for wake, REM, NREM metrics.

  • figures_mesa_sleep_wake(): For MESA data, generates ROC/PR curves for sleep-wake

  • figures_mesa_three_class(): For MESA data, generates wake/NREM/REM analysis

  • figures_compare_time_based_features(): Comparison of time-based features for Apple Watch data; requires MATLAB to run.

Notes

  • This code will not execute if you haven't run preprocessing_runner.py to generate the features first.
  • These figures can take a long time to run.

General notes

  • In the blue motion-only classifier performance lines in Figures 4 and 8 in the paper, labels for REM and NREM sleep are switched. NREM sleep is the dashed line and REM is the dotted line.
  • The subset of the MESA dataset used for comparison in the paper are the first 188 subjects with valid data, in order of increasing Subject ID.
  • Enough people didn't have MATLAB that I've made the circadian feature (which uses MATLAB) not included by default. Instead, the default circadian-like feature is a cosine waveform. You can re-add the circadian feature by setting INCLUDE_CIRCADIAN = True, though this requires MATLAB.

License

This software is open source and under an MIT license.

About

Classify sleep from heart rate and acceleration via Apple Watch

Resources

Stars

223 stars

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ojwalch/sleep_classifiers: Classify sleep from heart rate and acceleration via Apple Watch · GitHub
Skip to content

Latest commit

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sleep_classifiers

This code uses scikit-learn to classify sleep based on acceleration and photoplethymography-derived heart rate from the Apple Watch. The paper associated with the work is available here.

Basics

This code has been updated for Python 3.9. The original version of the code used Python 3.7. You can get the source code to generate the figures in the paper here, but you'll need to pull the data from here and add it to the data folder to run the pre-processing step.

Data

  • Data collected using the Apple Watch is available on PhysioNet: link

  • The MESA dataset is available for download at the National Sleep Research Resource. You will have to request access from NSRR for the data.

Pre-processing the data

To convert the raw data into features that can be interpreted by the classifiers, you want to run preprocessing_runner.py. This script is located in the source/preprocessing directory. Here are the steps you need to follow to run that code:

  1. Download the data.
  2. Paste the heart_rate, labels, and motion folders into the data directory in this repository, overwriting the empty folders
  3. Run preprocessing_runner.py. This will take in the raw data for each subject, and use it to generate features to be read in by the classifier. The saved features will get saved to the folder outputs/features/, with the filename corresponding to the type of feature. For instance, the activity count feature for subject 781756 will appear as 781756_count_feature.out.

Notes

  • Generating all the features should take about five minutes
  • The features are text files, and if you want to see what they contain, simply open them in a text editor.
  • You should see print statements that look like this: Cropping data from subject 8692923...
  • Followed by print statements that look like this: Getting valid epochs... Building features...

Making the figures.

The file analysis_runner.py can be used to generate figures showing classifier performance. This script is located in the source/analysis directory. You can comment and uncomment the call list of functions at the bottom of the script to only produce the figures you want to run.

The figure will be saved in the folder outputs/figures as .png files.

The list of available analysis functions are as follows:

  • figure_leave_one_out_roc_and_pr(): Makes PR and ROC curves for the Apple Watch data by training on all but one subject, and testing on the holdout subject

  • figures_mc_sleep_wake(): Makes PR and ROC curves for the Apple Watch data by training on a random subset of subjects, testing on the holdout subjects, and then repeating this process many times.

  • figures_mc_three_class(): Trains on a random subset of Apple Watch subjects, tests on the remaining holdouts, and generates the "three-class" ROC described in the paper

  • figures_leave_one_out_sleep_wake_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for sleep and wake metrics.

  • figures_leave_one_out_three_class_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for wake, REM, NREM metrics.

  • figures_mesa_sleep_wake(): For MESA data, generates ROC/PR curves for sleep-wake

  • figures_mesa_three_class(): For MESA data, generates wake/NREM/REM analysis

  • figures_compare_time_based_features(): Comparison of time-based features for Apple Watch data; requires MATLAB to run.

Notes

  • This code will not execute if you haven't run preprocessing_runner.py to generate the features first.
  • These figures can take a long time to run.

General notes

  • In the blue motion-only classifier performance lines in Figures 4 and 8 in the paper, labels for REM and NREM sleep are switched. NREM sleep is the dashed line and REM is the dotted line.
  • The subset of the MESA dataset used for comparison in the paper are the first 188 subjects with valid data, in order of increasing Subject ID.
  • Enough people didn't have MATLAB that I've made the circadian feature (which uses MATLAB) not included by default. Instead, the default circadian-like feature is a cosine waveform. You can re-add the circadian feature by setting INCLUDE_CIRCADIAN = True, though this requires MATLAB.

License

This software is open source and under an MIT license.

About

Classify sleep from heart rate and acceleration via Apple Watch

Resources

Stars

223 stars

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ojwalch/sleep_classifiers: Classify sleep from heart rate and acceleration via Apple Watch · GitHub
Skip to content

Latest commit

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sleep_classifiers

This code uses scikit-learn to classify sleep based on acceleration and photoplethymography-derived heart rate from the Apple Watch. The paper associated with the work is available here.

Basics

This code has been updated for Python 3.9. The original version of the code used Python 3.7. You can get the source code to generate the figures in the paper here, but you'll need to pull the data from here and add it to the data folder to run the pre-processing step.

Data

  • Data collected using the Apple Watch is available on PhysioNet: link

  • The MESA dataset is available for download at the National Sleep Research Resource. You will have to request access from NSRR for the data.

Pre-processing the data

To convert the raw data into features that can be interpreted by the classifiers, you want to run preprocessing_runner.py. This script is located in the source/preprocessing directory. Here are the steps you need to follow to run that code:

  1. Download the data.
  2. Paste the heart_rate, labels, and motion folders into the data directory in this repository, overwriting the empty folders
  3. Run preprocessing_runner.py. This will take in the raw data for each subject, and use it to generate features to be read in by the classifier. The saved features will get saved to the folder outputs/features/, with the filename corresponding to the type of feature. For instance, the activity count feature for subject 781756 will appear as 781756_count_feature.out.

Notes

  • Generating all the features should take about five minutes
  • The features are text files, and if you want to see what they contain, simply open them in a text editor.
  • You should see print statements that look like this: Cropping data from subject 8692923...
  • Followed by print statements that look like this: Getting valid epochs... Building features...

Making the figures.

The file analysis_runner.py can be used to generate figures showing classifier performance. This script is located in the source/analysis directory. You can comment and uncomment the call list of functions at the bottom of the script to only produce the figures you want to run.

The figure will be saved in the folder outputs/figures as .png files.

The list of available analysis functions are as follows:

  • figure_leave_one_out_roc_and_pr(): Makes PR and ROC curves for the Apple Watch data by training on all but one subject, and testing on the holdout subject

  • figures_mc_sleep_wake(): Makes PR and ROC curves for the Apple Watch data by training on a random subset of subjects, testing on the holdout subjects, and then repeating this process many times.

  • figures_mc_three_class(): Trains on a random subset of Apple Watch subjects, tests on the remaining holdouts, and generates the "three-class" ROC described in the paper

  • figures_leave_one_out_sleep_wake_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for sleep and wake metrics.

  • figures_leave_one_out_three_class_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for wake, REM, NREM metrics.

  • figures_mesa_sleep_wake(): For MESA data, generates ROC/PR curves for sleep-wake

  • figures_mesa_three_class(): For MESA data, generates wake/NREM/REM analysis

  • figures_compare_time_based_features(): Comparison of time-based features for Apple Watch data; requires MATLAB to run.

Notes

  • This code will not execute if you haven't run preprocessing_runner.py to generate the features first.
  • These figures can take a long time to run.

General notes

  • In the blue motion-only classifier performance lines in Figures 4 and 8 in the paper, labels for REM and NREM sleep are switched. NREM sleep is the dashed line and REM is the dotted line.
  • The subset of the MESA dataset used for comparison in the paper are the first 188 subjects with valid data, in order of increasing Subject ID.
  • Enough people didn't have MATLAB that I've made the circadian feature (which uses MATLAB) not included by default. Instead, the default circadian-like feature is a cosine waveform. You can re-add the circadian feature by setting INCLUDE_CIRCADIAN = True, though this requires MATLAB.

License

This software is open source and under an MIT license.

About

Classify sleep from heart rate and acceleration via Apple Watch

Resources

Stars

223 stars

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - ojwalch/sleep_classifiers: Classify sleep from heart rate and acceleration via Apple Watch · GitHub
Skip to content

Latest commit

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sleep_classifiers

This code uses scikit-learn to classify sleep based on acceleration and photoplethymography-derived heart rate from the Apple Watch. The paper associated with the work is available here.

Basics

This code has been updated for Python 3.9. The original version of the code used Python 3.7. You can get the source code to generate the figures in the paper here, but you'll need to pull the data from here and add it to the data folder to run the pre-processing step.

Data

  • Data collected using the Apple Watch is available on PhysioNet: link

  • The MESA dataset is available for download at the National Sleep Research Resource. You will have to request access from NSRR for the data.

Pre-processing the data

To convert the raw data into features that can be interpreted by the classifiers, you want to run preprocessing_runner.py. This script is located in the source/preprocessing directory. Here are the steps you need to follow to run that code:

  1. Download the data.
  2. Paste the heart_rate, labels, and motion folders into the data directory in this repository, overwriting the empty folders
  3. Run preprocessing_runner.py. This will take in the raw data for each subject, and use it to generate features to be read in by the classifier. The saved features will get saved to the folder outputs/features/, with the filename corresponding to the type of feature. For instance, the activity count feature for subject 781756 will appear as 781756_count_feature.out.

Notes

  • Generating all the features should take about five minutes
  • The features are text files, and if you want to see what they contain, simply open them in a text editor.
  • You should see print statements that look like this: Cropping data from subject 8692923...
  • Followed by print statements that look like this: Getting valid epochs... Building features...

Making the figures.

The file analysis_runner.py can be used to generate figures showing classifier performance. This script is located in the source/analysis directory. You can comment and uncomment the call list of functions at the bottom of the script to only produce the figures you want to run.

The figure will be saved in the folder outputs/figures as .png files.

The list of available analysis functions are as follows:

  • figure_leave_one_out_roc_and_pr(): Makes PR and ROC curves for the Apple Watch data by training on all but one subject, and testing on the holdout subject

  • figures_mc_sleep_wake(): Makes PR and ROC curves for the Apple Watch data by training on a random subset of subjects, testing on the holdout subjects, and then repeating this process many times.

  • figures_mc_three_class(): Trains on a random subset of Apple Watch subjects, tests on the remaining holdouts, and generates the "three-class" ROC described in the paper

  • figures_leave_one_out_sleep_wake_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for sleep and wake metrics.

  • figures_leave_one_out_three_class_performance(): For Apple Watch subjects, trains on everybody but one subject, tests on that holdout subject, and then generates Bland-Altman plots for wake, REM, NREM metrics.

  • figures_mesa_sleep_wake(): For MESA data, generates ROC/PR curves for sleep-wake

  • figures_mesa_three_class(): For MESA data, generates wake/NREM/REM analysis

  • figures_compare_time_based_features(): Comparison of time-based features for Apple Watch data; requires MATLAB to run.

Notes

  • This code will not execute if you haven't run preprocessing_runner.py to generate the features first.
  • These figures can take a long time to run.

General notes

  • In the blue motion-only classifier performance lines in Figures 4 and 8 in the paper, labels for REM and NREM sleep are switched. NREM sleep is the dashed line and REM is the dotted line.
  • The subset of the MESA dataset used for comparison in the paper are the first 188 subjects with valid data, in order of increasing Subject ID.
  • Enough people didn't have MATLAB that I've made the circadian feature (which uses MATLAB) not included by default. Instead, the default circadian-like feature is a cosine waveform. You can re-add the circadian feature by setting INCLUDE_CIRCADIAN = True, though this requires MATLAB.

License

This software is open source and under an MIT license.

About

Classify sleep from heart rate and acceleration via Apple Watch

Resources

Stars

223 stars

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages