Head-up Tilt Test
Head-up Tilt Test(HUT)は、仰臥位から頭部を傾斜させた立位姿勢(例:20~60度)に変化させることで、自律神経系の反応を評価する方法です。仰臥位では副交感神経が優位であり、心拍変動(HRV)は比較的大きく変動します。傾斜位に移行すると、重力により下半身への血液プールが起こり、それに対する補償として交感神経活動が増加し、副交感神経活動が低下します。この変化により、心拍数は上昇し、HRVは全体的に減少します。
ここでは、下の図のように、HUTで計測されたRR間隔をプロットしてみます。

以下が使用するRスクリプトです.
# 各自,RRIデータが含まれるフォルダのパスを指定すること
DIR <- r"(.....ここを修正してください....\HUT)"
FN <- c("RRI_HUT0deg.csv","RRI_HUT20deg.csv","RRI_HUT40deg.csv","RRI_HUT60deg.csv")
###################
# 作業フォルダの指定
setwd(DIR)
# ミリ秒まで表示
options(digits.secs=3)
# plotのオプション指定
par(mfrow=c(4,2),cex=1,mar=c(5,5,2,2),pty="m")
###################
# ベッドの角度が0°のデータ
id <- 1
# データの読み込み
TMP <- read.csv(FN[id],header=TRUE)
RRI.0deg <- TMP$RRI
time.0deg <- cumsum(TMP$RRI/1000)-TMP$RRI[1]/1000
# plot
plot(time.0deg,RRI.0deg,"l",col=4,ylim=c(600,1100),lwd=2,las=1,xlab="Time [s]",ylab="RRI [ms]",xaxs="i",xlim=c(0,300),main="0 deg")
plot(time.0deg,RRI.0deg,"o",pch=16,col=4,las=1,ylim=c(800,1050),xlab="Time [s]",ylab="RRI [ms]",xaxs="i",xlim=c(100,150),main="0 deg")
#######################################
# ベッドの角度が20°のデータ
id <- 2
# データの読み込み
TMP <- read.csv(FN[id],header=TRUE)
RRI.20deg <- TMP$RRI
time.20deg <- cumsum(TMP$RRI/1000)-TMP$RRI[1]/1000
# plot
plot(time.20deg,RRI.20deg,"l",col=4,ylim=c(600,1100),lwd=2,las=1,xlab="Time [s]",ylab="RRI [ms]",xaxs="i",xlim=c(0,300),main="20 deg")
plot(time.20deg,RRI.20deg,"o",pch=16,col=4,las=1,ylim=c(700,950),xlab="Time [s]",ylab="RRI [ms]",xaxs="i",xlim=c(50,100),main="20 deg")
#######################################
# ベッドの角度が40°のデータ
id <- 3
# データの読み込み
TMP <- read.csv(FN[id],header=TRUE)
RRI.40deg <- TMP$RRI
time.40deg <- cumsum(TMP$RRI/1000)-TMP$RRI[1]/1000
# plot
plot(time.40deg,RRI.40deg,"l",col=4,ylim=c(600,1100),lwd=2,las=1,xlab="Time [s]",ylab="RRI [ms]",xaxs="i",xlim=c(0,300),main="40 deg")
plot(time.40deg,RRI.40deg,"o",pch=16,col=4,las=1,ylim=c(650,900),xlab="Time [s]",ylab="RRI [ms]",xaxs="i",xlim=c(50,100),main="40 deg")
#######################################
# ベッドの角度が60°のデータ
id <- 4
# データの読み込み
TMP <- read.csv(FN[id],header=TRUE)
RRI.60deg <- TMP$RRI
time.60deg <- cumsum(TMP$RRI/1000)-TMP$RRI[1]/1000
# plot
plot(time.60deg,RRI.60deg,"l",col=4,ylim=c(600,1100),lwd=2,las=1,xlab="Time [s]",ylab="RRI [ms]",xaxs="i",xlim=c(0,300),main="60 deg")
plot(time.60deg,RRI.60deg,"o",pch=16,col=4,las=1,ylim=c(600,850),xlab="Time [s]",ylab="RRI [ms]",xaxs="i",xlim=c(0,50),main="60 deg")
#######################################
MyBeatで計測されたデータのプロット
ユニオンツールのMyBeatは、胸に装着する小型センサで心電波形を検出することで、R-R間隔(RRI)を計測できます。
以下のRスクリプトはMyBeatで計測されたデータを読み込み、RRIをプロットするものです。
# 各自,RRIデータが含まれるフォルダのパスを指定すること
DIR <- r"(.......)"
FN <- "MyBeatSample.csv"
###################
# 作業フォルダの指定
setwd(DIR)
# ミリ秒まで表示
options(digits.secs=3)
# ファイルの読み込み
TMP <- read.csv(FN,header=TRUE,skip=3)
time <- as.POSIXct(TMP$Time,tz="Asia/Tokyo")
RRI <- TMP$RRI
#######################
# 正常値の設定
RRI.max <- 1250
RRI.min <- 350
RRI.diff <- 150
#######################
# 時系列の長さ
n.RRI <- length(RRI)
# 異常値の除外
D1.RRI <- c()
D2.RRI <- c()
D1.RRI[1] <- 0
D2.RRI[n.RRI] <- 0
D1.RRI[2:n.RRI] <- abs(RRI[2:n.RRI]-RRI[1:(n.RRI-1)])
D2.RRI[1:(n.RRI-1)] <- D1.RRI[2:n.RRI]
time.rev <- time[RRI > RRI.min & RRI < RRI.max
& D1.RRI < RRI.diff & D2.RRI < RRI.diff]
RRI.rev <- RRI[RRI > RRI.min & RRI < RRI.max & D1.RRI < RRI.diff
& D2.RRI < RRI.diff]
######################
# プロット
par(mfrow=c(3,1),cex=1,mar=c(5,5,2,2),pty="m")
plot(time,RRI,type="l",lwd=2,col=4,xaxs="i",main="Original RRI",xlab="Time",ylab="RRI [ms]")
plot(time,RRI,type="l",lwd=2,col=gray(0.8),xaxs="i",main=paste("Revised RRI ( from",min(time.rev),"to",max(time.rev),")"),ylim=c(300,1100),xlab="Time",ylab="RRI [ms]")
lines(time.rev,RRI.rev,"l",col=2,lwd=2)
######################
# 心拍変動指標の計算
######################
# 切り出し時刻の指定
time.from <- "2022-08-31 13:00:00"
time.to <- "2022-08-31 14:00:00"
#####
time.from <- as.POSIXct(time.from,tz="Asia/Tokyo")
time.to <- as.POSIXct(time.to,tz="Asia/Tokyo")
abline(v=c(time.from,time.to),lty=2,col="red",lwd=2)
###
RRI <- RRI.rev[time.rev >= time.from & time.rev <= time.to]
TIME <- time.rev[time.rev >= time.from & time.rev <= time.to]
###
plot(TIME,RRI,"l",lwd=2,col=2,xaxs="i",main=paste("Analyzed RRI ( from",time.from,"to",time.to,")"),xlab="Time",ylab="RRI [ms]")
###
#####
# meanNN
meanNN <- mean(RRI)
# SDNN
SDNN <- sd(RRI)
# RMSSD
RMSSD <- sqrt(mean(diff(RRI)^2))
#####
# 結果の表示
text(time.from,max(RRI)-20,sprintf("meanNN:%.0f (ms), SDNN: %.0f (ms), RMSSD: %.0f (ms)",meanNN,SDNN,RMSSD),pos=4)
cat(" meanNN:",meanNN,"(ms)\n","SDNN:",SDNN,"(ms)\n","RMSSD:",RMSSD,"(ms)\n")
