From 6c3b105dd113490a1ccd31a6f8046ac723f5cd1d Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 3 Dec 2020 16:51:49 +0000 Subject: [PATCH] Deployed fca0528 to 0.1 with MkDocs 1.1.2 and mike 0.5.5 --- 0.1/file-structure/index.html | 12 +++--- 0.1/img/files.png | Bin 539484 -> 321183 bytes 0.1/search/search_index.json | 2 +- 0.1/sitemap.xml | 72 +++++++++++++++---------------- 0.1/sitemap.xml.gz | Bin 213 -> 214 bytes latest/file-structure/index.html | 12 +++--- latest/img/files.png | Bin 539484 -> 321183 bytes latest/search/search_index.json | 2 +- latest/sitemap.xml | 72 +++++++++++++++---------------- latest/sitemap.xml.gz | Bin 213 -> 214 bytes 10 files changed, 88 insertions(+), 84 deletions(-) diff --git a/0.1/file-structure/index.html b/0.1/file-structure/index.html index 66b2f900..fb682026 100644 --- a/0.1/file-structure/index.html +++ b/0.1/file-structure/index.html @@ -895,13 +895,15 @@

File Structure

Tip

-

Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation, then to Configuration, and then to Execution

+
-

All paths mentioned in this page are relative to RAPIDS’ root folder.

-

If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file, participants files, time segment files, and the config.yaml file. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more.

+

If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file, participants files, time segment files, and the config.yaml file as instructed in the Configuration page. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more.

All data is saved in data/. The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor.

-

All the source code is saved in src/. The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data.

-

There are other important files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies config.yaml and .env the Snakefile file will decide what Snakemake rules have to be executed to produce the required output files (behavioral features) and what scripts are in charge of producing such files. In addition, users can add or modifiy files in the data folder (for example to configure the participants files or the time segment files).

+

RAPIDS source code is saved in src/. The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.).

+

In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.).

Interaction diagram between the user, and important files in RAPIDS
diff --git a/0.1/img/files.png b/0.1/img/files.png index 58ee5dec797ec1e0d3a9a7ffbcd2ea53c6b92d5d..1fef7eebd110c8f0a3c69025c16892469c9da3c8 100644 GIT binary patch literal 321183 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 z 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 Zr~cIPe%b7g7e6xqfv2mV%Q~loCICKJ&$s{p literal 539484 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�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%0A%ZeWQlx?` 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 sI$F??kS dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Frequently Asked Questions"},{"location":"faq/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"faq/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"faq/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"faq/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"faq/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"faq/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"faq/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"faq/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"faq/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"faq/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"faq/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"faq/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"faq/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"file-structure/","text":"File Structure \u00b6 Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. All the source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other important files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies config.yaml and .env the Snakefile file will decide what Snakemake rules have to be executed to produce the required output files (behavioral features) and what scripts are in charge of producing such files. In addition, users can add or modifiy files in the data folder (for example to configure the participants files or the time segment files ). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"file-structure/#file-structure","text":"Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. All the source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other important files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies config.yaml and .env the Snakefile file will decide what Snakemake rules have to be executed to produce the required output files (behavioral features) and what scripts are in charge of producing such files. In addition, users can add or modifiy files in the data folder (for example to configure the participants files or the time segment files ). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files. WIFI \u00b6 There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files. Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files. Conversation \u00b6 The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available.","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files.","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Conversation"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory Steps for Testing \u00b6 To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Steps for Testing"},{"location":"developers/virtual-environments/","text":"Virtual Environments \u00b6 Add new packages \u00b6 Try to install any new package using conda . If a package is not available in one of conda \u2018s channels you can install it with pip but make sure your virtual environment is active. Update your conda environment.yaml \u00b6 After installing a new package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml Update and prune your conda environment from a environment.yaml file \u00b6 Execute the following command in your terminal, see these docs for more information conda env update --prefix ./env --file environment.yml --prune","title":"Virtual Environments"},{"location":"developers/virtual-environments/#virtual-environments","text":"","title":"Virtual Environments"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda . If a package is not available in one of conda \u2018s channels you can install it with pip but make sure your virtual environment is active.","title":"Add new packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing a new package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#update-and-prune-your-conda-environment-from-a-environmentyaml-file","text":"Execute the following command in your terminal, see these docs for more information conda env update --prefix ./env --file environment.yml --prune","title":"Update and prune your conda environment from a environment.yaml file"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday Modify the config.yaml file \u00b6 In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step) Create a provider folder, script and function \u00b6 In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ) Implement your feature extraction code \u00b6 The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step)","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-provider-folder-script-and-function","text":"In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider )","title":"Create a provider folder, script and function"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" Sensor Parameters \u00b6 Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers \u00b6 Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ). Provider Parameters \u00b6 Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. Provider Features \u00b6 Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\"","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#sensor-parameters","text":"Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page.","title":"Sensor Parameters"},{"location":"features/feature-introduction/#sensor-providers","text":"Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ).","title":"Sensor Providers"},{"location":"features/feature-introduction/#provider-parameters","text":"Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page.","title":"Provider Parameters"},{"location":"features/feature-introduction/#provider-features","text":"Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Provider Features"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0 RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"RAPIDS provider"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time_segment , a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time_segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most scanned device during a time_segment across the whole monitoring period Assumptions/Observations NA","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time_segment , a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time_segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most scanned device during a time_segment across the whole monitoring period Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"DORYAB provider"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file. Database credentials \u00b6 Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files. Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York Multiple timezones \u00b6 Support coming soon. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis Automatic creation of participant files \u00b6 You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Device Data Source Configuration \u00b6 You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#database-credentials","text":"Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files.","title":"Database credentials"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"Support coming soon.","title":"Multiple timezones"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#device-data-source-configuration","text":"You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study","title":"Device Data Source Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal Working Example"}]} \ No newline at end of file +{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to RAPIDS documentation \u00b6 Warning The functionality outlined in these docs is implemented in the branch time_segments which we will merge to master soon as release 0.1 . The previous (first) release of RAPIDS along with the old docs will be labeled beta . If you landed on this page feel free to look around, just have in mind that we are polishing the last rough patches before we advertise 0.1 (Nov 16, 2020) Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract behavioral features (a.k.a. digital biomarkers/phenotypes). RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Questions or feedback can be posted on #rapids in AWARE Framework's slack . Bugs should be reported on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution How does it work? \u00b6 RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant. What are the benefits of using RAPIDS? \u00b6 Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Extensible code . You can easily add your own behavioral features in R or Python and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . You can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally. How is it organized? \u00b6 In broad terms the config.yaml , .env file , participants files , time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"Home"},{"location":"#welcome-to-rapids-documentation","text":"Warning The functionality outlined in these docs is implemented in the branch time_segments which we will merge to master soon as release 0.1 . The previous (first) release of RAPIDS along with the old docs will be labeled beta . If you landed on this page feel free to look around, just have in mind that we are polishing the last rough patches before we advertise 0.1 (Nov 16, 2020) Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract behavioral features (a.k.a. digital biomarkers/phenotypes). RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Questions or feedback can be posted on #rapids in AWARE Framework's slack . Bugs should be reported on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution","title":"Welcome to RAPIDS documentation"},{"location":"#how-does-it-work","text":"RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant.","title":"How does it work?"},{"location":"#what-are-the-benefits-of-using-rapids","text":"Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Extensible code . You can easily add your own behavioral features in R or Python and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . You can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally.","title":"What are the benefits of using RAPIDS?"},{"location":"#how-is-it-organized","text":"In broad terms the config.yaml , .env file , participants files , time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"How is it organized?"},{"location":"citation/","text":"Cite RAPIDS and providers \u00b6 RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you! RAPIDS \u00b6 If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246 Panda (accelerometer) \u00b6 If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047. Stachl (applications foreground) \u00b6 If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117 Barnett (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Doryab (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Citation"},{"location":"citation/#cite-rapids-and-providers","text":"RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you!","title":"Cite RAPIDS and providers"},{"location":"citation/#rapids","text":"If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246","title":"RAPIDS"},{"location":"citation/#panda-accelerometer","text":"If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047.","title":"Panda (accelerometer)"},{"location":"citation/#stachl-applications-foreground","text":"If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117","title":"Stachl (applications foreground)"},{"location":"citation/#barnett-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Barnett (locations)"},{"location":"citation/#doryab-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Doryab (locations)"},{"location":"code_of_conduct/","text":"Contributor Covenant Code of Conduct \u00b6 Our Pledge \u00b6 We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Our Standards \u00b6 Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Enforcement Responsibilities \u00b6 Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. Scope \u00b6 This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Enforcement \u00b6 Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. Enforcement Guidelines \u00b6 Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 1. Correction \u00b6 Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 2. Warning \u00b6 Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 3. Temporary Ban \u00b6 Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 4. Permanent Ban \u00b6 Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community. Attribution \u00b6 This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Code of Conduct"},{"location":"code_of_conduct/#contributor-covenant-code-of-conduct","text":"","title":"Contributor Covenant Code of Conduct"},{"location":"code_of_conduct/#our-pledge","text":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","title":"Our Pledge"},{"location":"code_of_conduct/#our-standards","text":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","title":"Our Standards"},{"location":"code_of_conduct/#enforcement-responsibilities","text":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","title":"Enforcement Responsibilities"},{"location":"code_of_conduct/#scope","text":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","title":"Scope"},{"location":"code_of_conduct/#enforcement","text":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","title":"Enforcement"},{"location":"code_of_conduct/#enforcement-guidelines","text":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","title":"Enforcement Guidelines"},{"location":"code_of_conduct/#1-correction","text":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","title":"1. Correction"},{"location":"code_of_conduct/#2-warning","text":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"2. Warning"},{"location":"code_of_conduct/#3-temporary-ban","text":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"3. Temporary Ban"},{"location":"code_of_conduct/#4-permanent-ban","text":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","title":"4. Permanent Ban"},{"location":"code_of_conduct/#attribution","text":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Attribution"},{"location":"faq/","text":"Frequently Asked Questions \u00b6 Cannot connect to your MySQL server \u00b6 Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Frequently Asked Questions"},{"location":"faq/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"faq/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"faq/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"faq/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"faq/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"faq/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"faq/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"faq/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"faq/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"faq/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"faq/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"faq/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"faq/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"file-structure/","text":"File Structure \u00b6 Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"file-structure/#file-structure","text":"Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files. WIFI \u00b6 There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files. Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files. Conversation \u00b6 The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available.","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files.","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Conversation"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory Steps for Testing \u00b6 To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Steps for Testing"},{"location":"developers/virtual-environments/","text":"Virtual Environments \u00b6 Add new packages \u00b6 Try to install any new package using conda . If a package is not available in one of conda \u2018s channels you can install it with pip but make sure your virtual environment is active. Update your conda environment.yaml \u00b6 After installing a new package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml Update and prune your conda environment from a environment.yaml file \u00b6 Execute the following command in your terminal, see these docs for more information conda env update --prefix ./env --file environment.yml --prune","title":"Virtual Environments"},{"location":"developers/virtual-environments/#virtual-environments","text":"","title":"Virtual Environments"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda . If a package is not available in one of conda \u2018s channels you can install it with pip but make sure your virtual environment is active.","title":"Add new packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing a new package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#update-and-prune-your-conda-environment-from-a-environmentyaml-file","text":"Execute the following command in your terminal, see these docs for more information conda env update --prefix ./env --file environment.yml --prune","title":"Update and prune your conda environment from a environment.yaml file"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday Modify the config.yaml file \u00b6 In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step) Create a provider folder, script and function \u00b6 In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ) Implement your feature extraction code \u00b6 The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step)","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-provider-folder-script-and-function","text":"In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider )","title":"Create a provider folder, script and function"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" Sensor Parameters \u00b6 Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers \u00b6 Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ). Provider Parameters \u00b6 Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. Provider Features \u00b6 Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\"","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#sensor-parameters","text":"Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page.","title":"Sensor Parameters"},{"location":"features/feature-introduction/#sensor-providers","text":"Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ).","title":"Sensor Providers"},{"location":"features/feature-introduction/#provider-parameters","text":"Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page.","title":"Provider Parameters"},{"location":"features/feature-introduction/#provider-features","text":"Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Provider Features"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0 RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"RAPIDS provider"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time_segment , a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time_segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most scanned device during a time_segment across the whole monitoring period Assumptions/Observations NA","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time_segment , a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time_segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most scanned device during a time_segment across the whole monitoring period Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"DORYAB provider"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file. Database credentials \u00b6 Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files. Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York Multiple timezones \u00b6 Support coming soon. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis Automatic creation of participant files \u00b6 You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Device Data Source Configuration \u00b6 You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#database-credentials","text":"Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files.","title":"Database credentials"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"Support coming soon.","title":"Multiple timezones"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#device-data-source-configuration","text":"You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study","title":"Device Data Source Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal Working Example"}]} \ No newline at end of file diff --git a/0.1/sitemap.xml b/0.1/sitemap.xml index 7e02bf4e..d018a09e 100644 --- a/0.1/sitemap.xml +++ b/0.1/sitemap.xml @@ -1,147 +1,147 @@ None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily \ No newline at end of file diff --git a/0.1/sitemap.xml.gz b/0.1/sitemap.xml.gz index 40efebc501f25b75b836f0ba54feec55cb08c729..4c7772715a3212064978fd3da90d2c06afb06091 100644 GIT binary patch delta 195 zcmcc0c#V-=zMF$%srbo>?6UPy;-*vb`uwUGoHnX14B(F1yZ6GCBib`;#2!4a|Cv_t zTS~X;m8HacsTjewiDjqCkA3Cc7w7j>Zu_DK{WsZU1GRQvc%XRfrN_%nIw~_(xLdM5 zdOnZMbcy$ZXb(xtgo){{jh`M}(=PnxS3JxAen6YWFTX2m(o#dG=S-isJ!ka_N8?>_ t_tR>{=bC&w`_g|?nZ;S2h=fK~F=XOzcj%hvU%B1<8@V%%&*f)e008$VSkV9g delta 194 zcmcb{c$JY|zMF$XTz|{$LZ%r<=NU<$|O5rmTDIwa7Ou%v;5d z$K;h^ywY8#Qzzt38)<8YOq;Q1n)>^m1y8^5hWc!NubMvRD(`y9^XH?tg??Fa$0%Xl s!8Yv^TR6U@-r|10C(nA`2YX_ diff --git a/latest/file-structure/index.html b/latest/file-structure/index.html index 66b2f900..fb682026 100644 --- a/latest/file-structure/index.html +++ b/latest/file-structure/index.html @@ -895,13 +895,15 @@

File Structure

Tip

-

Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation, then to Configuration, and then to Execution

+
    +
  • Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation, then to Configuration, and then to Execution
  • +
  • All paths mentioned in this page are relative to RAPIDS’ root folder.
  • +
-

All paths mentioned in this page are relative to RAPIDS’ root folder.

-

If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file, participants files, time segment files, and the config.yaml file. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more.

+

If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file, participants files, time segment files, and the config.yaml file as instructed in the Configuration page. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more.

All data is saved in data/. The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor.

-

All the source code is saved in src/. The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data.

-

There are other important files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies config.yaml and .env the Snakefile file will decide what Snakemake rules have to be executed to produce the required output files (behavioral features) and what scripts are in charge of producing such files. In addition, users can add or modifiy files in the data folder (for example to configure the participants files or the time segment files).

+

RAPIDS source code is saved in src/. The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.).

+

In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.).

Interaction diagram between the user, and important files in RAPIDS
diff --git a/latest/img/files.png b/latest/img/files.png index 58ee5dec797ec1e0d3a9a7ffbcd2ea53c6b92d5d..1fef7eebd110c8f0a3c69025c16892469c9da3c8 100644 GIT binary patch literal 321183 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 z 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 Zr~cIPe%b7g7e6xqfv2mV%Q~loCICKJ&$s{p literal 539484 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�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%0A%ZeWQlx?` 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 sI$F??kS dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Frequently Asked Questions"},{"location":"faq/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"faq/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"faq/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"faq/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"faq/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"faq/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"faq/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"faq/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"faq/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"faq/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"faq/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"faq/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"faq/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"file-structure/","text":"File Structure \u00b6 Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. All the source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other important files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies config.yaml and .env the Snakefile file will decide what Snakemake rules have to be executed to produce the required output files (behavioral features) and what scripts are in charge of producing such files. In addition, users can add or modifiy files in the data folder (for example to configure the participants files or the time segment files ). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"file-structure/#file-structure","text":"Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. All the source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other important files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies config.yaml and .env the Snakefile file will decide what Snakemake rules have to be executed to produce the required output files (behavioral features) and what scripts are in charge of producing such files. In addition, users can add or modifiy files in the data folder (for example to configure the participants files or the time segment files ). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files. WIFI \u00b6 There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files. Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files. Conversation \u00b6 The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available.","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files.","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Conversation"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory Steps for Testing \u00b6 To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Steps for Testing"},{"location":"developers/virtual-environments/","text":"Virtual Environments \u00b6 Add new packages \u00b6 Try to install any new package using conda . If a package is not available in one of conda \u2018s channels you can install it with pip but make sure your virtual environment is active. Update your conda environment.yaml \u00b6 After installing a new package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml Update and prune your conda environment from a environment.yaml file \u00b6 Execute the following command in your terminal, see these docs for more information conda env update --prefix ./env --file environment.yml --prune","title":"Virtual Environments"},{"location":"developers/virtual-environments/#virtual-environments","text":"","title":"Virtual Environments"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda . If a package is not available in one of conda \u2018s channels you can install it with pip but make sure your virtual environment is active.","title":"Add new packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing a new package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#update-and-prune-your-conda-environment-from-a-environmentyaml-file","text":"Execute the following command in your terminal, see these docs for more information conda env update --prefix ./env --file environment.yml --prune","title":"Update and prune your conda environment from a environment.yaml file"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday Modify the config.yaml file \u00b6 In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step) Create a provider folder, script and function \u00b6 In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ) Implement your feature extraction code \u00b6 The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step)","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-provider-folder-script-and-function","text":"In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider )","title":"Create a provider folder, script and function"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" Sensor Parameters \u00b6 Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers \u00b6 Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ). Provider Parameters \u00b6 Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. Provider Features \u00b6 Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\"","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#sensor-parameters","text":"Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page.","title":"Sensor Parameters"},{"location":"features/feature-introduction/#sensor-providers","text":"Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ).","title":"Sensor Providers"},{"location":"features/feature-introduction/#provider-parameters","text":"Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page.","title":"Provider Parameters"},{"location":"features/feature-introduction/#provider-features","text":"Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Provider Features"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0 RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"RAPIDS provider"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time_segment , a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time_segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most scanned device during a time_segment across the whole monitoring period Assumptions/Observations NA","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time_segment , a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time_segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most scanned device during a time_segment across the whole monitoring period Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"DORYAB provider"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file. Database credentials \u00b6 Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files. Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York Multiple timezones \u00b6 Support coming soon. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis Automatic creation of participant files \u00b6 You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Device Data Source Configuration \u00b6 You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#database-credentials","text":"Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files.","title":"Database credentials"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"Support coming soon.","title":"Multiple timezones"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#device-data-source-configuration","text":"You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study","title":"Device Data Source Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal Working Example"}]} \ No newline at end of file +{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to RAPIDS documentation \u00b6 Warning The functionality outlined in these docs is implemented in the branch time_segments which we will merge to master soon as release 0.1 . The previous (first) release of RAPIDS along with the old docs will be labeled beta . If you landed on this page feel free to look around, just have in mind that we are polishing the last rough patches before we advertise 0.1 (Nov 16, 2020) Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract behavioral features (a.k.a. digital biomarkers/phenotypes). RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Questions or feedback can be posted on #rapids in AWARE Framework's slack . Bugs should be reported on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution How does it work? \u00b6 RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant. What are the benefits of using RAPIDS? \u00b6 Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Extensible code . You can easily add your own behavioral features in R or Python and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . You can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally. How is it organized? \u00b6 In broad terms the config.yaml , .env file , participants files , time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"Home"},{"location":"#welcome-to-rapids-documentation","text":"Warning The functionality outlined in these docs is implemented in the branch time_segments which we will merge to master soon as release 0.1 . The previous (first) release of RAPIDS along with the old docs will be labeled beta . If you landed on this page feel free to look around, just have in mind that we are polishing the last rough patches before we advertise 0.1 (Nov 16, 2020) Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract behavioral features (a.k.a. digital biomarkers/phenotypes). RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Questions or feedback can be posted on #rapids in AWARE Framework's slack . Bugs should be reported on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution","title":"Welcome to RAPIDS documentation"},{"location":"#how-does-it-work","text":"RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant.","title":"How does it work?"},{"location":"#what-are-the-benefits-of-using-rapids","text":"Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Extensible code . You can easily add your own behavioral features in R or Python and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . You can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally.","title":"What are the benefits of using RAPIDS?"},{"location":"#how-is-it-organized","text":"In broad terms the config.yaml , .env file , participants files , time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"How is it organized?"},{"location":"citation/","text":"Cite RAPIDS and providers \u00b6 RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you! RAPIDS \u00b6 If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246 Panda (accelerometer) \u00b6 If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047. Stachl (applications foreground) \u00b6 If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117 Barnett (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Doryab (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Citation"},{"location":"citation/#cite-rapids-and-providers","text":"RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you!","title":"Cite RAPIDS and providers"},{"location":"citation/#rapids","text":"If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246","title":"RAPIDS"},{"location":"citation/#panda-accelerometer","text":"If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047.","title":"Panda (accelerometer)"},{"location":"citation/#stachl-applications-foreground","text":"If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117","title":"Stachl (applications foreground)"},{"location":"citation/#barnett-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Barnett (locations)"},{"location":"citation/#doryab-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Doryab (locations)"},{"location":"code_of_conduct/","text":"Contributor Covenant Code of Conduct \u00b6 Our Pledge \u00b6 We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Our Standards \u00b6 Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Enforcement Responsibilities \u00b6 Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. Scope \u00b6 This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Enforcement \u00b6 Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. Enforcement Guidelines \u00b6 Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 1. Correction \u00b6 Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 2. Warning \u00b6 Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 3. Temporary Ban \u00b6 Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 4. Permanent Ban \u00b6 Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community. Attribution \u00b6 This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Code of Conduct"},{"location":"code_of_conduct/#contributor-covenant-code-of-conduct","text":"","title":"Contributor Covenant Code of Conduct"},{"location":"code_of_conduct/#our-pledge","text":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","title":"Our Pledge"},{"location":"code_of_conduct/#our-standards","text":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","title":"Our Standards"},{"location":"code_of_conduct/#enforcement-responsibilities","text":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","title":"Enforcement Responsibilities"},{"location":"code_of_conduct/#scope","text":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","title":"Scope"},{"location":"code_of_conduct/#enforcement","text":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","title":"Enforcement"},{"location":"code_of_conduct/#enforcement-guidelines","text":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","title":"Enforcement Guidelines"},{"location":"code_of_conduct/#1-correction","text":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","title":"1. Correction"},{"location":"code_of_conduct/#2-warning","text":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"2. Warning"},{"location":"code_of_conduct/#3-temporary-ban","text":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"3. Temporary Ban"},{"location":"code_of_conduct/#4-permanent-ban","text":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","title":"4. Permanent Ban"},{"location":"code_of_conduct/#attribution","text":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Attribution"},{"location":"faq/","text":"Frequently Asked Questions \u00b6 Cannot connect to your MySQL server \u00b6 Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Frequently Asked Questions"},{"location":"faq/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"faq/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"faq/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"faq/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"faq/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"faq/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"faq/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"faq/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"faq/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"faq/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"faq/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"faq/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"faq/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"file-structure/","text":"File Structure \u00b6 Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"file-structure/#file-structure","text":"Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files. WIFI \u00b6 There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files. Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files. Conversation \u00b6 The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available.","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files.","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Conversation"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory Steps for Testing \u00b6 To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Steps for Testing"},{"location":"developers/virtual-environments/","text":"Virtual Environments \u00b6 Add new packages \u00b6 Try to install any new package using conda . If a package is not available in one of conda \u2018s channels you can install it with pip but make sure your virtual environment is active. Update your conda environment.yaml \u00b6 After installing a new package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml Update and prune your conda environment from a environment.yaml file \u00b6 Execute the following command in your terminal, see these docs for more information conda env update --prefix ./env --file environment.yml --prune","title":"Virtual Environments"},{"location":"developers/virtual-environments/#virtual-environments","text":"","title":"Virtual Environments"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda . If a package is not available in one of conda \u2018s channels you can install it with pip but make sure your virtual environment is active.","title":"Add new packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing a new package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#update-and-prune-your-conda-environment-from-a-environmentyaml-file","text":"Execute the following command in your terminal, see these docs for more information conda env update --prefix ./env --file environment.yml --prune","title":"Update and prune your conda environment from a environment.yaml file"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday Modify the config.yaml file \u00b6 In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step) Create a provider folder, script and function \u00b6 In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ) Implement your feature extraction code \u00b6 The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step)","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-provider-folder-script-and-function","text":"In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider )","title":"Create a provider folder, script and function"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" Sensor Parameters \u00b6 Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers \u00b6 Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ). Provider Parameters \u00b6 Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. Provider Features \u00b6 Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\"","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#sensor-parameters","text":"Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page.","title":"Sensor Parameters"},{"location":"features/feature-introduction/#sensor-providers","text":"Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ).","title":"Sensor Providers"},{"location":"features/feature-introduction/#provider-parameters","text":"Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page.","title":"Provider Parameters"},{"location":"features/feature-introduction/#provider-features","text":"Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Provider Features"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0 RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"RAPIDS provider"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time_segment , a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time_segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most scanned device during a time_segment across the whole monitoring period Assumptions/Observations NA","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time_segment , a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time_segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most scanned device during a time_segment across the whole monitoring period Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"DORYAB provider"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file. Database credentials \u00b6 Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files. Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York Multiple timezones \u00b6 Support coming soon. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis Automatic creation of participant files \u00b6 You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Device Data Source Configuration \u00b6 You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#database-credentials","text":"Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files.","title":"Database credentials"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"Support coming soon.","title":"Multiple timezones"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#device-data-source-configuration","text":"You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study","title":"Device Data Source Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal Working Example"}]} \ No newline at end of file diff --git a/latest/sitemap.xml b/latest/sitemap.xml index 7e02bf4e..d018a09e 100644 --- a/latest/sitemap.xml +++ b/latest/sitemap.xml @@ -1,147 +1,147 @@ None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily None - 2020-12-02 + 2020-12-03 daily \ No newline at end of file diff --git a/latest/sitemap.xml.gz b/latest/sitemap.xml.gz index 40efebc501f25b75b836f0ba54feec55cb08c729..4c7772715a3212064978fd3da90d2c06afb06091 100644 GIT binary patch delta 195 zcmcc0c#V-=zMF$%srbo>?6UPy;-*vb`uwUGoHnX14B(F1yZ6GCBib`;#2!4a|Cv_t zTS~X;m8HacsTjewiDjqCkA3Cc7w7j>Zu_DK{WsZU1GRQvc%XRfrN_%nIw~_(xLdM5 zdOnZMbcy$ZXb(xtgo){{jh`M}(=PnxS3JxAen6YWFTX2m(o#dG=S-isJ!ka_N8?>_ t_tR>{=bC&w`_g|?nZ;S2h=fK~F=XOzcj%hvU%B1<8@V%%&*f)e008$VSkV9g delta 194 zcmcb{c$JY|zMF$XTz|{$LZ%r<=NU<$|O5rmTDIwa7Ou%v;5d z$K;h^ywY8#Qzzt38)<8YOq;Q1n)>^m1y8^5hWc!NubMvRD(`y9^XH?tg??Fa$0%Xl s!8Yv^TR6U@-r|10C(nA`2YX_