【統計解説】潜在クラス分析ってなんじゃい?

症状パターンの背後にある見えない患者タイプを推定する潜在クラス分析(LCA)について、EMアルゴリズムによる推定の流れ、BICによるクラス数の決め方、k-meansやGMMとの違いまでを順を追って解説する。

ChatGPTと一緒に統計学に関わる事象について直感的な理解を目指すシリーズ。

同手法が用いられている参考論文: Symptom Subtypes of Obstructive Sleep Apnea Predict Incidence of Cardiovascular Outcomes

0. 目次

No.項目
1まず全体像:潜在クラス分析とは何か
2「クラスタリング」と考えてよいのか
3まず、LCAに実際に入力するデータは何なのか
4LCAでは何を未知のものとして推定するのか
5もし誰がどのクラスか分かっていれば簡単である
6LCAでは「クラス」も「症状確率」も両方分からない
7Step 0:まず仮のパラメータから始める
8E-step:患者AがClass 1らしいかを計算する
9同じ患者についてClass 2の場合も計算する
10Bayesの定理で「患者Aが各クラスに属する確率」を求める
11全患者について同じ計算を行う
12M-step:Class 1の人数を更新する
13M-step:Class 1の日中眠気率を更新する
14他の症状確率も同様に更新する
15新しい確率を使って、もう一度E-stepを行う
16いつ計算を終了するのか
17「眠気型」という名前は最後に付ける
18LCAで実際に行っていることを一気につなげる
19したがってLCAは最初から患者を硬く分けているわけではない
20では「クラスが4個」とどうやって決めたのか
21BICとは何をしているのか
22なぜクラスを増やすとパラメータが増えるのか
23この論文では何をしたのか
24つまりLCAとCoxは全く別の役割を担当している
25k-meansとの違いを数式レベルで見る
26Gaussian mixture modelとの方がむしろ近い
27この論文でLCAが適している理由
28ただし「4種類のOSAが本当に存在する」と証明したわけではない
29local independenceもかなり強い仮定である
30BIC最小だから機械的に正解、というわけでもない
31今回の4クラスは何を意味しているのか
32全体を一気につなげると
33一番重要な理解

1. まず全体像:潜在クラス分析とは何か

Latent Class Analysis(LCA:潜在クラス分析)は、

複数の観測されたカテゴリ変数の組み合わせから、その背後に存在すると仮定した「直接観測できないカテゴリ」を推定する統計モデル

である。

今回の論文なら、実際に観測できるのは、

1
2
3
4
5
6
7
日中眠気がある
入眠困難がある
夜中に目が覚める
起床時にすっきりしない
身体的疲労がある
ESSが高い
……

といった症状である。

一方、

1
この人は「excessively sleepy型」である

という変数を直接測定したわけではない。

そこで、

1
2
3
4
5
             潜在クラス C
                  ↓
        ┌─────────┼─────────┐
        ↓         ↓         ↓
    日中眠気   入眠困難   身体的疲労

のように、

背後に「患者タイプ」という見えない変数 $C$ が存在し、そのタイプによって各症状が出現する確率が変わる

と考える。

この見えない変数が、

$$ \boxed{\text{latent class}} $$

である。

今回の論文ではAHI 15以上のOSA患者1,207人について、14個の症状質問とESSを用いてLCAを行い、最終的に4つの症状サブタイプを得ている。(PubMed Central (PMC))


2. 「クラスタリング」と考えてよいのか

結論から言えば、

$$ \boxed{\text{LCAはクラスタリングの一種と考えてよい}} $$

ただし、k-meansのような一般的なクラスタリングとは患者を分ける根拠が違う。

k-meansなら、

特徴量空間で距離の近い人を同じグループにする

という発想になる。

一方LCAでは、

いくつかの潜在集団が存在し、それぞれの集団が異なる確率で症状を出している

という確率モデルを仮定する。

つまり、

1
2
3
4
k-means
患者同士がどれくらい似ているか
        ↓
距離でグループ化

なのに対して、

1
2
3
4
5
6
LCA
この症状パターンは
どの潜在集団から発生したと考えると
最ももっともらしいか
        ↓
確率でグループ化

となる。

ここが本質的な違いである。


3. まず、LCAに実際に入力するデータは何なのか

ここを最初にはっきりさせておく。

LCAを行う時点で研究者が実際に持っているのは、

各患者について観測された症状データだけ

である。

例えば、説明を単純にするため、

$S$ = 日中眠気

$I$ = 入眠困難

$F$ = 身体的疲労

の3症状だけを調べたとする。

それぞれ、

$$ 0=\text{症状なし},\qquad1=\text{症状あり} $$

とする。

5人の患者から次のデータが得られたとする。

患者日中眠気 $S$入眠困難 $I$身体的疲労 $F$
A101
B101
C010
D101
E010

これが実際に観測されたデータである。

この時点では、

1
2
3
患者Aは眠気型なのか?
患者Bは眠気型なのか?
患者Cは不眠型なのか?

ということは分からない。

また、

$$ P(S=1\mid C=1) $$

のような、

Class 1の患者に日中眠気が出現する確率

も分からない。

つまり、最初に分かっているのは、

$$ \boxed{ X= \text{患者ごとの症状データ} } $$

だけである。


4. LCAでは何を未知のものとして推定するのか

例えば、

この患者集団には2種類の潜在クラスが存在する

と仮定してみる。

この段階では、

1
2
Class 1
Class 2

という名前しかなく、

「眠気型」

「不眠型」

などという意味付けもまだ存在しない。

LCAで推定したいものは主に2種類ある。

1つ目は、

$$ \pi_k=P(C=k) $$

である。

これは、

全患者のうちClass $k$ がどのくらい存在するか

というクラス割合である。

例えば、

$$ \pi_1=0.6 $$

なら、

集団の約60%がClass 1に由来する

という意味になる。

2つ目は、各クラスにおける各症状の出現確率である。

例えば、

$$ \theta_{S1}=P(S=1\mid C=1) $$$$ \theta_{I1}=P(I=1\mid C=1) $$$$ \theta_{F1}=P(F=1\mid C=1) $$

である。

つまり最終的には、

Class 1Class 2
クラス割合 $\pi_k$??
$P(S=1\mid C=k)$??
$P(I=1\mid C=k)$??
$P(F=1\mid C=k)$??

の**?を患者データから推定したい**。

ここがLCAの目的である。


5. もし誰がどのクラスか分かっていれば簡単である

まず、潜在クラスが観測できる世界を考えてみる。

仮に、

患者クラス$S$$I$$F$
A1101
B1101
C2010
D1101
E2010

と分かっていたとする。

Class 1は3人いて、その3人全員に日中眠気がある。

したがって、

$$ P(S=1\mid C=1)=\frac{3}{3}=1 $$

である。

Class 1で入眠困難がある患者は0人なので、

$$ P(I=1\mid C=1)=\frac{0}{3}=0 $$

となる。

Class 2では2人中2人に入眠困難があるので、

$$ P(I=1\mid C=2)=\frac{2}{2}=1 $$

である。

つまり、

誰がどのクラスに属するか分かっていれば、各クラスの症状確率は単なる割合として計算できる。

しかし実際のLCAでは、

$$ C_i $$

は観測されない。

ここが問題になる。


6. LCAでは「クラス」も「症状確率」も両方分からない

実際には、

1
2
3
誰がClass 1なのか分からない
        ↓
Class 1の症状出現率を計算できない

一方、

1
2
3
Class 1の症状出現率が分からない
        ↓
誰がClass 1らしいのか判断できない

という循環が起こる。

つまり、

$$ \boxed{ \text{クラス所属} \leftrightarrow \text{クラスごとの症状確率} } $$

の両方を同時に推定する必要がある。

そこで用いられる代表的な方法が、

$$ \boxed{ \text{EM algorithm} } $$

である。

考え方は、

1
2
3
4
5
6
7
8
① とりあえず仮の確率を置く
② その仮の確率を使って
   各患者が各クラスにどの程度属しそうか計算する
③ その所属確率を使って
   各クラスの症状出現率を計算し直す
④ 新しい症状出現率を使って
   所属確率をもう一度計算する
⑤ 繰り返す

というものである。


7. Step 0:まず仮のパラメータから始める

2クラスモデルを考える。

最初は真の値が分からないので、例えば仮に、

$$ \pi_1=0.5,\qquad\pi_2=0.5 $$

とする。

さらに、

症状Class 1Class 2
$P(S=1\mid C=k)$0.600.30
$P(I=1\mid C=k)$0.300.70
$P(F=1\mid C=k)$0.600.40

という初期値から始めたとする。

重要なのは、

この0.60や0.30はデータから最終的に得られた答えではない。計算を開始するための仮の値にすぎない。

ということである。

実際のソフトウェアでは複数の初期値から計算を開始することも多い。


8. E-step:患者AがClass 1らしいかを計算する

患者Aの実際のデータは、

$$ (S,I,F)=(1,0,1) $$

である。

まず、

もし患者AがClass 1だったなら、この症状パターンが出る確率はどれくらいか

を考える。

LCAでは基本的に、クラスが決まれば症状同士は独立であるという局所独立性を仮定する。

したがって、

$$ P(S=1,I=0,F=1\mid C=1) $$

は、

$$ P(S=1\mid C=1) P(I=0\mid C=1) P(F=1\mid C=1) $$

となる。

現在の仮パラメータでは、

$$ P(S=1\mid C=1)=0.60 $$$$ P(I=1\mid C=1)=0.30 $$

なので、

$$ P(I=0\mid C=1)=0.70 $$

である。

また、

$$ P(F=1\mid C=1)=0.60 $$

なので、

$$ P(X_A\mid C=1)=0.60\times0.70\times0.60=0.252 $$

となる。

しかしClass 1自体が集団の50%しかいないという情報も考慮する必要がある。

したがって、

$$ P(C=1,X_A)=\pi_1P(X_A\mid C=1) $$$$ =0.5\times0.252=0.126 $$

となる。


9. 同じ患者についてClass 2の場合も計算する

Class 2では、

$$ P(S=1\mid C=2)=0.30 $$$$ P(I=1\mid C=2)=0.70 $$$$ P(F=1\mid C=2)=0.40 $$

である。

患者Aは、

$$ (S,I,F)=(1,0,1) $$

なので、

$$ P(X_A\mid C=2)=0.30\times(1-0.70)\times0.40 $$$$ =0.036 $$

となる。

さらに、

$$ \pi_2=0.5 $$

なので、

$$ P(C=2,X_A)=0.5\times0.036=0.018 $$

となる。

つまり患者Aについて、

1
2
Class 1から生じた重み付き確率    0.126
Class 2から生じた重み付き確率    0.018

となった。


10. Bayesの定理で「患者Aが各クラスに属する確率」を求める

患者Aの症状データが観測されたという条件のもとで、

$$ P(C=1\mid X_A) $$

を求める。

Bayesの定理から、

$$ P(C=1\mid X_A)=\frac{P(C=1,X_A)}{P(C=1,X_A)+P(C=2,X_A)} $$

なので、

$$ =\frac{0.126}{0.126+0.018} $$$$ =0.875 $$

となる。

Class 2は、

$$ P(C=2\mid X_A)=0.125 $$

である。

つまり現在の仮パラメータのもとでは、

患者Aは87.5% Class 1、12.5% Class 2らしい

ということになる。

重要なのは、

1
患者A → Class 1

といきなり確定するのではなく、

1
2
3
患者A
Class 1    0.875人分
Class 2    0.125人分

のように扱うことである。

これがE-stepで行っていることである。


11. 全患者について同じ計算を行う

A〜Eの全患者について同じ計算を行うと、例えば、

患者実際の症状 $(S,I,F)$Class 1所属確率Class 2所属確率
A$(1,0,1)$0.8750.125
B$(1,0,1)$0.8750.125
C$(0,1,0)$0.1430.857
D$(1,0,1)$0.8750.125
E$(0,1,0)$0.1430.857

のような結果になったとする。

これで初めて、

誰がどのクラスにどの程度属していそうか

という情報が得られた。

しかしこれはまだ、最初に仮置きしたパラメータに基づく暫定的な結果である。

次に、この結果を使って症状確率そのものを更新する。


12. M-step:Class 1の人数を更新する

Class 1への所属確率を全部足すと、

$$ 0.875+0.875+0.143+0.875+0.143=2.911 $$

となる。

つまり5人の患者のうち、

合計2.911人分がClass 1に属している

と考える。

したがってClass 1の割合は、

$$ \pi_1=\frac{2.911}{5}=0.582 $$

と更新される。

同様にClass 2は、

$$ \pi_2=1-0.582=0.418 $$

となる。

最初は、

$$ \pi_1=\pi_2=0.5 $$

と仮定していたが、データを使った1回目の更新によって、

$$ \pi_1=0.582 $$$$ \pi_2=0.418 $$

に変わった。


13. M-step:Class 1の日中眠気率を更新する

次に、

$$ P(S=1\mid C=1) $$

を更新する。

Class 1は合計、

$$ 2.911 $$

人分存在する。

そのうち日中眠気 $S=1$ の患者はA、B、Dである。

AがClass 1に属する重みは、

$$ 0.875 $$

Bも、

$$ 0.875 $$

Dも、

$$ 0.875 $$

なので、

$$ 0.875+0.875+0.875=2.625 $$

人分になる。

したがって、

$$ P(S=1\mid C=1)=\frac{2.625}{2.911} $$$$ \approx0.902 $$

となる。

つまり最初に仮置きした、

$$ P(S=1\mid C=1)=0.60 $$

が、実際の患者データを使うことで、

$$ P(S=1\mid C=1)\approx0.90 $$

へ更新された。

これが、

「Class 1で眠気が出る確率」をデータから推定する

ということの具体的な意味である。


14. 他の症状確率も同様に更新する

Class 1で入眠困難があるのはCとEである。

CがClass 1に属する重みは、

$$ 0.143 $$

Eも、

$$ 0.143 $$

なので、

$$ P(I=1\mid C=1)=\frac{0.143+0.143}{2.911} $$$$ \approx0.098 $$

となる。

同様に身体的疲労についても、

$$ P(F=1\mid C=1) \approx0.902 $$

などと計算できる。

するとClass 1は、

パラメータ初期値1回更新後
$\pi_1$0.500.582
$P(S=1\mid C=1)$0.600.902
$P(I=1\mid C=1)$0.300.098
$P(F=1\mid C=1)$0.600.902

となる。

ここで初めて、

Class 1は、眠気と身体的疲労が非常に多く、入眠困難が少ない集団らしい

という形がデータから見えてくる。


15. 新しい確率を使って、もう一度E-stepを行う

しかし1回更新しただけでは終わらない。

今度は、

$$ P(S=1\mid C=1)=0.902 $$$$ P(I=1\mid C=1)=0.098 $$

などの新しい値を使って、

$$ P(C=1\mid X_i) $$

を全患者について再計算する。

すると、

1
2
3
眠気あり
入眠困難なし
疲労あり

という患者A、B、Dは、以前よりさらにClass 1に属する確率が高くなる。

一方、

1
2
3
眠気なし
入眠困難あり
疲労なし

という患者C、Eは、Class 2に属する確率がさらに高くなる。

その新しい所属確率を使って、

$$ \pi_k $$

や、

$$ P(X_j=1\mid C=k) $$

をもう一度更新する。

つまり、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
仮のクラス特徴
        ↓
各患者の所属確率を計算
        ↓
クラス特徴を更新
        ↓
新しい所属確率を計算
        ↓
クラス特徴を再更新
        ↓
……

と繰り返す。

これがEMアルゴリズムである。


16. いつ計算を終了するのか

例えばClass 1の日中眠気率が、

1
2
3
4
5
6
初期値      0.600
1回目       0.902
2回目       0.961
3回目       0.978
4回目       0.981
5回目       0.981

のように変化したとする。

最初は大きく変化するが、次第にほとんど変わらなくなる。

同様に、

$$ \pi_k $$

や他の症状確率も変化しなくなり、尤度の増加もほぼ止まる。

その時点で、

観測された患者データを最もうまく説明するパラメータに到達した

と考えて計算を終了する。

厳密には、EMアルゴリズムは反復のたびに尤度を低下させないようにパラメータを更新していく。

最終的には、

$$ \boxed{L(\pi,\theta)=\prod_{i=1}^{n}\left[\sum_{k=1}^{K}\pi_kP(X_i\mid C_i=k)\right]} $$

が大きくなるような、

$$ \hat\pi_k $$

と、

$$ \hat\theta_{jk}=\widehat{P(X_j=1\mid C=k)} $$

を得る。


17. 「眠気型」という名前は最後に付ける

ここまでの計算では、

1
2
Class 1
Class 2

という無意味な番号しか使っていない。

例えば最終的に、

症状Class 1Class 2
日中眠気0.980.05
入眠困難0.030.96
身体的疲労0.980.05

となったとする。

ここで研究者が初めて、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Class 1
眠気が非常に多い
疲労も非常に多い
入眠困難は少ない
        ↓
「眠気型」と呼ぼう
Class 2
眠気は少ない
入眠困難が非常に多い
        ↓
「睡眠障害型」と呼ぼう

と解釈する。

したがって、

$$ \boxed{ \text{眠気型だから眠気率が高くなる} } $$

のではない。

順番は逆で、

$$ \boxed{ \text{データから眠気率の高いClassが推定された} \rightarrow \text{それを眠気型と命名した} } $$

のである。


18. LCAで実際に行っていることを一気につなげる

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
【実際に観測されたもの】
患者ごとの症状データだけ
患者A   1 0 1
患者B   1 0 1
患者C   0 1 0
患者D   1 0 1
患者E   0 1 0
        ↓
【未知】
誰がClass 1なのか分からない
誰がClass 2なのか分からない
さらに
Class 1で眠気が出る確率も分からない
Class 2で眠気が出る確率も分からない
        ↓
【仮のパラメータから開始】
π1 = 0.5
π2 = 0.5
P(S=1 | C=1) = 0.6
P(I=1 | C=1) = 0.3
……
        ↓
【E-step】
現在のパラメータを使って
P(C=1 | Xi)
P(C=2 | Xi)
を患者ごとに計算
        ↓
患者A
Class 1   0.875
Class 2   0.125
などが得られる
        ↓
【M-step】
この所属確率を
「0.875人分Class 1」
のような重みとして使い、
Class 1の人数
Class 1の眠気率
Class 1の入眠困難率
Class 1の疲労率
などを計算し直す
        ↓
P(S=1 | C=1)
0.60 → 0.90
などと更新される
        ↓
【再びE-step】
更新後の症状確率から
各患者の所属確率を再計算
        ↓
【再びM-step】
症状確率を再計算
        ↓
E-step
↓
M-step
↓
E-step
↓
M-step
↓
……
        ↓
ほとんど変化しなくなる
        ↓
最終的な
πk
P(Xj=1 | C=k)
が得られる
        ↓
各Classの症状プロファイルを見る
        ↓
「このClassは眠気が突出している」
「このClassは不眠症状が多い」
        ↓
初めて
Excessively sleepy
Disturbed sleep
などと命名する

したがって、LCAで最も重要なのは、

最初からクラスごとの症状確率が分かっているわけではない

ことである。

観測されているのは患者ごとの症状データだけであり、

$$ P(X_j=1\mid C=k) $$

も、

$$ P(C_i=k\mid X_i) $$

も未知である。

この2つを、

$$ \boxed{ \text{症状確率から所属確率を推定} \leftrightarrow \text{所属確率から症状確率を推定} } $$

と交互に更新しながら、観測データ全体の尤度を高くしていく。

これが潜在クラス分析で確率がデータから推定されていく仕組みである。


19. したがってLCAは最初から患者を硬く分けているわけではない

ここはk-meansとの大きな違いである。

LCAの内部では、

患者Class 1Class 2Class 3Class 4
A0.920.040.030.01
B0.100.120.700.08
C0.280.260.240.22

のように、所属確率が存在する。

患者Aはかなり明確だが、患者Cはかなり曖昧である。

最終的に、

$$ \arg\max_k P(C_i=k\mid X_i) $$

を使って、

1
2
3
患者A → Class 1
患者B → Class 3
患者C → Class 1

と分類することはできる。

しかし患者AとCを同じ「Class 1」と表示しても、

1
2
A    Class 1確率 92%
C    Class 1確率 28%

なので、分類の確実性はまるで違う。

したがって、

LCA本来の出力は「クラスラベル」だけではなく「各クラスへの所属確率」

という理解が重要である。


20. では「クラスが4個」とどうやって決めたのか

今までは、

$$ K $$

が既に分かっているものとして説明した。

しかし実際には、

1
2
3
4
潜在クラスが2個なのか
3個なのか
4個なのか
5個なのか

も分からない。

そこで、

1
2
3
4
5
6
K=1 のLCA
K=2 のLCA
K=3 のLCA
K=4 のLCA
K=5 のLCA
……

をそれぞれ作る。

当然、クラスを増やせばモデルは複雑になり、データに合わせやすくなる。

極端に言えばクラスを無限に増やせば、個々の患者にどんどん適合できる。

そこで、

データへの適合度は良くしたいが、不必要に複雑なモデルにはしたくない

という問題が出てくる。

この論文ではそのためにBICを使っている。(PubMed Central (PMC))


21. BICとは何をしているのか

Bayesian Information Criterionは、

$$ \boxed{ BIC=-2\log\hat L+p\log n } $$

と書ける。

ここで、

$$ \hat L $$

は最尤推定したモデルの尤度、

$$ p $$

はパラメータ数、

$$ n $$

は患者数である。

前半の、

$$ -2\log\hat L $$

は、

データにどれくらいうまく適合しているか

を反映する。

尤度が高ければ、この値は小さくなる。

一方、

$$ p\log n $$

は、

パラメータをたくさん使ったことへの罰則

である。

したがって、

$$ \boxed{\text{BIC}=\text{適合の悪さ}+\text{複雑さへのペナルティ}} $$

と考えればよい。

そして、

$$ \boxed{\text{BICが小さいモデルほどよい}} $$

とする。


22. なぜクラスを増やすとパラメータが増えるのか

例えば症状が15個あり、全部二値だったとする。

1クラスごとに、

$$ 15 $$

個の症状出現確率が必要になる。

4クラスなら、

$$ 15\times4=60 $$

個である。

さらにクラス割合、

$$ \pi_1,\pi_2,\pi_3,\pi_4 $$

も必要になる。

クラス割合の合計が1なのでクラス割合のパラメータ4つのうち独立なパラメータは3個。

したがってざっくり、

$$ 60+3=63 $$

個のパラメータが必要になる。

5クラスなら、

$$ 15\times5+4=79 $$

となる。

当然、5クラスモデルの方がデータには合わせやすい。

だから単純に尤度だけ比較すると、クラスを増やす方が有利になりやすい。

BICはそこにペナルティを入れている。


23. この論文では何をしたのか

論文の流れをLCAだけ抜き出すと、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sleep Heart Health Study
        ↓
AHI ≥ 15/h のOSA患者
n = 1,207
        ↓
14症状質問 + ESS
        ↓
LCA
        ↓
クラス数を変えたモデルを比較
        ↓
BICを比較
        ↓
BICが最小になる解を選択
        ↓
4クラス
        ↓
各クラスの症状プロファイルを見る
        ↓
Disturbed sleep
Minimally symptomatic
Excessively sleepy
Moderately sleepy
        ↓
各患者を症状サブタイプに分類
        ↓
そのサブタイプと
心血管疾患との関連を解析
        ↓
ロジスティック回帰
Kaplan-Meier
Cox比例ハザードモデル

という構造である。(PubMed Central (PMC))

したがって、

$$ \boxed{ \text{LCA} \rightarrow \text{患者phenotyping} } $$

を最初に行い、

そのあと、

$$ \boxed{ \text{phenotype} \rightarrow \text{心血管予後} } $$

をCoxモデルなどで調べた研究である。


24. つまりLCAとCoxは全く別の役割を担当している

今回の論文を読むとここは分けた方がよい。

Cox比例ハザードモデルそのものの考え方は、【統計解説】Cox比例ハザードモデルについて もあわせて参照するとわかりやすい。

解析この論文での役割
LCA症状パターンからOSA患者をサブタイプ化
ロジスティック回帰サブタイプと既存CVDとの関連
Kaplan-Meierサブタイプごとのイベント発生までの経過を可視化
Cox回帰サブタイプと将来のCVD発症ハザードとの関連

つまりLCAでは、

$$ \text{CVD} $$

を一切使わずに患者を分類している。

まず症状だけから、

$$ C_i $$

を推定する。

その後に、

LCAで得られた $C_i$ がCVDを予測するのか?

を検証している。

これはかなり重要である。

もしCVD情報まで入れてクラスを作ったあと「このクラスはCVDが多かった」と言えば循環論法になりかねない。

この研究では、

1
2
3
4
5
6
7
症状
 ↓
LCA
 ↓
サブタイプ
 ↓
心血管イベント

と分かれている。


25. k-meansとの違いを数式レベルで見る

k-meansでは、各患者をクラス $k$ に割り当てて、

$$ \sum_i\lVert X_i-\mu_{C_i}\rVert^2 $$

をできるだけ小さくする。

つまり、

各患者からクラス中心までの距離

を最小化している。

一方LCAでは、

$$ L=\prod_i\left[\sum_k\pi_k\prod_jP(X_{ij}\mid C_i=k)\right] $$

を最大化する。

つまり、

実際に観測された症状パターンが、この潜在クラス構造から生成されるもっともらしさ

を最大化している。

したがって、

$$ \boxed{ \text{k-means}=\text{距離ベース} } $$

に対して、

$$ \boxed{ \text{LCA}=\text{確率モデルベース} } $$

である。


26. Gaussian mixture modelとの方がむしろ近い

機械学習でたとえるなら、k-meansよりGaussian Mixture Model(GMM)の方がLCAに近い。

GMMでは、

集団には複数の潜在クラスがあり、それぞれ異なる正規分布からデータが生成される

と考える。

例えば、

$$ X\mid C=k\sim N(\mu_k,\Sigma_k) $$

である。

LCAではそのカテゴリ変数版として、

$$ X_j\mid C=k\sim Bernoulli(\theta_{jk}) $$

などを考える。

だからイメージとしては、

$$ \boxed{ \text{LCA} \approx \text{categorical data版 mixture model} } $$

がかなり正確である。

連続変数を中心に同じような潜在クラスモデルを作るものは、一般にlatent profile analysis(LPA)と呼ばれる。


27. この論文でLCAが適している理由

今回扱いたいのは、

1
2
3
4
5
6
眠いか
疲れているか
眠れないか
途中で覚醒するか
いびきがあるか
……

という症状パターンである。

この種のデータでは、

「患者Aと患者BのEuclidean distanceが2.73」

と言われても医学的にはあまり自然ではない。

一方、

「眠気型では日中眠気を訴える確率が高く、不眠症状の確率は低い」

というモデルは非常に自然である。

この研究グループの関連研究では、症状をカテゴリ化し、ESSも $0$–$5$、$6$–$10$、$11$–$15$、$>15$ のカテゴリとしてLCAに入れる方法が用いられている。(PubMed Central (PMC))

したがって、

カテゴリ的な症状の組み合わせから患者phenotypeを抽出したい

という目的とLCAはかなり相性がよい。


28. ただし「4種類のOSAが本当に存在する」と証明したわけではない

ここも重要である。

LCAで4クラスが最適だったという結果は、

今回の変数・今回の患者集団・今回のモデル仮定のもとでは、4個の潜在クラスを置くモデルがデータをよく説明した

という意味である。

したがって、

$$ \boxed{ \text{LCAで4クラス} \neq \text{自然界に本当に4種類のOSAが存在すると証明} } $$

である。

実際には患者の症状が連続的なスペクトラムなのに、LCAが便宜上いくつかのカテゴリに切っている可能性もある。

例えば、

1
2
眠気
弱い ───────────────── 強い

という1本の連続軸しか本当は存在しないのに、

1
2
3
低い
中くらい
高い

という3クラスモデルがうまくフィットすることもあり得る。

だから「latent class」という名前から、

隠れていた真の疾患分類を発見した

とまで言うのは強すぎる。


29. local independenceもかなり強い仮定である

例えば、

1
2
3
4
日中眠気
身体的疲労
居眠り
ESS

は、同じ「excessively sleepy」クラスの中であっても相互に関連している可能性がある。

ところが通常のLCAは、

$$ X_j\perp X_l\mid C $$

を仮定する。

もしこの仮定が大きく破れていると、

本当は症状同士に残った相関があるだけなのに、モデルがそれを説明するため余分なクラスを作る

ということも起こり得る。

したがって潜在クラス数は、

データそのものだけではなく、モデル仮定にも依存する

という点には注意が必要である。


30. BIC最小だから機械的に正解、というわけでもない

この論文でも、単に数値だけではなく、BICで選ばれた解についてclinical interpretationを確認したうえで後続解析に使用している。(PubMed Central (PMC))

これは重要である。

例えばBICでは5クラスがわずかに有利でも、

1
2
3
4
5
Class 1
Class 2
Class 3
Class 4
Class 5

のうちClass 4と5がほとんど同じだったり、Class 5が患者数1%しかなく医学的解釈が困難だったりする可能性がある。

したがって実際のLCAでは、

$$ \text{model fit} + \text{parsimony} + \text{clinical interpretability} $$

を合わせて判断することが多い。


31. 今回の4クラスは何を意味しているのか

つまりこの研究のLCA結果を厳密に読み替えると、

OSA患者1,207人の14症状+ESSの同時分布は、4種類の異なる症状出現確率を持つ潜在集団の混合モデルとして説明するのが適切だった

ということである。

そしてそれぞれの、

$$ P(X_j\mid C=k) $$

を並べてみたところ、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Class 1
不眠・睡眠維持困難が目立つ
→ Disturbed sleep
Class 2
症状全般が少ない
→ Minimally symptomatic
Class 3
眠気・疲労・ESSが特に高い
→ Excessively sleepy
Class 4
ある程度眠気がある
→ Moderately sleepy

という医学的に理解可能なプロファイルになった。(pmc.ncbi.nlm.nih.gov)

そして興味深いことに、AHIなどの重症度が似ていても症状プロファイルが異なり、特にexcessively sleepy群では将来のCVDリスクが他の3群より高かった。(pmc.ncbi.nlm.nih.gov)


32. 全体を一気につなげると

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
① 患者には複数の症状が観測される
X1, X2, X3, ..., XJ
        ↓
② しかし症状の背後に
   観測できない患者タイプ C があると仮定する
        ↓
③ CにはK個のカテゴリがある
C = 1, 2, ..., K
        ↓
④ 各クラスには
   固有の症状出現確率がある
P(Xj | C=k)
        ↓
⑤ クラスが分かれば
   症状同士は独立と仮定する
P(X1,...,XJ | C=k)
=
∏ P(Xj | C=k)
        ↓
⑥ ただし実際にはCは観測されないので
   全クラスの可能性を足し合わせる
P(Xi)
=
Σ πk P(Xi | C=k)
        ↓
⑦ 全患者について掛け合わせ
   likelihoodを作る
L
=
∏ P(Xi)
        ↓
⑧ likelihoodが最大になる
   πk と症状確率を推定する
典型的にはEM algorithm
        ↓
⑨ 各患者について
P(C=k | Xi)
を計算
        ↓
⑩ 最も確率の高いクラスなどに分類
        ↓
⑪ K=2,3,4,5,...を比較
        ↓
⑫ likelihoodだけだと
   複雑なモデルが有利になるので
   BICで複雑さを罰する
BIC = -2logL + p log n
        ↓
⑬ この論文では4クラスが選ばれた
        ↓
⑭ 症状プロファイルを見て
Disturbed sleep
Minimally symptomatic
Excessively sleepy
Moderately sleepy
と命名
        ↓
⑮ そのクラス分類を説明変数として
   logistic regression / Cox regression
        ↓
⑯ Excessively sleepy subtypeで
   心血管リスクが高いことを発見

33. 一番重要な理解

最初の質問の、

「潜在クラス分析ってクラスタリングのこと?」

に、今ならかなり正確に答えられる。

$$ \boxed{ \text{広い意味ではYes} } $$

ただし、

似ている患者を距離で集めるクラスタリングではない。

LCAは、

$$ \boxed{ \text{観測された症状は、複数の見えない患者集団から確率的に生成されている} } $$

という生成モデルを置き、

$$ \pi_k $$

と、

$$ P(X_j\mid C=k) $$

を最尤推定する。

そこからBayesの定理によって、

$$ P(C=k\mid X_i) $$

を求め、

この症状パターンの患者は、どの潜在集団から生成されたと考えるのが最ももっともらしいか

を推定する手法である。

なので一言で位置づけるなら、

潜在クラス分析は、カテゴリデータに対する確率モデルベースのクラスタリングであり、各クラスを「症状出現確率の異なる潜在集団」として表現する方法

となる。

このレベルまで理解すると、今回の論文のMethodsにある「latent class analysis → BIC → 4 symptom subtypes」という3行が、実際には尤度を持つかなりちゃんとした統計モデルを一つ推定していることが見えるはずだ。(PubMed Central (PMC))

Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。