ネットワークにおける変化のモデリング

国里愛彦(専修大学)

ネットワークは変化する?

  • ベクトル自己回帰(VAR)モデルは基本的にパラメータの定常性(時間によって変化しないこと)を仮定している。

  • 心理変数間の関係は時間に対して一定?心理的介入の前後では関係が変わるのでは?

時変ネットワークモデル

  • 時間経過にともなってパラメータ(偏相関係数など)が変化していくネットワークを時変(time-varying)ネットワークモデルと呼ぶ(Haslbeck J. M. B. et al., 2022)

  • 平均ベクトル\(\mu_{t}\)や偏相関行列\(\Omega_{t}\)のように,パラメータに時間tの添字がつく。

時間的変化は連続?離散?

  • ネットワークのパラメータの変化には連続的変化(左)と離散的変化(右,状態間でジャンプ有り)がある

  • 連続か離散かによって解析が変わるので,理論的・実証的(先行研究)にどちらが適切か検討する

時変ネットワークの推定

連続的な変化を仮定する場合

  • 移動窓アプローチ(後述),一般化加法モデリング(パラメータを時間の関数として明示的にモデル化),融合LASSOなどがある。

離散的な変化を仮定する場合

  • パラメータの変化に関係する変数(治療の前後を表す変数)が調整変数か検討,隠れマルコフモデル(データから隠れ状態の遷移を推定するモデル),レジーム・スイッチングモデル(ある閾値を超えるかで状態が変化するモデル)

連続的な変化(移動窓アプローチ)

  • 時系列上で窓を移動をさせていき,その窓ごとに局所モデルを多数推定する方法

  • 固定窓と異なり,全てのデータポイントを利用するが特定の時点に重みをつけて推定(カーネル重み付け法,詳細は Haslbeck et al. (2020)

帯域幅の検討

  • 移動窓アプローチでは,カーネル関数の幅(帯域幅)が重要になる

  • 帯域幅が広いと多くのデータポイントを使うので,推定は安定するが時間変化の感度が下がる(オレンジ)。狭いと逆(緑)。

使用データ

  • Journal of Open Psychology Dataに掲載された Kossakowski et al. (2017) のデータを用いる。

  • Kossakowski et al. (2017) は,1名のうつ病患者に239日間さまざまな症状を収集(1日10回で合計1478回答)

  • データはOSF(https://osf.io/j4fg8/)で配布されているので,ESMdata.zipをダウンロードして展開する。

  • 同じデータがmgm(Haslbeck & Waldorp, 2020)パッケージに入っているが(symptom_data),実際の解析に近づけるためにcsvファイルから読み込む。

使用パッケージ

library("tidyverse")
library("lubridate") 
library("mgm")
library("qgraph")

データの読み込みと日付データの処理

  • csvファイルを読み込んで,dmy_hms()で日付データを処理する
  • time_normは最初の測定が0,最後の測定が1になるように標準化
data <- read_csv("ESMdata/ESMdata.csv") |> 
  mutate(datetime = dmy_hms(paste(date, resptime_e))) 

data$time_norm <- as.numeric(data$datetime-data$datetime[1])/as.numeric((data$datetime-data$datetime[1])[nrow(data)])
head(data)
# A tibble: 6 × 88
   ...1 date     phase concentrat dayno beepno beeptime resptime_s resptime_e
  <dbl> <chr>    <dbl>      <dbl> <dbl>  <dbl> <time>   <time>     <time>    
1     1 13/08/12     1        150   226      1 08:58    08:58:56   09:00:15  
2     2 14/08/12     1        150   227      5 14:32    14:32:09   14:33:25  
3     3 14/08/12     1        150   227      6 16:17    16:17:13   16:23:16  
4     4 14/08/12     1        150   227      8 18:04    18:04:10   18:06:29  
5     5 14/08/12     1        150   227      9 20:57    20:58:23   21:00:18  
6     6 14/08/12     1        150   227     10 21:54    21:54:15   21:56:05  
# ℹ 79 more variables: resp_abort <dbl>, mood_relaxed <dbl>, mood_down <dbl>,
#   mood_irritat <dbl>, mood_satisfi <dbl>, mood_lonely <dbl>,
#   mood_anxious <dbl>, mood_enthus <dbl>, mood_suspic <dbl>,
#   mood_cheerf <dbl>, mood_guilty <dbl>, mood_doubt <dbl>, mood_strong <dbl>,
#   pat_restl <dbl>, pat_agitate <dbl>, pat_worry <dbl>, pat_concent <dbl>,
#   se_selflike <dbl>, se_ashamed <dbl>, se_selfdoub <dbl>, se_handle <dbl>,
#   soc_who1 <dbl>, soc_enjoy_alone <dbl>, soc_prefcomp <dbl>, …

変数を選択し,欠測を除外する

  • select()で使う変数を選択(気分12変数,時間関連5変数)

  • 欠測があるので(5つの測定),filter()とcomplete.cases()で完全ケースに絞る

data_select <- data |> 
  select(mood_relaxed,mood_down,mood_irritat,
         mood_satisfi,mood_lonely,mood_anxious,
         mood_enthus,mood_suspic,mood_cheerf,
         mood_guilty,mood_doubt,mood_strong,
         datetime,time_norm,beepno,dayno,phase)

data_complete <- data_select |> 
  filter(complete.cases(data_select))

データの可視化(対象者の状態)

  • 対象者の状態(1=ベースライン,2=減薬前:盲検,3=減薬中:盲検,4=減薬後,5=研究後)をggplot2でプロットする(aes()でx軸やy軸を決め,geom_line()で折れ線グラフを描く)。
data_complete |> 
  ggplot(aes(x=datetime,y=phase)) + 
  geom_line() 

データの可視化(1)

  • データを前処理し(selectで-を使って使わない変数を除外,pivot_longerでロング型に,mutateで変数を因子型に),ggplot2でプロット。情報多すぎ…
data_complete |> 
  select(-time_norm,-beepno,-dayno,-phase) |>   
  pivot_longer(cols=-datetime,
               names_to = "variables",
               values_to = "score") |> 
  mutate(variables = as.factor(variables)) |> 
  ggplot(aes(x=datetime,y=score, color=variables)) + 
  geom_line() +
  geom_point()