統計解析.com

統計解析業務の
アウトソーシング

無料相談を
予約する

反復測定したグルコースのiAUCを計算する

アウトライン
  1. 作成日: 2025/11/11
  2. 更新日: –

はじめに

近年、食後血糖値上昇の抑制を目的とした機能性食品が多数販売されています。機能性表示食品の最終製品を用いた臨床試験では、原則として、「特定保健用食品の表示許可等について」の別添2「特定保健用食品申請に係る申請書作成上の留意事項」に示された特定保健用食品の試験方法に準拠することが求められています。

食後の血糖上昇に関する試験の評価指標については、以下のように規定されています:

「原則として、食後血糖及び血中濃度曲線下面積 (AUC) とする」

ガイドラインにおいては、「血中濃度曲線下面積 (AUC: Area Under the Curve)」という概念が包括的に用いられており、

増分曲線下面積 (incremental Area Under the Curve: iAUC) を用いるか、
総曲線下面積 (total Area Under the Curve: tAUC) を用いるかは、

個々の試験デザインにおいて明確に定義する必要があります。

食後血糖上昇を評価して食品の保健機能を検証する目的においては、空腹時血糖値 (ベースライン値) の個人差や試験間変動の影響を除外できる iAUC が広く用いられているのが実情です。
特に、被験者間のベースライン値のばらつきが大きい一般健常者を対象とした試験では、iAUCを用いることで、食後血糖応答そのものを適切に評価できるという利点があります。

データの取得

2.1 使用するデータ

本稿では、HUPA-UCM diabetes dataset を使用します。
このデータセットは、1型糖尿病患者 25 名を対象として収集された医学研究データであり、糖尿病管理の改善や血糖予測モデルの開発など、さまざまな研究目的に利用可能です。

2.2 ダウンロード方法

データセットは以下のURLから入手できます。
https://data.mendeley.com/datasets/3hbcscwz44/1

ページ上部の “Download All” をクリックすると、

  • 処理前の Raw_Data
  • 前処理済みの Preprocessed

の2種類のデータを一括で取得できます。

本稿では、前処理済みデータ (Preprocessed) のうち、5 名分の被験者データを使用します。

ページ内の “Files” → “Preprocessed” フォルダを開き、HUPA0001P.csv ~ HUPA0005P.csv の5ファイルをダウンロードしてください。

なお、このデータセットはAPIが公開されているため、手動ダウンロードを行わずに自動で取得し、解析用データセットを構築することも可能です。

APIの使い方は、長くなるのでまたの機会で紹介します。

2.3 データセットの構造

取得したデータセットの変数定義を表1に示します。

表1. データセットに格納されている変数の定義

変数名 内容
time データ記録時刻
glucose 血糖値(mg/dL)
calories 時間区間における消費カロリー
heart.rate 心拍数
steps 時間区間における歩数
basal.rate 時間区間における基礎インスリン注入量
bolus.volume.delivered 時間区間におけるインスリンボーラス注射量
carb.input 時間区間における炭水化物摂取量(1 サービング = 10 g)

iAUC計算用のデータセット作成

取得したデータを見ると5分おきにグルコースが測定されています。
今回は練習用に5時点だけデータを抽出してiAUCが計算しやすい形式に整えます。

本稿では、食後血糖上昇試験で一般的に採用される試験デザインに基づき、各被験者について炭水化物摂取 (carb_input) が最初に記録された時刻を起点 (基準時刻) として扱います。

この起点を基準に、

  • 摂取 30 分前 (空腹時血糖: ベースライン)
  • 摂取 30 分後
  • 60 分後
  • 90 分後
  • 120 分後

の5時点で血糖値の観測値を抽出し、新しい解析用データセットを作成します。

3.1 ライブラリの読み込み

library(dplyr)            #データの加工に使用
library(lubridate)        #日時処理に使用
library(tidyr)            #データセットをwide型にする際に使用

データセットの作成に使用するパッケージを読み取ります。

3.2 ファイル一覧取得および時間定義

# --- 1. ファイル一覧を取得(例:HUPA0001P〜HUPA0005P.csv) ---
files <- list.files(“データが保管してあるフォルダのパスを記載”,
pattern = "HUPA000[0-9]+P\\.csv",
full.names = TRUE)[1:5]

# --- 2. 食事前後の時点を定義 ---
time_offsets <- c(-30, 30, 60, 90, 120)

処理対象のCSVファイルパスを「files」に格納します。パスが正しくない場合はエラーとなりますので注意してください。「time_offsets」には、起点 (摂取時刻) からの経過時間 (分) を配列として格納します。

3.3 被験者ごとの処理関数

# --- 3. 被験者ごとのデータ作成関数 ---
create_subject_wide <- function(file_path) {
  df <- read.csv(file_path, sep = ";")
  df$time <- as.POSIXct(df$time, format = "%Y-%m-%dT%H:%M:%S", tz = "UTC")

  meal_time <- df %>%
    filter(carb_input > 0) %>%
    slice(1) %>%
    pull(time)

  if (length(meal_time) == 0) return(NULL)

  time_points <- meal_time + minutes(time_offsets)

  glucose_vals <- sapply(time_points, function(t) {
    idx <- which.min(abs(difftime(df$time, t, units = "mins")))
    df$glucose[idx]
  })

  subject_id <- gsub(".*/|\\.csv", "", file_path)

  tibble(subject = subject_id, !!!setNames(as.list(glucose_vals), time_offsets))
}          

この関数は、被験者ごとにデータを抽出し、ワイド型形式に整形する処理を行います。

コードの詳細解説
【2~5行目】
「read.csv (..., sep=";")」でセミコロン区切りのCSVを読み込み、「as.POSIXct (...)」でtime列を日時オブジェクトに変換します。

【7~10行目】
「Carb_input > 0」で炭水化物摂取が記録された行を抽出し、「slice (1)」で最初の行のみを取得します。「pull (time)」でtime列の値をベクトルとして抽出します (時間差計算のため)。

【12行目】
炭水化物摂取イベントが記録されていないファイルが存在する場合、処理をスキップするための記述です。

【14行目】
「meal_time+Minutes (time_offsets)」で、各測定時点の日時を算出します。

(例): meal_timeが「2018-06-13 21:50:00」の場合、time_pointsは以下のようになります:
「2018-06-13 21:20:00, 2018-06-13 22:20:00, 2018-06-13 22:50:00, 2018-06-13 23:20:00, 2018-06-13 23:50:00」

【16~19行目】
「time_points」に含まれる各目標時刻について、観測時刻の中で最も近い時点を探索し、その時点の血糖値を抽出します。

【21行目】
ファイル名から被験者IDを抽出します。

【23~25行目】
被験者ごとに、各測定時点に対応する血糖値を1行のデータとして返します。

3.4 関数の実行

# --- 4. wide形式データセットを作成 ---
iAUC_wide <- lapply(files, create_subject_wide) %>%
  bind_rows()

print(iAUC_wide)

「lapply()」で各ファイルに対して「create_subject_wide()」を順次実行し、戻り値をリストとして取得します。「bind_rows()」でリストを結合し、1つのデータフレームを作成します。
以上のコードを実行すると、以下のようなワイド型データセットが作成されます。

iAUCの算出

ワイド型に整形したデータセットを使用し、被験者ごとにIAUCを計算します。IAUCは台形法を用いて算出します。なお、

-30分時点 (空腹時血糖値: ベースライン) を摂取時刻 (0分) として計算します。

4.1 台形法によるiAUC計算の原理

台形法とは、曲線下面積を近似的に求める数値積分法の一つです。連続する2つの測定点を直線で結び、その区間を台形とみなして面積を計算し、全区間の台形面積を合計することで曲線下面積全体を近似します。

図1に台形法の概念図を示します。時刻t1、t2における血糖値増分をy1、y2とすると、この区間の台形面積Sは以下の式で表されます。

\[ S = \frac{y_1 + y_2}{2} \times (t_2 - t_1) \]

この計算をすべての時間区間 (0-0.5時間、0.5-1時間、1-1.5時間、1.5-2時間) について行い、合計することでiAUCを算出します。

図1. 台形法の概念図

4.2 ベースラインを跨ぐ場合の処理

食後血糖応答では、血糖値がベースライン (空腹時血糖値) を下回る場合があります。このような場合、単純な台形計算では正確な面積が得られないため、ベースラインとの交点を求めて適切に処理する必要があります。

IAUCの計算では、隣接する2測定間で以下の4パターンに応じた処理を行います:

符号の変化 処理内容
(+) ⇒ (+) 両方とも正の値 → そのまま台形の面積を計算
(+) ⇒ (-) 正から負に転じる → ベースラインとの交点までの台形面積のみ計算
(-) ⇒ (+) 負から正に転じる → ベースラインとの交点以降の台形面積のみ計算
(-) ⇒ (-) 両方とも負の値 → 面積を 0 として扱う(ベースライン未満の低下は評価対象外)

パターン2および3における交点の時刻x_zeroは、線形補間により以下の式で算出されます。

\[ x_{\text{zero}} = \frac{y_1 t_2 - y_2 t_1}{\, y_1 - y_2 \,} \]

この処理により、血糖値の上昇と加工を正確に評価したiAUC値が得られます。

4.3 四捨五入関数

# --- 5. 四捨五入関数の定義 ---
round_half_up <- function(x, digits = 0) {
  trunc(x * 10^digits + 0.5) / 10^digits
}

iAUCを小数点第一位まで算出するために、四捨五入関数を自作します。Rの「round ()」関数は、「銀行丸め (偶数丸め)」と呼ばれる方式を採用しているため、端数が0.5の場合に必ずしも切り上げられません。そこで、数値を指定桁数だけ拡大してから0.5を加え、整数化 (切り捨て) したうえで元の桁に戻すことで、端数0.5を常に切り上げる四捨五入を実現しています。

4.4 iAUCの計算

# --- 6. 手計算でIAUC(時間単位) ---
iAUC_results <- iAUC_wide %>%
  rowwise() %>%
  mutate(
    iAUC_mg_h_dL = {
      glucose_vals <- c_across(`-30`:`120`)
      baseline <- glucose_vals[1]
      increment <- glucose_vals - baseline

      time_rel <- c(0, 0.5, 1, 1.5, 2)

      iAUC <- 0
      for (i in 1:(length(time_rel) - 1)) {
        x1 <- time_rel[i]
        x2 <- time_rel[i + 1]
        y1 <- increment[i]
        y2 <- increment[i + 1]

        # 4パターンで場合分け
        if (y1 > 0 & y2 > 0) {
          area <- (y1 + y2) / 2 * (x2 - x1)
        } else if (y1 > 0 & y2 <= 0) {
          x_zero <- (y1 * x2 - y2 * x1) / (y1 - y2)
          area <- (y1 + 0) / 2 * (x_zero - x1)
        } else if (y1 <= 0 & y2 > 0) {
          x_zero <- (y1 * x2 - y2 * x1) / (y1 - y2)
          area <- (0 + y2) / 2 * (x2 - x_zero)
        } else {
          area <- 0
        }

        iAUC <- iAUC + area
      }

      round_half_up(iAUC, 1)  # 四捨五入で mg·h/dL 単位
    }
  ) %>%
  ungroup() %>%
  select(subject, iAUC_mg_h_dL)

以下、コードの詳しい解説を載せます。
【2~8行目】
「rowwise()」で行 (被験者) ごとに処理を実行します。
「glucose_vals <- c_across (\-30`:`120`)」で-30分から120分までの血糖値をベクトルとして取得します。「baseline <- glucose_vals[1]」で-30分時点の血糖値を取得します。
「increment <- glucose_vals – baseline」で各測定時点における血糖値のベースラインからの変化量 (増分) を算出します。

【10行目】
横軸 (時間) を時間単位 (hours) で定義します。-30分を摂取時刻 (0時間) とするため、c(0, 0.5, 1, 1.5, 2)と設定します。

【12~36行目】
各時間区間 (0~0.5時間、0.5~1時間、1~1.5時間、1.5~2時間) について、前述の4パターンに応じた台形面積を計算し、それらを合計してiAUCを算出します。

  • x1、x2: 時間区間の開始時点と終了時点
  • y1、y2: 各時点における血糖値増分
  • x_zero: ベースラインとの交点 (線形補間により算出)
  • area: 各区間の台形面積

4.5 計算結果の表示

print(iAUC_results)

実行結果は以下のようになります:

まとめ

本稿では、Rを用いてiAUCを計算する方法について解説しました。生データから特定時点の血糖値を抽出し、台形法により食後血糖上昇を定量化する一連のプロセスを実装することで、再現性の高い効率的な解析が可能となります。

iAUCは食後血糖上昇パターンを客観的に評価する重要な指標であり、機能性食品の有効性評価において中心的な役割を果たします。本稿で示した手法が、食後血糖管理に関する研究や機能性食品開発の一助となれば幸いです。

関連するサービス

参考文献