🎂

HCI研究者の心理統計ノート:Two-way ANOVA with ART for within-subject design

2023/05/30に公開
1

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

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

Introduction

参加者内要因 × 参加者内要因の二要因参加者内計画において、データに正規性が仮定出来ない場合には、整列ランク変換 (Aligned rank transform, ART) を施してから二元配置分散分析を実施します。正確にいえば、正規性の仮定が不要なので、この手法は正規性が仮定できるデータ、仮定できないデータともに適用することが出来ます。

データに正規性が仮定出来る場合は、ARTを施さずに通常の二元配置分散分析を実施したほうが検出力が高いと思われるので、参加者内計画における二元配置分散分析 (Two-way ANOVA for within-subject design)を参照してください。

また、参加者間要因 × 参加者内要因の場合は、混合計画における整列ランク変換を施した二元配置分散分析 (Two-way ANOVA with ART for mixed design)、参加者間要因 × 参加者間要因の場合は、参加者間計画における整列ランク変換を施した二元配置分散分析 (Two-way ANOVA with ART for between-subject design) を参照してください。

HCI研究では、参加者内要因A(水準a1, a2, ..., an) × 参加者内要因B(水準b1, b2, ..., bm)の n*m 個の条件を各参加者が全て体験して、従属変数を比較する実験で使用します。特に、質問紙(リッカート尺度)のデータを解析する際に使うことが多いです。例えば、手法(既存 vs 提案) × 計測タイミング(直後 vs 1週間後)の実験計画では、直後には条件間に差がないが1週間後に計測すると提案手法の方が有効である、などといった2つの要因が複合的に評価指標に作用する可能性を検証することができます。

整列ランク変換については、開発者がwebページやgithubなどを用意してくれているので、詳細はそちらを参照してください。
https://depts.washington.edu/acelab/proj/art/

簡単に言えば、ウィルコクソンの順位和検定等のように、元データを順序データに変換しているようです。CHI'11 で発表された手法で、最近は割と見かけるようになりました。しかし、まだ知らない研究者もいることを考慮して、論文で使用する際は以下の論文などを引用して丁寧に説明しましょう。

Wobbrock et al. (2011). The aligned rank transform for nonparametric factorial analyses using only ANOVA procedures. In Proceedings of the ACM Conference on Human Factors in Computing Systems (CHI '11), pp. 143–146, https://doi.org/10.1145/1978942.1978963

ちなみに、日本語でARTを説明した記事も出始めていますが、やや正確性に欠けるような印象です。開発者自身が用意している上記のwebページやgithubがとても丁寧に解説してくれているので、英語ですが、そちらの一次情報を確認することをおすすめします。

解析のフローは、通常の二元配置分散分析と同じです。分散分析後に、交互作用や主効果が有意であれば、下位検定を実施します。研究が進み、ARTデータについても下位検定が実施できるようになりました (ART-C)。他方、下位検定は一要因なので フリードマン検定 (Friedman test)ウィルコクソンの符号順位検定 (Wilcoxon signed rank test) などのノンパラメトリック手法を適用することもできます。どちらが適切なのかは、まだよくわかっていません。以下のサンプルコードでは、ひとまず ART-C を実行しています。ART-C についても、UIST'21で発表されたばかりで、まだ一般的ではないので、論文では下記の論文を引用して使いましょう。

Elkin et al. (2021). An aligned rank transform procedure for multifactor contrast tests. In Proceedings of the ACM Symposium on User Interface Software and Technology (UIST '21), pp. 754–768, https://doi.org/10.1145/3472749.3474784

RではARTを実施するための ARTool というパッケージが提供されています。CRAN に登録されているので、他のパッケージと同様に install.packages("ARTool") コマンドでインストールできます。

R Sample Code

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

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

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

# 記述統計量の確認
data %>%
    group_by(A, B) %>%
    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軸は要因A、y軸は評価指標、凡例は要因B
    ggplot(aes(x=A, y=y, fill=B)) +
    # 箱ひげ図
    geom_boxplot(width=0.6, position=position_dodge(0.6)) +
    # 平均値をプロット
    stat_summary(fun=mean, geom="point", color="black", shape=4, size=2, position=position_dodge(0.6)) +
    # ラベルの設定
    labs(x="Factor A", y="Measurement", fill="Factor B") +
    # カラーパレット
    scale_fill_brewer(palette="Blues") +
    # テーマの調整
    theme_light() +
    theme(legend.position="top") +
    theme(panel.grid.major.x=element_blank(), panel.grid.minor.y=element_blank())

# ART
library(ARTool)
m <- art(y ~ A*B + Error(s+s:A+s:B+s:A:B), data=data)
summary(m)#全部0であることを確認する

# ANOVA + 効果量 partial eta squared
table <- anova(m)
table$peta <- with(table, `Sum Sq`/(`Sum Sq` + `Sum Sq.res`))
table

# 交互作用が有意であれば、単純主効果の検定 -> 多重比較を行う
# 交互作用が有意でなく、主効果が有意であれば、各要因について多重比較を行う
# Bonferroni 系の方法で p 値を調整しながら、Wilxcoxon signed rank test を繰り返し行うなど
# ここでは割愛

# ART-C による多重比較もある
# 交互作用が有意であった場合
art.con(m, "A:B", adjust="holm") %>%
	summary() %>%
	mutate(sig. = symnum(p.value, corr=FALSE, na=FALSE, cutpoints=c(0,0.001,0.01,0.05,0.1,1), symbols=c("***","**","*","."," ")))

# 交互作用が有意でなく、主効果が有意であった場合
art.con(m, "A", adjust="holm") %>%
	summary() %>%
	mutate(sig. = symnum(p.value, corr=FALSE, na=FALSE, cutpoints=c(0,0.001,0.01,0.05,0.1,1), symbols=c("***","**","*","."," ")))

How to Report : LaTeX Sample

Japanese

ノンパラメトリックデータに対して分散分析を可能にする方法として整列ランク変換 (ART) が知られる [Wobbrock et al, 2011]. ARTを施したデータに対して二元配置分散分析を実施した結果,〇〇の主効果 (\textit{F} (X, XX) = X.XX, \textit{p} = .XX, ${\eta_p}^2$ = 0.XX), 〇〇の主効果 (\textit{F} (X, XX) = X.XX, \textit{p} = .XX, ${\eta_p}^2$ = 0.XX), および交互作用 (\textit{F} (X, XX) = X.XX, \textit{p} = .XX, ${\eta_p}^2$ = 0.XX) が有意であった.交互作用が有意であったため,下位検定として ART-C [Elkin et al., 2021] による多重比較を実施した結果,〇〇〇〇.

English

We first performed aligned rank transform (ART) [Wobbrock et al., 2011], which enabled us to conduct an ANOVA for non-parametric data, and conducted a two-way ANOVA. The result showed a significant main effect of 〇〇 (\textit{F} (X, XX) = X.XX, \textit{p} = .XX, ${\eta_p}^2$ = 0.XX). The main effect of 〇〇 was also significant (\textit{F} (X, XX) = X.XX, \textit{p} = .XX, ${\eta_p}^2$ = 0.XX). Furthermore, the interaction effect of A and B was significant (\textit{F} (X, XX) = X.XX, \textit{p} = .XX, ${\eta_p}^2$ = 0.XX). Then, we performed multiple comparisons using ART-C [Elkin et al., 2021] and showed that 〇〇〇〇.

For Your Information

効果量について

サンプルコードでは、通常の分散分析と同様に、偏イータ二乗を計算しました。公式サイトにより詳細な説明があるので、必要に応じて参照してください(e.g., cohen's d や信頼区間)。
https://cran.r-project.org/web/packages/ARTool/vi

ART-C による多重比較について

公式サイトの説明を一度参照しておくと良いと思います。たくさん説明が書いてありますが、要は art.con 関数が内部で適切な関数を選んでくれるらしいです。
https://cran.r-project.org/web/packages/ARTool/vignettes/art-contrasts.html

平方和の計算方法について

ARToolでは、タイプI平方和が採用されています。これは、データが非釣り合い型(各条件でデータ数が異なる)の場合に適切な結果を出力しない可能性があるため、一般的にはタイプII平方和か、タイプIII平方和を使うことが推奨されています。しかし、ARToolの中でタイプが指定できるのか、よくわかっていません。すみません。

Discussion

ハオ / Haoハオ / Hao

大変参考になりました!ありがとうございます。少しフィードバックをさせていただきます

こちらを実行すると:

# ART-C による多重比較もある
# 交互作用が有意であった場合
art.con(m, "A:B", adjust="holm") %>%
	summary() %>%
	mutate(sig. = symnum(p.value, corr=FALSE, na=FALSE, cutpoints=c(0,0.001,0.01,0.05,0.1,1), symbols=c("***","**","*","."," ")))

以下のエラーになります:

Error in eval(predvars, data, env) : object 'A' not found

ちなみにこちらは問題なく実行されます:

# 交互作用が有意でなく、主効果が有意であった場合
art.con(m, "A", adjust="holm") %>%
	summary() %>%
	mutate(sig. = symnum(p.value, corr=FALSE, na=FALSE, cutpoints=c(0,0.001,0.01,0.05,0.1,1), symbols=c("***","**","*","."," ")))

前述したエラーについて、先にAとBをわざわざ定義すると治ります:

A <- data$A
B <- data$B