This project analyzes Heart Rate Variability (HRV) during various meditation and breathing states using the PhysioNet HRV dataset. We compare Chi meditation, Kundalini Yoga, sleep, and metronomic breathing based on time-domain HRV metrics and use machine learning models to distinguish between these states.
- Analyze HRV using time-domain features (Mean HR, SDNN, RMSSD)
- Compare meditation vs. sleep vs. breathing via statistical tests (t-test, ANOVA)
- Visualize physiological differences across states using box/violin plots
- Train ML classifiers (KNN, Random Forest) to classify states
- Interpret results and draw cardiovascular health insights
Source: PhysioNet: Heart Rate Oscillations During Meditation
- Chi Meditation: C1βC8 (pre and med)
- Kundalini Yoga: Y1βY4 (pre and med)
- Normal Sleep: N1βN11
- Ironman : I1-I9
- Metronomic Breathing: M1βM14
- Elapsed Time (seconds)
- Instantaneous Heart Rate (bpm)
The following diagrams illustrate the preprocessing steps used:
# Define file paths
input_file = r"...\data\chi\C1.pre"
output_file = r"...\dataset\o_0_chi\C1_pre_meditation.csv"
# Load text data
df = pd.read_csv(input_file, sep="\s+", header=None, names=["Time", "HeartRate"])
df["Subject"] = "C1_pre"
df["Group"] = "Chi"
df["State"] = "Pre_Meditation"
df.to_csv(output_file, index=False)
file_pre = r"...\C1_pre_meditation.csv"
file_med = r"...\C1_meditation.csv"
# Merge files
pre = pd.read_csv(file_pre)
med = pd.read_csv(file_med)
c1_merged = pd.concat([pre, med], ignore_index=True)
c1_merged.to_csv("...\C1_merged_data.csv", index=False)
import wfdb, numpy as np, pandas as pd
# Load QRS peaks
def load_qrs_peaks(path):
annotation = wfdb.rdann(path, 'qrs')
return annotation.sample
# Compute R-R intervals
r_peaks = load_qrs_peaks("...\C1pre")
time_stamps = r_peaks[1:] / 250
rr_intervals = np.diff(r_peaks) / 250
# Create DataFrame and save
rr_df = pd.DataFrame({"Time": time_stamps, "RR_Interval": rr_intervals})
rr_df["Subject"] = "C1_pre_rr"
rr_df["Group"] = "Chi Meditation"
rr_df["State"] = "Pre-Meditation"
rr_df.to_csv("...\RR_C1_pre.csv", index=False)
import glob
rr_files = glob.glob(r"...\RR_C*_merged.csv")
df_all_rr = pd.concat([pd.read_csv(f) for f in rr_files], ignore_index=True)
df_all_rr.to_csv(r"...\RR_Chi_meditation_Combined.csv", index=False)
from scipy.stats import ttest_rel, f_oneway, shapiro
# Paired T-Test (Chi pre vs. med)
t_stat, p_val = ttest_rel(df_chi_pre["RMSSD"], df_chi_med["RMSSD"])
print("T-test Chi RMSSD: t =", t_stat, "p =", p_val)
# ANOVA (across groups)
f_stat, p_val = f_oneway(df_chi["RMSSD"], df_yoga["RMSSD"], df_sleep["RMSSD"], df_metron["RMSSD"])
print("ANOVA RMSSD: F =", f_stat, "p =", p_val)
# Normality check
shapiro_stat, shapiro_p = shapiro(df_chi_pre["RMSSD"])
print("Shapiro-Wilk p =", shapiro_p)
π data/
βββ 0_0_chi/
β βββ RR_data/
β β βββ RR_C1-C8_merged_data.csv, RR_Chi_meditation_Combined.csv
β βββ HRV_data/
β βββ C1-C8_merged_data.csv, HRV_Chi_Meditation_Combined.csv
βββ 0_1_ironman/
β βββ RR_data/
β β βββ RR_Ironman_Combined.csv
β βββ HRV_data/
β βββ HRV_Ironman_Meditation_Combined.csv
βββ 0_2_metron/
β βββ RR_data/
β β βββ RR_Metron_Combined.csv
β βββ HRV_data/
β βββ HRV_Metron_Combined.csv
βββ 0_3_normal/
β βββ RR_data/
β β βββ RR_Normal_Combined.csv
β βββ HRV_data/
β βββ HRV_Normal_Combined.csv
βββ 0_4_yoga/
β βββ RR_data/
β β βββ RR_Yoga_Combined.csv
β βββ HRV_data/
β βββ HRV_Yoga_Combined.csv
π Merged Files β π o_1_all_hrv_rr_metric_combined.csv
π Statistical Computing:
βββ π Mean_HR
βββ π SDNN
βββ π RMSSD
π Statistical Tests:
βββ π o_3_results_normality_chi
βββ π o_4_results_normality_yoga
βββ π o_5_t_test_results_chi_yoga
βββ π o_2_anova_results_chi_yoga
Time-domain metrics used:
- Mean Heart Rate
- SDNN β Standard Deviation of NN intervals
- RMSSD β Root Mean Square of Successive Differences
- Paired t-tests: Chi/Yoga (pre vs. med)
- ANOVA: Across meditation, sleep, and breathing
- Normality check via Shapiro-Wilk
- Visualizations: Boxplots plots
- Model: KNN and Random Forest
- Features: Time-domain HRV metrics
- Evaluation: Accuracy, Confusion Matrix, F1-score
- Language: Python
- Libraries: pandas, numpy, scipy, matplotlib, seaborn, scikit-learn, wfdb
- Environment: Jupyter Lab (analysis + code), RStudio (report writing)
- Identify which meditation technique leads to highest HRV change
- Assess similarity of meditation-induced HRV to sleep or metronomic breathing
- Build classifier that can predict state (Chi, Yoga, Sleep, Breathing)
- Offer insights on HRV as an indicator of relaxation and cardiovascular health
hrv_meditation_analysis/
βββ README.md
βββ data/
β βββ chi/ # C1_pre.txt, C1_med.txt ...
β βββ yoga/ # Y1_pre.txt, Y1_med.txt ...
β βββ sleep/ # N1.txt ...
β βββ metron/ # M1.txt ...
βββ merged/
β βββ o_1_all_hrv_rr_metric_combined.csv
βββ stats/
β βββ normality/
β β βββ o_3_results_normality_chi.csv
β β βββ o_4_results_normality_yoga.csv
β βββ t_tests/o_5_t_test_results_chi_yoga.csv
β βββ anova/o_2_anova_results_chi_yoga.csv
βββ notebooks/
β βββ HRV_Comparison.ipynb
βββ hrv_utils.py
Project: HRV Analysis of Meditation, Sleep, and Breathing
Goal: Quantify and compare HRV effects of Chi meditation, Kundalini Yoga, sleep, and metronomic breathing.
Highlights:
- Preprocessed HRV data using PhysioNet
- Computed time-domain HRV features
- Conducted statistical tests (paired t-test, ANOVA)
- Visualized HRV across states
- Trained ML classifiers to identify state
- Tiwari et al. (2021) β Heart Rate Variability Analysis
- Kim et al. (2018) β Stress and HRV
- Peng et al. (1999) β Heart Rate Oscillations During Meditation
- Goldberger et al. (2000) β PhysioNet Reference
For full dataset access, visit: https://physionet.org/content/meditation/1.0.0/
Feel free to extend the project using wearable HRV devices, deep learning models (e.g., LSTM), or real-time biofeedback systems! π§ββοΈπ