Wearable Activity Monitor
Overview of Data Domain
Activity monitoring involves the use of fitness wearables, which track metrics like heart rate, steps, distance, calories, and active minutes, etc, creating a detailed record of their daily activity.
For the AI-READI research program, the Garmin Vivosmart 5 fitness tracker was utilized for activity monitoring. Participants were advised to wear the wristwatch on their non-dominant hand for a period of 10 days, but they were free to choose their preferred wrist for wearing the device. Upon completion of the 10-day period, participants returned the wristwatch along with a form specifying 1) the wrist on which they wore the tracker and 2) their dominant hand. The Garmin was worn concurrently with the continuous glucose monitoring device and the use of the home environmental sensor. The device continuously recorded data related to physical activities and sleep. There are gaps in data collection as the battery had to be charged every 2-3 days.
Variables included in Data Domain
Heart Rate
The Garmin watch conveniently measures the heart rate directly at the wrist. The optical sensor (PPG) positioned on the rear of the watch emits a green light through the skin, interacting with the red blood cells within the skin's blood vessels. The sensor then detects the rhythmic pulses of blood flow generated by heartbeats and captures the heart rate or pulse. Heart rate is measured in beats per minute (bpm).
Oxygen Saturation
Utilizing sensors positioned on the rear of the device, along with a combination of red and infrared lights, the Garmin watch estimates the percentage of oxygenated blood (SpO2%) in the bloodstream. This metric signifies the efficiency of oxygen delivery to tissues. However, factors such as altitude, activity level, and health condition may influence this reading. Oxygen saturation (SpO2%) is collected for 4 hours during the participants' sleep and is measured in percentage values.
Physical activity
The number of steps taken serves as a metric for physical activity. To calculate this, the fitness tracker employs its built-in accelerometer, which detects movement and measures wrist acceleration. When a person walks or runs, the accelerometer detects each step taken based on changes in acceleration patterns. The smartwatch then processes this data to estimate the number of steps taken throughout the day. The data includes the step count.
Physical activity calories
Physical activity calories refer to the calories expended during physical activities such as walking, running, exercising, and other forms of movement. The Garmin watch accurately computes calorie expenditure by combining heart rate (HR), respiration rate derived from heart rate variability (HRV), and an additional variable from the Firstbeat Analytics engine. This integration allows the model to effectively gauge current oxygen consumption, which aligns with the intensity of physical activity. Physical activity is measured in kilocalories.
Respiratory Rate
Respiration rate refers to the number of breaths a person takes per minute. It is a measure of how often someone inhales and exhales within a specific timeframe. The fitness tracker estimates respiration rate by analyzing heart rate variability (HRV). This involves observing slight variations in the time between consecutive heartbeats, which shorten during inhalation and lengthen during exhalation. Respiratory rate is measured in breaths per minute (bpm).
Sleep
During sleep, the device autonomously detects the user's sleep patterns and tracks movement throughout their typical sleep hours. Sleep-related metrics include total sleep duration in hours.
Stress
Stress is a physiological and psychological response to the challenges faced in day to day life. The Garmin watch estimates stress levels on a scale of 0 to 100, primarily by analyzing a combination of heart rate (HR) and heart rate variability (HRV) data. This information is captured by the optical heart rate sensor located on the back of the device.
More information regarding the Garmin Vivosmart 5 can be found here.
Data Processing
File Format
The ASCII files provided in this dataset utilize the mHealth standard which is built on JSON format, short for JavaScript Object Notation, which is a widely used data interchange format characterized by its simplicity and human-readable structure.
interchange format characterized by its simplicity and human-readable structure. File organization is as follows:
pilot_data_root
└── wearable_activity_monitor
├── manifest.tsv
├── heart_rate
│ └── garmin_vivosmart5
│ ├── 0001
│ │ └── 0001_heartrate.json
│ ├── 0002
│ │ └── 0002_heartrate.json
│ └── …etc
├── oxygen_saturation
│ └── garmin_vivosmart5
│ ├── 0001
│ │ └── 0001_oxygensaturation.json
│ ├── 0002
│ │ └── 0002_oxygensaturation.json
│ └── …etc
├── physical_activity
│ └── garmin_vivosmart5
│ ├── 0001
│ │ └── 0001_activity.json
│ ├── 0002
│ │ └── 0002_activity.json
│ └── …etc
├── physical_activity_cal
│ └── garmin_vivosmart5
│ ├── 0001
│ │ └── 0001_calorie.json
│ ├── 0002
│ │ └── 0002_calorie.json
│ └── …etc
├── respiratory_rate
│ └── garmin_vivosmart5
│ ├── 0001
│ │ └── 0001_respiratoryrate.json
│ ├── 0002
│ │ └── 0002_respiratoryrate.json
│ └── …etc
├── sleep
│ ├── garmin_vivosmart5
│ │ ├── 0001
│ │ │ └── 0001_sleep.json
│ │ └── 0002
│ │ └── 0002_sleep.json
│ └── …etc
└── stress
├── garmin_vivosmart5
├── 0001
│ └── 0001_stress.json
├── 0002
│ └── 0002_stress.json
└── …etc
Metadata and Example Outputs
Domain | Variable | Method | Data Standard/ File Extension | Open Source vs. Protected Database? |
---|---|---|---|---|
Activity Monitoring | Heart Rate (bpm) | device; Garmin Vivosmart 5 | .JSON | Open Source |
Oxygen saturation (pulse ox) | device; Garmin Vivosmart 5 | .JSON | Open Source | |
Physical Activity (steps) | device; Garmin Vivosmart 5 | .JSON | Open Source | |
Physical Activity (calorie) | device; Garmin Vivosmart 5 | .JSON | Open Source | |
Respiratory Rate (bpm) | device; Garmin Vivosmart 5 | .JSON | Open Source | |
Sleep data (hrs) | device; Garmin Vivosmart 5 | .JSON | Open Source | |
Stress (stress level) | device; Garmin Vivosmart 5 | .JSON | Open Source |
Data Standards
AIREADI Standards for wearable data
Wearable data files have been standardized based on an extended model derived from the Open mHealth schema.The Open mHealth standard for wearables offers a comprehensive framework and guidelines designed to enhance interoperability and data exchange between wearable devices and mobile health (mHealth) applications. This initiative aims to streamline the integration of health data from diverse sources, fostering innovation and enabling personalized healthcare solutions.
For more information about the schema:
-
Open mHealth Storage Endpoint Github repository:
-
Overview of Open mHealth:
https://www.openmhealth.org/documentation/#/overview/get-started
Data structure
For each measurement, provided is a breakdown of its data structure along with its corresponding Open mHealth schema:
Heart Rate
Here is a sample data format for Heart rate from Open mHealth: https://www.openmhealth.org/documentation/#/schema-docs/schema-library/schemas/omh_heart-rate
{
"heart_rate": {
"value": 67.5,
"unit": "beats/min"
},
"effective_time_frame": {
"date_time": "2020-02-05T07:25:00-08:00"
},
"temporal_relationship_to_sleep": "on waking"
}
The AIREADI JSON schema for Heart Rate is as follows:
The table below describes the data elements:
{
"header": {
"uuid": "AIREADI-0000",
"creation_date_time": "YYYY-MM-DDThh:mm:ss",
"user_id": "AIREADI-0000",
"schema_id": {
"namespace": "omh",
"name": "heart-rate",
"version": 2.0
}
},
"body": {
"heart_rate": [
{
"heart_rate": {
"value": 100,
"unit": "beats/min"
},
"effective_time_frame": {
"date_time": "YYYY-MM-DDThh:mm:ss"
}
}
]
}
}
Data Element | Description | Example | |||
---|---|---|---|---|---|
root | header | uuid | Universally Unique Identifier | AIREADI-0000 | |
creation_date_time | JSON file creation date & time | 2024-02-26T12:56:46Z | |||
user_id | Identification number of participant | AIREADI-0000 | |||
schema_id | namespace | The namespace of the schema to disambiguate schemas with conflicting names | omh | ||
name | Name of measurement | heart-rate | |||
version | Version of the schema | 2.0 | |||
body | heart_rate | heart_rate | value | Recorded HR value | 0 |
unit | Unit of HR measurement | beats/min | |||
effective_time_frame | date_time | Time of HR reading | 2023-08-30T16:11:00Z |
Oxygen Saturation
Here is a sample data format for Oxygen saturation from Open mHealth:
https://www.openmhealth.org/documentation/#/schema-docs/schema-library/schemas/omh_oxygen-saturation
{
"oxygen_saturation": {
"value": 95,
"unit": "%"
},
"effective_time_frame": {
"date_time": "2013-02-05T07:25:00Z"
},
"supplemental_oxygen_flow_rate": {
"value": 2.5,
"unit": "L/min"
},
"oxygen_therapy_mode_of_administration": "nasal cannula",
"system": "peripheral capillary",
"measurement_method": "pulse oximetry"
}
The AIREADI JSON schema for Oxygen saturation is as follows:
{
"header": {
"uuid": "AIREADI-0000",
"creation_date_time": "YYYY-MM-DDThh:mm:ss",
"user_id": "AIREADI-0000",
"schema_id": {
"namespace": "omh",
"name": "oxygen-saturation",
"version": 2.0
}
},
"body": {
"breathing": [
{
"oxygen_saturation": {
"value": 0,
"unit": "%"
},
"effective_time_frame": {
"date_time": "YYYY-MM-DDThh:mm:ss"
},
"measurement_method": "pulse oximetry"
}
]
}
}
The table below describes the data elements:
Data Element | Description | Example | |||
---|---|---|---|---|---|
root | header | uuid | Universally Unique IDentifier | AIREADI-0000 | |
creation_date_time | JSON file creation date & time | 2024-02-26T12:56:46Z | |||
user_id | Identification number of participant | AIREADI-0000 | |||
schema_id | namespace | The namespace of the schema to disambiguate schemas with conflicting names | omh | ||
name | Name of measurement | heart-rate | |||
version | Version of the schema | 2.0 | |||
body | breathing | oxygen_saturation | value | Recorded SpO2 value | 0 |
unit | Unit of SpO2 measurement | % | |||
effective_time_frame | date_time | Time of SpO2 reading | 2023-08-30T16:11:00Z | ||
measurement_method | Method of measuring oxygen saturation | pulse oximetry |
Physical activity
Here is a sample data format for Physical activity from Open mHealth: https://www.openmhealth.org/documentation/#/schema-docs/schema-library/schemas/omh_step-count
{
"step_count": {
"value": 10600,
"unit": "steps"
},
"effective_time_frame": {
"time_interval": {
"start_date_time": "2016-02-05T06:25:00Z",
"end_date_time": "2016-02-05T07:25:00Z"
}
}
}
The AIREADI JSON schema for Physical activity is as follows:
{
"header": {
"uuid": "AIREADI-0000",
"creation_date_time": "YYYY-MM-DDThh:mm:ss",
"user_id": "AIREADI-0000",
"schema_id": {
"namespace": "",
"name": "",
"version": ""
}
},
"body": {
"activity": [
{
"activity_name": "",
"base_movement_quantity": {
"value": "",
"unit": "steps"
},
"effective_time_frame": {
"time_interval": {
"start_date_time": "YYYY-MM-DDThh:mm:ss",
"end_date_time": "YYYY-MM-DDThh:mm:ss"
}
}
}
]
}
}
The table below describes the data elements:
Data Element | Description | Example | ||||
---|---|---|---|---|---|---|
root | header | uuid | Universally Unique IDentifier | AIREADI-0000 | ||
creation_date_time | JSON file creation date & time | 2024-02-26T12:56:46Z | ||||
user_id | Identification number of participant | AIREADI-0000 | ||||
schema_id | namespace | The namespace of the schema to disambiguate schemas with conflicting names | ||||
name | Name of measurement | |||||
version | Version of the schema | |||||
body | activity | activity_name | value | Recorded SpO2 value | ||
base_movement_quantity | value | Recorded value | 0 | |||
unit | Unit of activity measurement | steps | ||||
effective_time_frame/time_interval | start_date_time | Start time of recording | 2023-08-29 17:16:00 | |||
end_date_time | End time of recording | 2023-08-30 18:09:00 |
Physical Activity Calorie
Here is a sample data format for Physical activity calorie from Open mHealth: https://www.openmhealth.org/documentation/#/schema-docs/schema-library/schemas/omh_calories-burned
{
"kcal_burned": {
"value": 00,
"unit": "kcal"
},
"effective_time_frame": {
"time_interval": {
"start_date_time": "2016-02-05T06:00:00Z",
"end_date_time": "2016-02-05T23:00:00Z"
}
}
}
The AIREADI JSON schema for Physical activity calorie is as follows:
{
"header": {
"uuid": "AIREADI-0000",
"creation_date_time": "YYYY-MM-DDThh:mm:ss",
"user_id": "AIREADI-0000",
"schema_id": {
"namespace": "ieee",
"name": "physical-activity",
"version": 1.0
}
},
"body": {
"activity": [
{
"activity_name": "kcal_burned",
"duration": {
"value": 0,
"unit": "kcal"
},
"effective_time_frame": {
"date_time": "YYYY-MM-DDThh:mm:ss"
}
}
]
}
}
The table below describes the data elements:
Data Element | Description | Example | |||
---|---|---|---|---|---|
root | header | uuid | Universally Unique IDentifier | AIREADI-0000 | |
creation_date_time | JSON file creation date & time | 2024-02-26T12:56:46Z | |||
user_id | Identification number of participant | AIREADI-0000 | |||
schema_id | namespace | The namespace of the schema to disambiguate schemas with conflicting names | ieee | ||
name | Name of measurement | physical-activity | |||
version | Version of the schema | 1.0 | |||
body | activity | activity_name | The name of the physical activity in which the person is engaged | kcal_burned | |
duration | value | Recorded value | 0 | ||
unit | Unit of activity measurement | kcal | |||
effective_time_frame | date_time | Time of activity measurement | 2023-08-30T16:11:00Z |
Respiratory rate
Here is a sample data format for Respiratory rate from Open mHealth:
https://www.openmhealth.org/documentation/#/schema-docs/schema-library/schemas/omh_respiratory-rate
{
"respiratory_rate": {
"value": 10,
"unit": "breaths/min"
},
"effective_time_frame": {
"time_interval": {
"start_date_time": "2020-02-05T07:05:00-08:00",
"end_date_time": "2020-02-05T08:05:00-08:00"
}
},
"descriptive_statistic": "minimum"
}
The AIREADI JSON schema for Respiratory rate is as follows:
{
"header": {
"uuid": "AIREADI-0000",
"creation_date_time": "YYYY-MM-DDThh:mm:ss",
"user_id": "AIREADI-0000",
"schema_id": {
"namespace": "omh",
"name": "respiratory-rate",
"version": 2.0
}
},
"body": {
"breathing": [
{
"respiratory_rate": {
"value": 0,
"unit": "breaths/min"
},
"effective_time_frame": {
"date_time": "YYYY-MM-DDThh:mm:ss"
}
}
]
}
}
The table below describes the data elements:
Data Element | Description | Example | |||
---|---|---|---|---|---|
root | header | uuid | Universally Unique IDentifier | AIREADI-0000 | |
creation_date_time | JSON file creation date & time | 2024-02-26T12:56:46Z | |||
user_id | Identification number of participant | AIREADI-0000 | |||
schema_id | namespace | The namespace of the schema to disambiguate schemas with conflicting names | omh | ||
name | Name of measurement | respiratory-rate | |||
version | Version of the schema | 2.0 | |||
body | breathing | respiratory_rate | value | Recorded value | 0.0 |
unit | Unit of activity measurement | breaths/min | |||
effective_time_frame | date_time | Time of activity measurement | 2023-10-30T16:11:00Z |
Sleep
Here is a sample data format for Sleep from Open mHealth:
https://www.openmhealth.org/documentation/#/schema-docs/schema-library/schemas/omh_sleep-duration
{
"sleep_duration": {
"value": 7.5,
"unit": "h"
},
"effective_time_frame": {
"time_interval": {
"start_date_time": "2016-02-05T20:35:00Z",
"end_date_time": "2016-02-06T06:35:00Z"
}
}
}
The AIREADI JSON schema for Sleep is as follows:
{
"header": {
"uuid": "AIREADI-0000",
"creation_date_time": "YYYY-MM-DDThh:mm:ss",
"user_id": "AIREADI-0000",
"schema_id": {
"namespace": "omh",
"name": "sleep-duration",
"version": 2.0
}
},
"body": {
"sleep": [
{
"sleep_duration": {
"value": 0,
"unit": "h"
},
"effective_time_frame": {
"time_interval": {
"start_date_time": "YYYY-MM-DDThh:mm:ss",
"end_date_time": "YYYY-MM-DDThh:mm:ss"
}
}
}
]
}
}
The table below describes the data elements:
Data Element | Description | Example | ||||
---|---|---|---|---|---|---|
root | header | uuid | Universally Unique IDentifier | AIREADI-0000 | ||
creation_date_time | JSON file creation date & time | 2024-02-26T12:56:46Z | ||||
user_id | Identification number of participant | AIREADI-0000 | ||||
schema_id | namespace | The namespace of the schema to disambiguate schemas with conflicting names | omh | |||
name | Name of measurement | sleep-duration | ||||
version | Version of the schema | 2.0 | ||||
body | sleep | sleep_duration | value | Recorded value | 0 | |
unit | Unit of activity measurement | h | ||||
effective_time_frame | time_interval | start_date_time | Start time of recording | 2023-08-20 17:16:00 | ||
end_date_time | End time of recording | 2023-08-21 16:09:00 |
Stress
Due to the lack of a specific sample data format for stress in Open mHealth, we developed the schema for this new data type using other similar data types.
The AIREADI JSON schema for Stress is as follows:
{
"header": {
"uuid": "AIREADI-0000",
"creation_date_time": "YYYY-MM-DDThh:mm:ss",
"user_id": "AIREADI-0000",
"schema_id": {
"namespace": "",
"name": "",
"version": ""
}
},
"body": {
"stress": [
{
"stress": {
"value": 0,
"unit": "stress level"
},
"effective_time_frame": {
"date_time": "YYYY-MM-DDThh:mm:ss"
}
}
]
}
}
The table below describes the data elements:
Data Element | Description | Example | |||
---|---|---|---|---|---|
root | header | uuid | Universally Unique IDentifier | AIREADI-0000 | |
creation_date_time | JSON file creation date & time | 2024-02-26T12:56:46Z | |||
user_id | Identification number of participant | AIREADI-0000 | |||
schema_id | namespace | The namespace of the schema to disambiguate schemas with conflicting names | |||
name | Name of measurement | ||||
version | Version of the schema | ||||
body | stress | stress | value | Recorded value | 0.0 |
unit | Unit of activity measurement | stress level | |||
effective_time_frame | date_time | Time of activity measurement | 2023-08-30T16:11:00Z |
File Processing
Before issuing the device, the distribution date and serial number from the back of the watch are documented in REDCap using the "Device Distribution" form. Upon receiving the returned device, the date of receipt is recorded in the "Device Return" REDCap form, along with details on the wrist used for data collection and the participant's dominant hand.
Data is then extracted from the Garmin Vivosmart 5 as a proprietary compressed .FIT format. The data is converted to mHealth format, and all timestamps are reported in UTC. Since the device continues to save data after the participant has stopped wearing it, some activity types may contain an extended string of values that indicate no activity (heart rate, stress, respiratory rate, and movement) while others may not record any further events (oxygen saturation, sleep, and calories). The sampling frequency of the Fitness tracker is 5 seconds.
The processed data is uploaded onto Fair Data Innovations hub (fairhub.io). Fairhub.io is a user-friendly platform designed for securely uploading and managing research data, facilitating collaboration among researchers and ensuring compliance with FAIR data principles.
A few things to note about measurement files:
Stress: The negative stress values (-1 & -2) originate from the source, possibly signifying specific states or errors not publicly documented. Alternatively, they might be internally utilized for particular conditions not addressed in the accessible API documentation. Some activity types, such as heart rate and respiratory rate, utilize negative numbers to signify that the device is offline, possibly due to it being placed on the charger, for instance. Additionally, it's possible that the device continues to record data even after the participant has ceased wearing the watch.
There may be cases in which certain participants do not have certain files, e.g have no measurement file for sleep data. In these cases, the file path will display "none." However, there are also instances where a measurement file exists, but it contains no observations, similar to having data with no meaningful content.
See the table here