「共分散構造分析(SEM)は、なんだか難しそう…」と感じていないだろうか。そして、「どれくらいのデータがあれば、この分析ができるのだろうか?」と悩んだことはないだろうか。論文や研究でSEMを使いたいけれど、統計や数学は苦手だという方、安心してほしい。この記事では、共分散構造分析がどのようなものか、そして分析に必要なサンプル数(データの量)を、なるべく専門用語を使わずに、Rを使った計算例を交えながらわかりやすく解説する。あなたの研究を成功させるための第一歩を、一緒に踏み出そう。
共分散構造分析(構造方程式モデリング SEM)の概略
共分散構造分析(Structural Equation Modeling: SEM)は、たくさんの変数間の関係性を、まるで複雑な道路網のように図で表現し、その関係がどれくらい強いのかを統計的に明らかにする分析手法である。
たとえば、「学習時間」が「理解度」に影響し、「理解度」が「テストの成績」に影響する、さらに「学習意欲」もこれらすべてに影響する…といったように、たくさんの要素が絡み合っている状況を分析したいときに非常に役立つ。
この分析のすごいところは、直接測定できない「潜在変数」(たとえば、「学習意欲」や「顧客満足度」など、アンケートの複数の質問項目から推測するようなもの)を扱える点だ。それぞれの矢印の「強さ」を数値で示すことで、どの関係が重要なのかを一目で理解できるようになる。
共分散構造分析に必要なサンプル数の考え方
どんな統計分析でもそうだが、分析の信頼性を高めるためには、ある程度のデータ(サンプル数)が必要となる。共分散構造分析は特に、扱う変数が多く、複雑な関係性を分析するため、他の統計手法に比べて多めのサンプル数が必要になる傾向がある。
「では、具体的に何人分のデータが必要なのか?」という疑問がわくことだろう。残念ながら、「SEMなら必ずこの人数!」という魔法のような数字はない。必要なサンプル数は、分析モデルの複雑さや、期待する効果の大きさなど、いくつかの要素によって変わってくる。
しかし、いくつかの経験則や、統計的に必要なサンプル数を計算する方法がある。ざっくりとした目安としては、「分析に使う変数の数」の10倍~20倍程度のサンプル数が必要だと言われることが多い。
たとえば、分析に10個の変数を使うなら、100人~200人くらいのデータがあると安心、というイメージだ。ただし、これはあくまで目安であり、モデルが非常に複雑だったり、非常に小さい効果を見つけたい場合には、もっと多くのサンプルが必要になることもある。
具体例とRでの計算例
共分散構造分析におけるサンプル数の計算は、一般的に「検出力分析(Power Analysis)」という手法を用いて行われる。これは、「このくらいの効果があるとして、その効果を統計的に見つけ出すのに必要なサンプル数はいくつなのか?」という問いに答えるためのものだ。
Rには、この検出力分析を行うための便利なパッケージがいくつかある。ここでは、semPower
というパッケージを使った簡単な計算例を見てみよう。
semPower
パッケージは、共分散構造分析の検出力分析に特化しており、比較的直感的にサンプル数を計算できる。
まず、RStudio など R を開いて、まだインストールしていない場合はsemPower
パッケージをインストールする。
# semPowerパッケージのインストール(初回のみ)
install.packages("semPower")
# パッケージの読み込み
library(semPower)
次に、簡単なモデルを想定してサンプル数を計算してみよう。
ここでは、いくつか仮定をおいて計算する。
- 自由度 (df): 分析モデルがどれくらい複雑かを示す指標である。モデルの複雑さに応じて変わるが、手計算は難しいため、ここでは仮の数字を入れる。もし実際に分析するモデルがある場合は、事前に分析ソフトウェアなどで確認できる。ここでは仮にdf = 50とする(一般的な論文でよく見られるモデルの自由度に近い数値だ)。 下記に補足あり。
- 効果量 (effect = .05, effect.measure = “RMSEA”): 見つけたい効果の大きさを示す指標である。共分散構造分析では、モデルの「不適合度(どれくらいデータとモデルがズレているか)」がどの程度あれば「意味のある効果」とみなすか、ということを数値で表す。ここでは、RMSEA(Root Mean Square Error of Approximation)という適合度指標を用いて効果量を指定する。下記にRMSEAについて補足あり。
- 有意水準 (alpha): 統計的な判断の基準となる確率で、通常は
0.05
(5%)が使われる。これは「本当は効果がないのに、あると間違って判断してしまう確率」のことである。 - 検出力 (1 – beta): 本当に効果があるときに、その効果を正しく見つけ出せる確率である。
semPower.aPriori()
関数では、beta
という引数で「タイプIIエラー(検出できなかった間違い)」の確率を指定する。beta
は1 - power
の関係にあるので、通常目標とされる検出力80%(0.80)は、beta = 1 - 0.80 = 0.20
と指定する。power = 0.80
と直接的に指定することもできる。
補足:自由度(df)について 自由度とは、モデルが「どれだけの情報を説明しようとしているか」から「どれだけの未知の値を推定するか」を引いたものだ。ざっくり言えば、「どれだけデータの情報に余裕があるか」を示すようなものと捉えることができる。 共分散構造分析の自由度は、以下の計算式で表される。 $$\text{自由度 (df)} = \frac{n(n + 1)}{2} – \text{(推定するパラメーター数)}$$
ここで、
$n$: 観測変数(データとして実際に手に入る変数、たとえばアンケートの質問項目など)の数
$\frac{n(n+1)}{2}$: 観測変数間の分散(各変数のばらつき)と共分散(変数間の関連性)の合計数。これは、モデルが説明すべき「情報の総数」と考えることができる。
推定するパラメーター数: モデルのパス(矢印)の強さや、潜在変数の誤差の大きさなど、モデルの中の未知の値で、分析によって決定すべきものの総数である。
この式を見ると、観測変数が多いほど、また推定するパラメーター数が少ない(つまり、モデルがシンプルである)ほど、自由度は大きくなることがわかる。自由度が高いモデルほど、データがモデルを「試しにいく」情報が多く、その分、モデルの適合度を厳しく評価できる、と考えられる。後述するが、「ズレの総量」が大きくなり、大きなズレの検出のためには、必要なサンプル数は少なくてすむ。
補足:RMSEA について RMSEAは、モデルの複雑さを考慮した上で、データとモデルのズレを評価する指標で、0に近いほどモデルの適合が良いとされている。effect = .05
をeffect.measure = "RMSEA"
と指定することで、「モデルの不適合度(データとモデルのズレ)がRMSEAで0.05以上ある場合に、それを統計的に検出したい」という意思表示になる。つまり、RMSEAが0.05程度以上ずれていれば、それを検出したい、ということになる。semPower
では、RMSEAの値を用いて、以下のように効果の大きさを判断することが推奨されている。
RMSEA = 0.01:小さい効果。非常にわずかなズレでも見つけたい場合。
RMSEA = 0.05:中程度の効果。一般的な研究でよく使われる目安。
RMSEA = 0.10:大きな効果。かなりはっきりとしたズレが見られる場合に設定。
数値が小さいほど、よりわずかな効果を見つけたいということになり、そのためにはより多くのサンプルが必要になる。
これらの値を設定して、必要なサンプル数を計算してみよう。
# 必要なサンプル数の計算(semPower.aPrioriを使用)
# effect: 検出したい効果の大きさ (RMSEAの値で指定)
# effect.measure: 効果量の尺度(ここではRMSEA)
# alpha: 有意水準
# beta: タイプIIエラーの確率(1 - 検出力)
# df: モデルの自由度
sample_size_result <- semPower.aPriori(
effect = .05, # 検出したいRMSEAの不適合度(中程度の効果)
effect.measure = "RMSEA",
alpha = .05, # 有意水準5%
beta = .20, # 検出力80% (1 - 0.80 = 0.20)
df = 50 # モデルの自由度(仮の値)
)
# 結果の表示
summary(sample_size_result)
このコードを実行すると、Rのコンソールに以下のような結果が表示される。
semPower: A priori power analysis
F0 0.125000
RMSEA 0.050000
Mc 0.939413
df 50
Required Num Observations 243
Critical Chi-Square 67.50480
NCP 30.25000
Alpha 0.050000
Beta 0.199142
Power (1 - Beta) 0.800858
Implied Alpha/Beta Ratio 0.251077
この結果から、「約243人のサンプルが必要」ということがわかる。
もし、モデルの複雑さ(推定するパラメータ数)がもっと高かったり、もっと小さい効果(RMSEAの値を小さくする、たとえば0.01など)を見つけたい場合は、必要なサンプル数が多くなる。逆に、検出力を少し下げてもよい(betaの値を上げる、たとえば0.30など)と考えるなら、必要なサンプル数は少なくなる。
より深く理解する:RMSEAと自由度、そして「ズレの総量」
ここで、少し補足させてほしい。もしかしたら、「自由度が大きくなるほど、必要なサンプル数も増えるんじゃないのか?」と疑問に思った方もいるかもしれない。実際、統計分析では一般的にその傾向がある。しかし、上記の計算結果では、自由度が小さい場合の方が、自由度が大きい場合よりも必要なサンプル数が多くなることがある。なぜだろうか。
この背景には、RMSEAという効果量の特性が深く関わっている。
RMSEAは「自由度あたりの不適合度」を表す指標である。 簡単に言えば、モデルの複雑さを考慮に入れた上で、「1自由度あたり、データとモデルがどれくらいズレているか」を示す。
$$\text{RMSEA} = \sqrt{\frac{\max(0, \chi^2 – \text{df})}{(\text{N}-1) \times \text{df}}}$$
この式の分母に $\text{df}$ が入っていることに注目してほしい。
私たちがeffect = 0.05, effect.measure = "RMSEA"
と指定するとき、それは「RMSEAが0.05となるようなモデルの不適合度を検出したい」という意味になる。このとき同時に、この「RMSEA = 0.05」という同じ基準値が、自由度(df)によって異なる「ズレの総量(F0)」を意味するのだ。
semPower.aPriori
の出力結果には、F0
という値が表示される。これは、推定された非心度(Non-Centrality Parameter, NCP)をサンプルサイズで割った値で、「検出したいモデル全体のズレの総量」だとイメージしてほしい。RMSEAとF0、自由度(df)の関係は、おおよそ以下のようになる。
$$F0 \approx \text{RMSEA}^2 \times \text{df}$$
たとえば、同じRMSEA=0.05でも、
- df = 10 の場合:
- $\text{F0} \approx 0.05^2 \times 10 = 0.0025 \times 10 = 0.025$
- この場合、検出したい「ズレの総量」は非常に小さい0.025である。必要なサンプル数は651人となる(計算結果は未掲載)
- df = 50 の場合(今回の例):
- $\text{F0} = 0.125000$ (出力結果より)
- 計算上も $\text{F0} \approx 0.05^2 \times 50 = 0.0025 \times 50 = 0.125$
- この場合、検出したい「ズレの総量」は先ほどの約5倍の0.125である。必要なサンプル数は243人と計算された。
- df = 200 の場合:
- $\text{F0} \approx 0.05^2 \times 200 = 0.0025 \times 200 = 0.50$
- この場合、検出したい「ズレの総量」はさらに大きい0.50である。必要なサンプル数は112人となる(計算結果未掲載)
このように、同じRMSEA値でも、自由度(df)が大きいモデルの方が、検出したい「ズレの総量(F0)」は大きくなる。
そして、統計的な検出力分析の基本的な考え方として、「より大きな差(効果)(今回の場合『ズレの総量』)を検出したい場合、必要なサンプル数は少なくなる」という原則がある。これは、小さなズレを見つけ出すためには細かな目が必要で多くのデータがいるのに対し、大きなズレは少ないデータでも見つけやすい、というイメージだ。
したがって、自由度が大きいモデルでRMSEA=0.05を検出したい場合(それは大きなF0を検出することになる)、自由度が小さいモデルで同じRMSEA=0.05を検出したい場合(それは小さなF0を検出することになる)よりも、必要なサンプル数が少なくなるという結果が生まれるわけだ。
まとめると:
RMSEAを指定してサンプル数を計算する際は、その値が「自由度あたりのズレ」を示しており、同じRMSEAであっても、モデルの自由度によって検出したい「ズレの総量(F0)」が大きく異なる、という点を理解しておくことが重要である。
必要なサンプル数に満たない少ないサンプル数の場合どうしたらよいか
計算した結果、「あれ、こんなにたくさんのサンプル、集められない!」とがっかりすることもあるかもしれない。しかし、諦めるのはまだ早い。サンプル数が少ない場合にできるいくつかの対処法がある。
- モデルを簡素化する:
- 分析する変数の数を減らす、あるいは複数の変数をまとめて一つの変数にするなど、モデル全体の複雑さを減らすことで、必要なサンプル数を減らせる可能性がある。
- 推定するパラメーターの数を減らす:モデル内のパス(矢印)を減らしたり、特定の値を固定したりすることで、推定すべきパラメーターの総数を減らすことができる。これにより、モデルの自由度が増え、必要なサンプル数が少なくなる場合がある。
- 特に、理論的に重要度の低いパス(関係性)を削除することも検討する。
- 潜在変数の指標を減らす:
- 潜在変数を構成する質問項目が多すぎる場合、理論的に妥当な範囲で項目を減らすことを検討する。ただし、これによってその潜在変数の信頼性が損なわれないように注意が必要だ。
- より「強い」効果に焦点を当てる:
- 検出したい効果量(
effect
のRMSEA値)を少し大きめに設定し直すことで、必要なサンプル数を減らすことができる。これは、「非常に弱い効果は、今のサンプル数では見つけられないかもしれないけれど、ある程度強い効果なら見つけられる」という割り切りである。 - ただし、SEM の場合は、効果量が効果そのものというよりも「ズレ」であるため、データがモデルから大きめにずれることを許容するという想定になる。
- 検出したい効果量(
- 統計的な手法を工夫する:
- 共分散構造分析の中には、小サンプルでも比較的安定して推定できる手法(たとえば、ベイズSEMなど)もある。しかし、これらはより専門的な知識が必要になるため、統計の専門家と相談することをおすすめする。
- サンプル数を増やす努力を継続する:
- もし可能であれば、少しずつでもサンプル数を増やす努力を続けることが、最も確実な解決策である。共同研究者を増やしたり、調査方法を見直したりすることも考えられる。
いずれの方法を選ぶにしても、サンプル数が少ないことによる分析結果への影響を理解し、その限界を論文やレポートで正直に記載することが非常に重要である。
まとめ
共分散構造分析は、複雑な現象のメカニズムを解明する強力なツールであるが、その力を最大限に引き出すためには適切なサンプル数が必要となる。
この記事では、RのsemPower
パッケージを使って必要なサンプル数を計算する方法を学んだ。統計や数学が苦手な方でも、コピペで簡単に試せるように、具体的なコードと解説を心がけた。特に、RMSEAを使った効果量の指定と、自由度によって「検出したいズレの総量」が変わるという点は、サンプル数を考える上で非常に重要である。
もしサンプル数が足りない場合でも、モデルを簡素化する、推定するパラメータの数を減らすなど、いくつかの対処法がある。重要なのは、分析の目的と限界をしっかり理解し、それに見合った適切な準備をすることだ。
今回の内容が、あなたの研究の一助となれば幸いである。共分散構造分析の道のりは、時に険しいかもしれないが、一歩一歩着実に進んでいこう。
コメント