研究論文や統計解析の結果を目にしたとき、「有意差があった」という報告に接する機会は多い。しかし、P値が示す統計的有意性は、あくまで偶然によるものか否かという確率的な指標に過ぎない。では、その研究によって「どれくらいの効果があったのか」「その効果はどの程度大きいのか」を知るにはどうすれば良いのだろうか?そこで重要になるのが「効果量(Effect Size)」という概念である。本稿では、統計的有意性の先にある「効果の大きさ」を定量的に評価するための効果量の計算方法について、その種類、具体的な算出例、そしてRを用いた実践的なスクリプトを交えながら詳しく解説する。
効果量の概要
効果量とは、2つ以上の群間の差や変数間の関係性の強さを標準化された指標で示したものである。P値が標本データから母集団における差の有無を推測するのに対し、効果量はその差や関係性が「どれくらい大きいか」を直接的に示している。これにより、異なる研究間での結果の比較や、臨床的・実践的な重要性の評価が可能になる。
効果量には様々な種類があるが、大きく分けて以下の2つのタイプに分類できる。
- 差の指標(Difference Measures): 2つの群間の平均値の差を標準偏差で割ることで標準化するもの。代表的なものにCohen’s d やHedges’ g がある。
- 関係性の指標(Association Measures): 変数間の関連性の強さを示すもの。代表的なものに相関係数 r や決定係数 $ R^2 $、オッズ比(Odds Ratio)、リスク比(Relative Risk) などがある。
これらの効果量は、一般的に以下のいずれかの場面で活用される。
- 研究デザインとサンプルサイズ算出: 必要な効果量を事前に設定することで、適切なサンプルサイズを計画できる。
- 結果の解釈と報告: 統計的有意性だけでなく、効果の大きさを併記することで、より包括的で意味がある知見を提供する。
- メタ分析: 複数の研究結果を統合し、より信頼性の高い全体的な効果を推定するために不可欠である。
具体例と計算方法
以下に、主要な効果量の計算方法と解釈の目安を具体的に見ていこう。
連続変数における2群間の差:Cohen’s d
Cohen’s d は、2つの独立した群の平均値の差を統合標準偏差で割ることで標準化する効果量である。最も広く用いられる効果量の一つであり、心理学、教育学、医学など様々な分野で活用されている。
計算式:
$$ d = \frac{M_1 – M_2}{S_{pooled}} $$
ここで、
- M1: 第1群の平均値
- M2: 第2群の平均値
- $ S_{pooled} $: 統合標準偏差(pooled standard deviation)
である
統合標準偏差 $ S_{pooled} $ は、各群の標本サイズと標準偏差から以下の式で計算される。
$$ S_{pooled} = \sqrt{\frac{(n_1-1)s_1^2 + (n_2-1)s_2^2}{n_1 + n_2 – 2}}$$
ここで、
- n1: 第1群の標本サイズ
- n2: 第2群の標本サイズ
- s1: 第1群の標準偏差
- s2: 第2群の標準偏差
解釈の目安(Cohenの基準):
- d=0.2 程度:小さい効果
- d=0.5 程度:中程度の効果
- d=0.8 程度:大きい効果
例:
ある新しい治療法(実験群)と従来の治療法(対照群)が症状改善スコア(状態がよい場合にスコアが高い)に与える影響を比較する研究を考える。
- 実験群:n1=50, M1=75, s1=10
- 対照群:n2=50, M2=70, s2=9
まず、統合標準偏差を計算する。
$$ S_{pooled} = \sqrt{\frac{(50-1)10^2 + (50-1)9^2}{50+50-2}} \approx 9.51 $$
約 9.51 と計算される。
次に、Cohen’s d を計算する。
$$ d = \frac{75-71}{9.51} \approx 0.53 $$
この結果、d=0.53 となり、中程度の効果が認められたと言える。これは、新しい治療法が症状スコアに中程度のプラスの影響を与えたことを示唆している。
対応のある2群間の差:Cohen’s dz
対応のあるデータ(例:前後比較、同一被験者内の比較)の場合、通常のCohen’s d ではなく、差の平均値と差の標準偏差を用いるCohen’s dz を用いるのが適切。
計算式:
$$ d_z = \frac{M_D}{S_D} $$
ここで、
- MD: 各ペアの差の平均値
- SD: 各ペアの差の標準偏差
臨床研究の例:
ある治療法が患者の疼痛スコアに与える影響を評価するため、治療前と治療後の疼痛スコアを比較する研究を考える。患者1人あたりの治療前後の疼痛スコアの差を計算し、その差の平均値と標準偏差を用いる。
- 治療前後の疼痛スコアの差の平均値 MD=−5.3 点(治療後に平均 5.3 点改善)
- 治療前後の疼痛スコアの差の標準偏差 SD=10 点
$$ d_z = \frac{-5.3}{10} = -0.53 $$
解釈の目安:
対応のあるデザインでは分散が小さくなるため、独立2群の場合のCohenの基準よりも小さい値でも「大きい」と解釈される。dz を $ \sqrt{2} $ 倍して、d と同じ解釈をすれば良い(例:dz = 0.53 のとき、$ d = 0.53 \sqrt{2} \approx 0.75$)この場合、dz = -0.53 つまり d = -0.75 相当 となり、治療が疼痛スコアに大きな効果をもたらしたことを示唆している。
3群以上の平均値の差:η2 (イータ二乗)
複数の治療法や介入群の効果を比較するANOVA(分散分析)の結果を効果量として示す場合、$ \eta^2 $ (イータ二乗、以下η2) がよく用いられる。これは、従属変数の全変動のうち、独立変数(治療法など)によって説明される変動の割合を示している。
計算式:
$$ \eta^2 = \frac{SS_{between}}{SS_{total}} $$
ここで、
- $SS_{between}$: 群間平方和(治療法間の差による変動)
- $SS_{total}$: 全平方和(全変動)
解釈の目安(Cohenの基準):
- η2=0.01 程度:小さい効果
- η2=0.06 程度:中程度の効果
- η2=0.14 程度:大きい効果
臨床研究の例:
3種類の抗うつ薬(薬A, 薬B, 薬C)が患者のうつ病評価尺度スコアに与える効果を比較する研究で、ANOVAを実行したとする。
- $SS_{between}$ = 4848
- $SS_{total}$ = 12371
- k=3
η2 を計算する。
$$ \eta^2 = \frac{4848}{12371} \approx 0.39 $$
この結果は、抗うつ薬の種類がうつ病評価尺度スコアの変動の 約 39 %を説明していることを示し、大きい効果と解釈できる。
カテゴリ変数間の関連性:phi (ϕ) 係数、Cramer’s V
薬剤の使用有無と副作用の発生有無など、2つのカテゴリ変数間の関連性を示す場合、カイ二乗検定の結果から効果量を算出できる。
2×2分割表の場合:phi (ϕ) 係数
$$ \phi = \sqrt{\frac{\chi^2}{N}} $$
ここで、
- χ2: カイ二乗値
- N: 総サンプルサイズ
解釈の目安(Cohenの基準):
- ϕ=0.1 程度:小さい効果
- ϕ=0.3 程度:中程度の効果
- ϕ=0.5 程度:大きい効果
一般的なIxJ分割表の場合:Cramer’s V
Cramer’s V は、2×2以上の任意のサイズの分割表に適用できる効果量。
計算式:
$$ V = \sqrt{\frac{\chi^2}{N \times \text{min}(I – 1, J – 1)}} $$
ここで、
- I: 行の数
- J: 列の数
- min(I−1, J−1): 行数と列数のうち小さい方の数から1を引いた値
解釈の目安(Cohenの基準):
- V=0.1 程度:小さい効果
- V=0.3 程度:中程度の効果
- V=0.5 程度:大きい効果
臨床研究の例:
ある新薬の投与の有無と、特定の副作用(例:肝機能障害)の発生有無を比較する研究で、以下の2×2分割表が得られたとする。
副作用あり | 副作用なし | 合計 | |
新薬投与 | 20 | 80 | 100 |
プラセボ | 5 | 95 | 100 |
合計 | 25 | 175 | 200 |
このデータからは、カイ二乗値 χ2=9.87 が得られる。総標本サイズ N=200である。Φを計算すると 0.23 となる。
$$ \phi = \sqrt{\frac{10.286}{200}} = \sqrt{0.05143} \approx 0.23 $$
この結果、ϕ≈0.23 となり、新薬投与と副作用の発生の関連性は小さいことが示された。
連続変数間の関連性:相関係数 r と決定係数 R2
相関係数 r
ピアソンの積率相関係数 r は、2つの連続変数間の線形な関係の強さと方向を示す指標であり、それ自体が効果量である。
解釈の目安(Cohenの基準):
- r=0.1 程度:小さい効果(例:ほとんど関連がない)
- r=0.3 程度:中程度の効果(例:ある程度の関連がある)
- r=0.5 程度:大きい効果(例:強い関連がある)
臨床研究の例:
患者の喫煙量(1日あたりの喫煙本数)と肺機能検査値(FEV1、1秒量)の関連性を評価する研究を考える。喫煙量が増えるほどFEV1が低下するという仮説に基づいて相関係数を計算する。例えば、r=−0.65 が得られた場合、喫煙量とFEV1の間には強い負の相関(喫煙量が増えるほどFEV1が低下する)があることを示している。
決定係数 R2
重回帰分析において、モデルが従属変数の分散をどれだけ説明しているかを示すのが決定係数 $ R^2 $(以下、R2) である。これは、予測変数によって説明される従属変数の分散の割合を表している。
計算式:
$$ R^2 = \frac{SS_{regression}}{SS_{total}} $$
ここで、
- $ SS_{regression} $: 回帰平方和(モデルによって説明される変動)
- $ SS_{total} $: 全平方和(全変動)
解釈の目安(Cohenの基準):
- R2=0.02 程度:小さい効果
- R2=0.13 程度:中程度の効果
- R2=0.26 程度:大きい効果
臨床研究の例:
患者の血圧(従属変数)を、年齢、BMI、塩分摂取量といった複数の要因(予測変数)で予測する重回帰分析を行ったとする。この分析でR2=0.49 が得られた場合、これらの予測変数によって患者の血圧の変動の49%が説明されることを示し、大きい効果(高い説明力)を持つモデルであると解釈できる。
イベント発生率の比較:オッズ比(Odds Ratio)とリスク比(Relative Risk)
主に疫学研究や臨床試験で、疾患の発生や治療効果の有無といったイベント発生率を比較する際に用いられる。
オッズ比(Odds Ratio, OR)
ある曝露群と非曝露群における、特定のアウトカム(疾患の発生など)のオッズ(発生する確率と発生しない確率の比)の比。
$$ OR = \frac{\text{曝露群におけるオッズ}}{\text{非曝露群におけるオッズ}} = \frac{a/b}{c/d} = \frac{ad}{bc} $$
ここで、
- a: 曝露あり・アウトカムあり
- b: 曝露あり・アウトカムなし
- c: 曝露なし・アウトカムあり
- d: 曝露なし・アウトカムなし
解釈:
- OR=1: 曝露とアウトカムに関連なし
- OR>1: 曝露によりアウトカム発生に関連あり
- OR<1: 曝露によりアウトカム予防に関連あり
リスク比(Relative Risk, RR)
曝露群と非曝露群における、特定のアウトカムの発生率(リスク)の比。
$$ RR = \frac{曝露群におけるアウトカムの発生率}{非曝露群におけるアウトカムの発生率} = \frac{a/(a+b)}{c/(c+d)} $$
解釈:
- RR=1: 曝露とアウトカムに関連なし
- RR>1: 曝露によりアウトカムのリスクが増加
- RR<1: 曝露によりアウトカムのリスクが減少
臨床研究の例:
ある遺伝子変異(曝露)が大腸がん(アウトカム)の発生リスクに与える影響を調査するコホート研究を考える。
大腸がんあり | 大腸がんなし | 合計 | |
遺伝子変異あり | 30 | 970 | 1000 |
遺伝子変異なし | 10 | 990 | 1000 |
リスク比を計算する。
- 遺伝子変異あり群の発生率 = 30/1000=0.03
- 遺伝子変異なし群の発生率 = 10/1000=0.01
$$ RR = \frac{0.03}{0.01} = 3 $$
この結果、RR=3 となり、この遺伝子変異を持つ人は持たない人に比べて大腸がんの発生リスクが3倍になることを示している。
Rスクリプト例
Cohen’s d の計算(独立 2 群 t 検定の場合)
pysch パッケージ の m2d 関数を用いると計算できる。
- 実験群:n1=50, M1=75, s1=10
- 対照群:n2=50, M2=70, s2=9
# psych パッケージをインストール(初回のみ)
# install.packages("psych")
library(psych)
m2d(m1=75, m2=70, s1=10, s2=9, n1=50, n2=50)
実行結果:
> m2d(m1=75, m2=70, s1=10, s2=9, n1=50, n2=50)
[1] 0.5255883
0.5255883 (約 0.53)と計算された。
Cohen’s dz の計算(対応のある t 検定の場合)
以下のスクリプトで計算できる。
# 対応のあるt検定の効果量 (Cohen's dz) を計算する関数
calculate_cohens_dz <- function(mean_difference, sd_difference) {
dz <- mean_difference / sd_difference
return(dz)
}
# 例として、臨床研究の例で使った数値を使います
# 治療前後の疼痛スコアの差の平均値 MD = -5.3
# 治療前後の疼痛スコアの差の標準偏差 SD = 10
# (負の値は改善を示すと仮定)
mean_diff <- -5.3
sd_diff <- 10
cohens_dz_value <- calculate_cohens_dz(mean_diff, sd_diff)
print(cohens_dz_value)
実行結果:
> print(cohens_dz_value)
[1] -0.53
計算結果は、-0.53 と計算される。
η2 の計算(一元配置分散分析の場合)
rstatix
パッケージを用いると、ANOVAの結果から簡単に効果量を取得できる。
# rstatixパッケージをインストール(初回のみ)
# install.packages("rstatix")
# パッケージの読み込み
library(rstatix)
library(dplyr) # データ操作のため
# サンプルデータの作成(臨床研究の例:3種類の抗うつ薬の効果比較)
set.seed(456)
data_anova_drugs <- tibble(
drug_type = factor(rep(c("Drug_A", "Drug_B", "Drug_C"), each = 40)), # 各群40人
depression_score = c(rnorm(40, mean = 55, sd = 8), # Drug A: 55点
rnorm(40, mean = 48, sd = 9), # Drug B: 48点
rnorm(40, mean = 40, sd = 7)) # Drug C: 40点 (最も効果的と仮定)
)
head(data_anova_drugs)
summary(data_anova_drugs)
# ANOVAの実行
anova_result_drugs <- aov(depression_score ~ drug_type, data = data_anova_drugs)
# ANOVAのサマリー
summary(anova_result_drugs)
# η2 乗
eta_squared(anova_result_drugs)
実行結果:
> # ANOVAのサマリー
> summary(anova_result_drugs)
Df Sum Sq Mean Sq F value Pr(>F)
drug_type 2 4848 2423.8 37.69 2.32e-13 ***
Residuals 117 7523 64.3
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
eta_squared(anova_result_drugs)
>
> eta_squared(anova_result_drugs)
drug_type
0.3918518
抗うつ病の Sum Sq (SS) は 4848、誤差(Residuals)の SS は 7523と計算されている。η2 乗は、約 0.39 と計算される。
Φの計算(カイ二乗検定の場合)
pwr パッケージの ES.w2 関数を用いる。
# install.packages("pwr") # 初回のみ
library(pwr)
table_data <- matrix(c(20, 5, 80, 95), nrow = 2)
rownames(table_data) <- c("NewDrug", "Placebo")
colnames(table_data) <- c("Side_effect_Yes", "Side_effect_No")
print(table_data)
sum(table_data)
ES.w2(table_data/sum(table_data))
実行結果:
> print(table_data)
Side_effect_Yes Side_effect_No
NewDrug 20 80
Placebo 5 95
> sum(table_data)
[1] 200
> ES.w2(table_data/sum(table_data))
[1] 0.2267787
2×2分割表を行列にして、サンプルサイズで割って、全体に占める割合にしてから、ES.w2 に渡すと、Φが 約 0.23 と計算される。
R 2 乗の計算(重回帰分析の場合)
R のベースパッケージに含まれる、lm 関数で計算する。
変数は以下のとおり:
- 従属変数 (目的変数): 血圧 (収縮期血圧を想定)
- 予測変数 (説明変数):
- 年齢 (age)
- BMI (bmi)
- 塩分摂取量 (salt_intake)
# 必要なパッケージを読み込みます(まだインストールしていない場合は install.packages("tidyverse") などでインストールしてください)
library(tidyverse) # データ操作と可視化に便利
# 再現性のためにシードを設定します
set.seed(123)
# 患者データの生成
n_patients <- 200 # 患者数
# 予測変数を生成
age <- sample(30:70, n_patients, replace = TRUE) # 年齢を30歳から70歳の範囲でランダムに生成
bmi <- round(rnorm(n_patients, mean = 25, sd = 4), 1) # BMIを平均25、標準偏差4で正規分布から生成
salt_intake <- round(rnorm(n_patients, mean = 8, sd = 2), 1) # 塩分摂取量を平均8g、標準偏差2gで正規分布から生成
# 血圧(従属変数)を生成
# ここで血圧と各予測変数に相関を持たせ、R2乗が約0.40になるように係数を調整します
# ランダムノイズを加えることで、完璧な相関にはなりません
blood_pressure <- 90 + (age * 0.5) + (bmi * 1.5) + (salt_intake * 2.0) + rnorm(n_patients, mean = 0, sd = 10)
# データフレームにまとめる
patient_data <- tibble(
age = age,
bmi = bmi,
salt_intake = salt_intake,
blood_pressure = blood_pressure
)
# データの最初の数行を確認
print(head(patient_data))
# 各変数の要約統計量を確認
print(summary(patient_data))
# 重回帰分析モデルの構築
# 従属変数 ~ 予測変数1 + 予測変数2 + ... の形式で指定します
model <- lm(blood_pressure ~ age + bmi + salt_intake, data = patient_data)
# 分散分析表を表示
anova(model)
# モデルの要約を表示
# ここで決定係数 (R-squared) の値を確認できます
print(summary(model))
実行結果:
> # 分散分析表を表示
> anova(model)
Analysis of Variance Table
Response: blood_pressure
Df Sum Sq Mean Sq F value Pr(>F)
age 1 6651.2 6651.2 66.522 4.073e-14 ***
bmi 1 8514.1 8514.1 85.154 < 2.2e-16 ***
salt_intake 1 3348.2 3348.2 33.487 2.805e-08 ***
Residuals 196 19596.9 100.0
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> # モデルの要約を表示
> # ここで決定係数 (R-squared) の値を確認できます
> print(summary(model))
Call:
lm(formula = blood_pressure ~ age + bmi + salt_intake, data = patient_data)
Residuals:
Min 1Q Median 3Q Max
-30.397 -6.789 0.014 6.458 33.281
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 88.41599 5.90761 14.966 < 2e-16 ***
age 0.49679 0.06558 7.575 1.38e-12 ***
bmi 1.55583 0.17196 9.048 < 2e-16 ***
salt_intake 2.06965 0.35765 5.787 2.81e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 9.999 on 196 degrees of freedom
Multiple R-squared: 0.4858, Adjusted R-squared: 0.4779
F-statistic: 61.72 on 3 and 196 DF, p-value: < 2.2e-16
分散分析表から、回帰部分の SS が計算され(回帰部分の合計: 6651.2+8514.1+3348.2 = 18513.5 )、全体の SS = 18513.5 + 19596.9 = 38110.4 との比 18513.5 / 38110.4 = 0.4858 が、下から2行目の Multiple R-squared: 0.4858 に出力されている。
オッズ比(OR)とリスク比(RR)の計算(疫学的な研究の場合)
epitools
パッケージを用いると、疫学的な効果量を計算できる。
# epitoolsパッケージをインストール(初回のみ)
# install.packages("epitools")
# パッケージの読み込み
library(epitools)
# 2x2分割表データ(臨床研究の例:遺伝子変異と大腸がん)
# 行: 遺伝子変異の有無 (あり/なし)
# 列: 大腸がんの有無 (あり/なし)
# データは matrix 形式で作成し、行名と列名を付与
disease_data <- matrix(c(30, 970, 10, 990), nrow = 2, byrow = TRUE)
colnames(disease_data) <- c("Cancer_Yes", "Cancer_No")
rownames(disease_data) <- c("Mutation_Yes", "Mutation_No")
print(disease_data)
# オッズ比とリスク比の計算
oddsratio(disease_data, rev = "both")
riskratio(disease_data, rev = "both")
実行結果:
> # オッズ比とリスク比の計算
> oddsratio(disease_data, rev = "both")
riskratio(disease_data, rev = "both")
$data
Cancer_No Cancer_Yes Total
Mutation_No 990 10 1000
Mutation_Yes 970 30 1000
Total 1960 40 2000
$measure
NA
odds ratio with 95% C.I. estimate lower upper
Mutation_No 1.000000 NA NA
Mutation_Yes 3.027886 1.517734 6.594998
$p.value
NA
two-sided midp.exact fisher.exact chi.square
Mutation_No NA NA NA
Mutation_Yes 0.001305077 0.002008334 0.001401302
$correction
[1] FALSE
attr(,"method")
[1] "median-unbiased estimate & mid-p exact CI"
>
> riskratio(disease_data, rev = "both")
$data
Cancer_No Cancer_Yes Total
Mutation_No 990 10 1000
Mutation_Yes 970 30 1000
Total 1960 40 2000
$measure
NA
risk ratio with 95% C.I. estimate lower upper
Mutation_No 1 NA NA
Mutation_Yes 3 1.474505 6.103742
$p.value
NA
two-sided midp.exact fisher.exact chi.square
Mutation_No NA NA NA
Mutation_Yes 0.001305077 0.002008334 0.001401302
$correction
[1] FALSE
attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"
>
全体のサンプルサイズに比べ、イベントが少ないため、オッズ比 3.02, リスク比 3 とほぼ同様の値と計算された。
まとめ
効果量は、統計的有意性(P値)だけでは見えてこない「効果の大きさ」を定量的に示す強力なツールである。臨床研究においては、新しい治療法が患者にもたらす影響の臨床的意義を評価するために不可欠である。本稿で紹介したCohen’s d、dz、η2、Φ、Cramer’s V、相関係数 r、決定係数R2、オッズ比、リスク比といった効果量を適切に計算し、解釈することで、より質の高い研究報告が可能になる。
参考文献
https://www.utstat.toronto.edu/~brunner/oldclass/378f16/readings/CohenPower.pdf
コメント