Skip to main content
Version: 2.0.0

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 duration of sleep stages.

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 .JSONOpen 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:

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
rootheaderuuid Universally Unique IdentifierAIREADI-0000
creation_date_timeJSON file creation date & time2024-02-26T12:56:46Z
user_id Identification number of participantAIREADI-0000
schema_idnamespace The namespace of the schema to disambiguate schemas with conflicting namesomh
nameName of measurementheart-rate
versionVersion of the schema 2.0
body heart_rate heart_ratevalue Recorded HR value0
unitUnit of HR measurementbeats/min
effective_time_framedate_timeTime of HR reading2023-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 IDentifierAIREADI-0000
creation_date_time JSON file creation date & time 2024-02-26T12:56:46Z
user_id Identification number of participantAIREADI-0000
schema_idnamespace The namespace of the schema to disambiguate schemas with conflicting namesomh
nameName of measurementheart-rate
version Version of the schema 2.0
body breathing oxygen_saturation value Recorded SpO2 value0
unitUnit of SpO2 measurement%
effective_time_framedate_timeTime of SpO2 reading2023-08-30T16:11:00Z
measurement_methodMethod of measuring oxygen saturationpulse 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 IDentifierAIREADI-0000
creation_date_time JSON file creation date & time 2024-02-26T12:56:46Z
user_id Identification number of participantAIREADI-0000

schema_id

namespace The namespace of the schema to disambiguate schemas with conflicting names
nameName of measurement
version Version of the schema
body activity activity_name value Recorded SpO2 value
base_movement_quantityvalueRecorded value0
unitUnit of activity measurementsteps

effective_time_frame/time_interval

start_date_timeStart time of recording2023-08-29 17:16:00
end_date_timeEnd time of recording2023-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",
"calories_value": {
"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 IDentifierAIREADI-0000
creation_date_time JSON file creation date & time 2024-02-26T12:56:46Z
user_id Identification number of participantAIREADI-0000
schema_idnamespace The namespace of the schema to disambiguate schemas with conflicting namesieee
nameName of measurementphysical-activity
version Version of the schema 1.0
body activity activity_name The name of the physical activity in which the person is engagedkcal_burned
durationvalueRecorded value0
unitUnit of activity measurementkcal
effective_time_framedate_timeTime 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 IDentifierAIREADI-0000
creation_date_time JSON file creation date & time 2024-02-26T12:56:46Z
user_id Identification number of participantAIREADI-0000
schema_idnamespace The namespace of the schema to disambiguate schemas with conflicting namesomh
nameName of measurementrespiratory-rate
version Version of the schema 2.0
body breathing respiratory_ratevalueRecorded value0.0
unitUnit of activity measurementbreaths/min
effective_time_framedate_timeTime 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_stage_state": "light",
"sleep_stage_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_stage_state": "light",
"sleep_stage_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 IDentifierAIREADI-0000
creation_date_time JSON file creation date & time 2024-02-26T12:56:46Z
user_id Identification number of participantAIREADI-0000

schema_id

namespace The namespace of the schema to disambiguate schemas with conflicting namesomh
nameName of measurementsleep-duration
version Version of the schema 2.0
body sleep

sleep_duration

valueRecorded value0
unitUnit of activity measurementh
effective_time_frame time_intervalstart_date_timeStart time of recording2023-08-20 17:16:00
end_date_timeEnd time of recording2023-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 IDentifierAIREADI-0000
creation_date_time JSON file creation date & time 2024-02-26T12:56:46Z
user_id Identification number of participantAIREADI-0000
schema_idnamespace The namespace of the schema to disambiguate schemas with conflicting names
nameName of measurement
version Version of the schema
body stress stressvalueRecorded value0.0
unitUnit of activity measurementstress level
effective_time_framedate_timeTime 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