心理ネットワークを用いた
シミュレーション研究

計算論的臨床心理学サマースクール2025

専修大学大学院文学研究科心理学専攻修士課程2年
大水 拓海

2025-08-07

自己紹介

大水拓海(おおみず たくみ)

所属

専修大学大学院文学研究科心理学専攻修士課程2年

研究テーマ・関心

心理療法の作用機序,感情粒度,心理ネットワーク,
シミュレーション,能動的推論

個人HP

心理ネットワークシミュレーション

なぜネットワークからシミュレーションを行うか?

  • 実際の臨床データを使用することの困難さ(入手や使用)

  • 侵襲性の問題を超えて介入を試す,予測する

  • 新たな仮説の生成

ネットワークシミュレーションの実例

Cramer et al(2016)

DSM-III-TRに基づく大うつ病の横断データ(8973名)から症状ネットワークを推定

Cramer et al (2016)

ネットワークの結合を強めるパラメータ\(c\)の値が症状全体の活性化を左右する(Cramer et al, 2016)

\[A^{t}_{i} = \sum^{J}_{j=1} cW_{ij}X^{t-1}_j\tag{1}\]

\[P(X^{t}_{i} = 1) = \frac{1}{1+e^{b_{i}}-A^{t}_i} \tag{2}\]

Omizu & Kunisato(2025)

Omizu & Kunisato(2025)

  • Cramerのモデルでは症状のみの接続の強さに着目

  • 心理療法の介入効果研究データにおいて,症状が改善しても接続が強まっていることが報告(Höller et al, 2022)
    →心理療法などの治療的な要素を入れて拡張することで,ネットワークの中でどの症状を標的にすれば大きな治療効果が得られるかシミュレーションできる

  • 治療的な要素を表す仮想のノードを入れてシミュレーションを行う

Omizu & Kunisato(2025):単独症状

Omizu & Kunisato(2025):複数症状

psynetsim パッケージ

シミュレーションを実際に行ってみる

psynetsim パッケージ

  • ネットワークシミュレーションを実行する関数を
    パッケージにしてまとめました

  • ご自身のRコンソールに以下をコピペして,パッケージをインストールしてください

remotes::install_github("TakumiOmizu/psynetsim")
library(psynetsim)

psynetsim パッケージ

  • W_init:第1引数。症状ネットワークの重み。

  • b_init:第2引数。各ノードの活性化閾値。

  • target:第3引数。どのノードを標的とするかを選択する。介入するノードは1,介入しないノードは0にする。

上記は必須の引数です。
他にもいろいろオプションがあります。

?simulate_treatment_network

psynetsim パッケージ

仮想データの作成

# Example data for a 6-symptom network
set.seed(456)
weight_6 <- matrix(rnorm(6*6, mean = 0.2, sd = 0.08), nrow = 6, ncol = 6)
diag(weight_6) <- 0
weight_6[upper.tri(weight_6)] <- t(weight_6)[upper.tri(weight_6)]
print(weight_6)
           [,1]      [,2]      [,3]       [,4]       [,5]      [,6]
[1,] 0.00000000 0.2497420 0.2640700 0.08888861 0.14285145 0.1740751
[2,] 0.24974204 0.0000000 0.2805882 0.24585877 0.12673516 0.3048878
[3,] 0.26406997 0.2805882 0.0000000 0.35578851 0.33895489 0.2309987
[4,] 0.08888861 0.2458588 0.3557885 0.00000000 0.08585358 0.2166589
[5,] 0.14285145 0.1267352 0.3389549 0.08585358 0.00000000 0.1128498
[6,] 0.17407512 0.3048878 0.2309987 0.21665887 0.11284977 0.0000000
threshold_6 <- data.frame(threshold = rnorm(6, mean = 0.3, sd = 0.05))
print(threshold_6)
  threshold
1 0.2669698
2 0.2929874
3 0.2788010
4 0.2980632
5 0.2985529
6 0.3196519

psynetsim パッケージ

ターゲットとノード名の設定

target_list_6 <- list(symptom1 = 1, symptom2 = 0, symptom3 = 0,
                      symptom4 = 0, symptom5 = 0, symptom6 = 0)
custom_symptom_names_6 <- c("Anxiety", "Sadness", "Fatigue",
                            "Insomnia", "Irritability", "Pain")

シミュレーションの実行

# Run the simulation with custom parameters
sim_results <- simulate_treatment_network(
  W_init = weight_6, #重み
  b_init = threshold_6$threshold, #閾値
  target = target_list_6, #ターゲット
  connectivity = 1.2, #全体的な接続の強さ
  edge_between_TC = 1, #TCノード間の接続の強さ
  weight_bias = 1, #症状とTCノードの重みの強さ
  TB = 1, #閾値の値の高さ
  trial = 10, # 繰り返し回数(複数回行って平均を取っている)
  baseline_iteration = 10, # ベースラインのステップ数
  num_TC = 5, # TCノードの数
  TC_iteration_per_component = 10, # 何ステップごとにTCを追加するか
  follow_up_iteration = 10, # TCを全て追加した後のフォローアップ期間
  symptom_name = custom_symptom_names_6
)

psynetsim パッケージ

シミュレーション結果

ネットワークシミュレーションを試そう!

Jordan et al(2017)のオープンデータからPHQ-9を使用

# Isingのデータを使ってシミュレーションする
library(tidyverse)
library(foreign)
library(bootnet)
library(qgraph)
library(IsingFit)

# データの読み込み
data <- read.spss("pone.0182162.s004.sav", 
                  to.data.frame=TRUE)

# データの整理(PHQ-9に絞って実行)
data_phq <- data %>% 
  mutate(phq9a = S_PHQ9_a, phq9b = S_PHQ9_b, 
         phq9c = S_PHQ9_c, phq9d = S_PHQ9_d, 
         phq9e = S_PHQ9_e, phq9f = S_PHQ9_f, 
         phq9g = S_PHQ9_g, phq9h = S_PHQ9_h, 
         phq9i = S_PHQ9_i) %>% 
  select(phq9a, phq9b, phq9c, phq9d, phq9e, phq9f, phq9g, phq9h, phq9i) %>%
  binarize(split = 1)

Isingモデルによる推定

res <- estimateNetwork(data_phq, "IsingSampler")
plot(res)

データの確認

重み

res$graph
           [,1]      [,2]       [,3]       [,4]      [,5]       [,6]      [,7]
 [1,] 0.0000000 1.3598888 0.39036726  0.8791334 0.6737027 0.49194876 0.5026814
 [2,] 1.3598888 0.0000000 0.39405655  1.2457115 0.3620559 1.21532553 0.4574443
 [3,] 0.3903673 0.3940566 0.00000000  1.1536313 0.3415879 0.08258789 0.4543918
 [4,] 0.8791334 1.2457115 1.15363134  0.0000000 0.8425978 0.42826040 0.7245392
 [5,] 0.6737027 0.3620559 0.34158795  0.8425978 0.0000000 0.64280102 0.4754185
 [6,] 0.4919488 1.2153255 0.08258789  0.4282604 0.6428010 0.00000000 0.8536002
 [7,] 0.5026814 0.4574443 0.45439179  0.7245392 0.4754185 0.85360019 0.0000000
 [8,] 0.2452308 0.4169612 0.22146313  0.2092072 0.7567971 0.43849695 1.2259679
 [9,] 0.6029947 1.5008609 0.49087136 -0.1536085 0.3375352 1.36438942 0.2755119
           [,8]       [,9]
 [1,] 0.2452308  0.6029947
 [2,] 0.4169612  1.5008609
 [3,] 0.2214631  0.4908714
 [4,] 0.2092072 -0.1536085
 [5,] 0.7567971  0.3375352
 [6,] 0.4384970  1.3643894
 [7,] 1.2259679  0.2755119
 [8,] 0.0000000  0.4400285
 [9,] 0.4400285  0.0000000

閾値

res$intercepts
[1] -2.038571 -3.426840 -0.849713 -1.210756 -2.245608 -3.244438 -2.448399
[8] -3.456250 -4.700490

シミュレーションの実行

一つ目の症状ノードを標的にした介入

#推定したデータを使ってシミュレーション
simulate_treatment_network(res$graph, 
                           res$intercepts,
                           connectivity = 1.3,
                           target = c(1,0,0,0,0,0,0,0,0),
                           num_TC = 9,
                           edge_between_TC = 2,
                           weight_bias = 1)

シミュレーション結果

$result_plot
TableGrob (1 x 2) "arrange": 2 grobs
  z     cells    name           grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (1-1,2-2) arrange gtable[layout]

$result_text
[1] "The mean value of symptom at the final step(t=110). = 0.611\nThe mean value of treatment component at the final step(t=110). = 0.644\nThe SD value of symptom at the final step(t=110). = 0.340\nThe SD value of treatment component at the final step(t=110). = 0.456"

ワーク

PHQ-9の症状ネットワークや,関心のあるテーマから推定したネットワークを対象にして,ネットワークシミュレーションを行ってみましょう!

  • 単独もしくは複数の症状を標的とした場合,どの症状への介入が最も効果的か?

  • 症状を悪化させてしまう組み合わせはあるか?

  • その他,どんな条件だとどんなことが起きそうか?