🦉

HCI研究者の心理統計ノート:フリードマン検定 / Friedman test

2023/01/09に公開

HCI研究者の心理統計ノート

https://zenn.dev/tmizuho/articles/e8890371f683bd

Introduction

フリードマン検定 (Friedman test) は、3群以上の対応のあるデータに差があるかどうかを検定する方法です。類似の手法であるクラスカル・ウォリス検定は対応のないデータに対して用いられるのに対して、フリードマン検定は対応のあるデータに対して用います。

HCI研究では、1要因参加者内計画 (within-subject design) の実験において、条件1,2,...,kで評価指標に統計的に有意な差があるかどうかを調べる際に使用します (e.g., 既存手法1 vs 既存手法2 vs 提案手法)。特に、質問紙の評定(リッカート尺度)を比較する場面などでよく使います。

分散分析とは違い、正規性の仮定は必要ありません。正規性が仮定できるデータ、できないデータともに適用することができます

フリードマン検定でデータ間に有意差が認められた場合、どの条件間に差があるのかを調べるために、下位検定として多重比較を行います。多重比較の方法は様々にありますが、わかりやすく適用範囲の広い Bonferroniの方法とその改良版、特に Shaffer の方法を使って p 値を調整しながらウィルコクソンの符号順位検定を繰り返すのがよいと思います。

[2023/02/21 追記]
フリードマン検定を実施し、有意であれば多重比較を実施するという流れはメジャーだと思っていたのですが、始めから多重比較のみをすればよいという考えもあるようです。たしかに、一要因の場合には、多重比較でわかること ⊇ フリードマン検定でわかること、が多くの場合に成り立つような気がします。どちらがより適切かは、水準の数など実験デザインにも依存するように思うので、ケースバイケースで検討するしかないかなと考えています。

R Sample Code

# ライブラリのインポート
library(tidyverse)

# csvファイルの読み込み
# 整然データを想定: 一行が一観測。 "参加者ID, 独立変数, 従属変数" の形。
data <- read_csv("csvファイルのパス", show_col_types=F) %>%
    # コードの再利用可能性を高めるために列名を変更
    mutate(s=factor("参加者IDの列名"), A=factor("独立変数の列名"), y="従属変数の列名") %>%
    # 必要な列だけ抽出
    select(s, A, y) %>%
    # ソート
    arrange(A, s)

# 欠損値や外れ値など、解析から除外するべきデータがあれば削除
# 割愛

# 記述統計量の確認
data %>%
    group_by(A) %>%
    summarize(N=n(), Mean=mean(y), SD=sd(y), SE=sd(y)/sqrt(n()), Min=min(y), Median=median(y), Max=max(y))

# 簡単なグラフを描画して確認
data %>%
    # ggplot で作図開始。x軸は実験条件、y軸は評価指標(平均値)。
    ggplot(aes(x=A, y=y, fill=A)) +
    # 箱ひげ図
    geom_boxplot() +
    # 平均値
    stat_summary(fun=mean, geom="point", color="black", shape=4, size=2) +
    # 軸ラベルの設定
    labs(x="Condition", y="Measurement") +
    # カラーパレット
    scale_fill_brewer(palette="Blues") +
    # テーマの調整
    theme_light() +
    theme(legend.position="none") +
    theme(panel.grid.major.x=element_blank(), panel.grid.minor.y=element_blank())

# フリードマン検定の実行
mat <- c()
for (ai in levels(data$A)){
    mat <- cbind(mat, data %>% filter(A==ai) %>% pull(y))
}
(table <- friedman.test(mat))

# 効果量の計算
# 提示の意味はあまりなく、下位検定の効果量を提示すべきという説あり
# 案1 Morse(2009) η2=χ2/{サンプルサイズ*(繰り返しの数 - 1)}
eta_squared <- table$statistic/((length(mat[,1])*(length(mat[1,])-1)))
names(eta_squared) <- NULL
cat(paste("eta squared = ", eta_squared, "\n", sep=""))
# 案2 r=z/sqrt(N)
p <- table$p.value 
z <- qnorm(1 - p/2)#両側検定の場合
r <- z / sqrt(length(data$y))
cat(paste("r = ", r, "\n", sep=""))

# 下位検定:主効果が有意であった場合に実行
# Shaffer の方法で p 値を調整しながら、3回ウィルコクソンの符号順位検定を行う例
library(exactRankTests)
a1 <- data %>% filter(A==levels(A)[1]) %>% pull(y)
a2 <- data %>% filter(A==levels(A)[2]) %>% pull(y)
a3 <- data %>% filter(A==levels(A)[3]) %>% pull(y)
t12 <- wilcox.exact(a1, a2, paired=T)
t13 <- wilcox.exact(a1, a3, paired=T)
t23 <- wilcox.exact(a2, a3, paired=T)
cohen.r <- function(x,y){
    t <- wilcox.exact(x,y,paired=T)
    p <- t$p.value
    z <- qnorm(1 - p/2)
    return (z / sqrt(length(c(x,y))))
    }
data.frame(term=c("a1.a2", "a1.a3", "a2.a3")) %>%
    mutate(v=c(t12$statistic, t13$statistic, t23$statistic)) %>%
    mutate(p=c(t12$p.value, t13$p.value, t23$p.value)) %>%
    mutate(r=c(cohen.r(a1,a2), cohen.r(a1,a3), cohen.r(a2,a3))) %>%
    # p 値の小さい順に並べる
    arrange(p) %>%
    # 各ステップで正味の仮説数はいくつか書きだす
    # ここでは主効果が有意という結果を使って、1ステップ目の正味の仮説数を減らしています
    mutate(k=c(1, 1, 1)) %>%
    # 各ステップの正味の仮説数を使って調整した p 値を判定に用いる(有意水準alphaの方を調整するという考え方もある)
    mutate(p.adj=p*k) %>%
    # p.adj < alpha ならば有意
    mutate(sig.=symnum(p.adj, corr=FALSE, na=FALSE, cutpoints=c(0,0.001,0.01,0.05,0.1,1), symbols=c("***","**","*","."," ")))

How to Report : LaTeX Sample

Japanese

フリードマン検定を実施した結果,yに対する要因Aの主効果は有意であった ($\chi^2$ (X) = X.XX, \textit{p} = .XX).
主効果が有意であったため、下位検定として Shaffer の方法のもとでウィルコクソンの符号順位検定を繰り返し行った結果、yは条件A1が条件A2よりも有意に高かったが (\textit{p} = .XX, Cohen's \textit{r} = X.XX)、条件A1とA3間 (\textit{p} = .XX, Cohen's \textit{r} = X.XX) および条件A2とA3間 (\textit{p} = .XX, Cohen's \textit{r} = X.XX) には有意差は認められなかった。

English

A Friedman test showed a significant main effect of A. Then, we conducted three Wilcoxon signed-rank tests (Shaffer-corrected), which showed that Y was significantly higher in the A1 condition than in the A2 condition (\textit{p} = .XX, Cohen's \textit{r} = X.XX), whereas there were no significant differences between the A1 and A3 conditions (\textit{p} = .XX, Cohen's \textit{r} = X.XX) and between the A2 and A3 conditions (\textit{p} = .XX, Cohen's \textit{r} = X.XX).

For Your Information

効果量について

フリードマン検定の効果量については、定まっていないようです。いくつかの提案を見つけたので、サンプルコードに載せておきました。一方で、結局は主効果が有意であれば下位検定をすることになりますし、知ってうれしいのは下位検定で比較する条件間の差の大きさなので、下位検定の効果量を報告しておけばよいという考えもあるようです。

Discussion