はじめに

t検定は1つの目的変数 (連続値) を対象に、1つの説明変数 (2水準のカテゴリカル変数) を用いた線型モデルです。1つの目的変数 (連続値) を対象に、2つ以上の説明変数 (2水準以上のカテゴリカル変数) を用いた線型モデルはANOVAと呼ばれます。1つの目的変数 (連続値) を対象に、1つの説明変数 (連続値) を用いた線型モデルは単回帰分析、複数の説明変数 (連続値) を用いた線型モデルは重回帰分析と呼ばれます。線型モデルはこれらに加え、目的変数が複数ある場合も検討可能です。

データの作成 (このセクションはT検定のセクションと同じです)

データセットは、50人の参加者が2種類の語彙学習方法を用いて比較された架空のデータです。この研究では、目標語彙に集中する学習方法がより効果的であると仮定します。具体的には、注釈付きの読解よりも、目標語彙を使用して文章を作る方が学習効果が高いと考えられます。参加者は15個ずつの目標語を2つの方法で学び、L2からL1への翻訳テスト (recall test) と選択問題 (recognition test) でその知識を評価します。このテストは学習直後と1週間後の遅延で実施しました。この実験設定を前提に、以下の分析手法を紹介します:

  1. t検定:各学習方法で15語ずつ学習し、15点満点のテストで評価します。再生テストと再認テストの両方でt検定を行います。
  2. 多変量分散分析 (Multivariate Analysis of Variance; MANOVA):再生テストと再認テストの両方を目的変数とした多変量分散分析を実施します。
  3. ランダム効果を含むロジスティック回帰分析:目標語と参加者をランダム効果とし、各目標語を観測値として、テストの正解・不正解を2値データで分析します。再生テストと再認テストそれぞれに対してロジスティック回帰分析を行い、結果を報告します。
  4. 多変量ロジスティック回帰分析:多変量分散分析のアプローチを用いて、ランダム効果を含むロジスティック回帰分析を実施します。これはRのbrmsパッケージを使用して実装できます。

以下のコードを実行してデータセットを作成します。実際に作成されたデータセットはこちらです。

sample.csv

# パッケージの読み込み
library("tidyverse")
library("psych")
library("rstan")
library("brms")
library("rstantools")
library("bayesplot")
library("tidybayes")
library("loo")
library("bayestestR")
library("performance")
library("emmeans")
library("lme4")
library("lmerTest")
library("DHARMa")
library("sjPlot")
library("effectsize")
theme_set(theme_bw())

# 処理の高速化
rstan_options(auto_write = T)
options(mc.cores=parallel::detectCores())

# サンプルデータの作成
# パラメータの設定
n_participants <- 50
n_items <- 30
treatments <- c("Glossing", "Writing")
tests <- c("Recall", "Recognition")
times <- c("Immediate", "Delayed")

# データフレームの作成
set.seed(123) # 再現性のための乱数種の設定
dat <- expand.grid(Participant = 1:n_participants,
Item = 1:n_items,
Treatment = treatments,
Test = tests,
Time = times)

# アイテムの割り当てをTreatmentに基づいて修正
dat <- dat[dat$Treatment == "Glossing" & dat$Item <= 15 | dat$Treatment == "Writing" & dat$Item > 15, ]

# スコアの割り当て
dat$Score <- ifelse(dat$Treatment == "Glossing",
rbinom(nrow(dat), 1, ifelse(dat$Test == "Recognition", 0.5, 0.2)), # Glossing: Recognition > Recall
rbinom(nrow(dat), 1, ifelse(dat$Test == "Recognition", 0.9, 0.5))) # Writing: Recognition > Recall

# Timeによるスコアの調整
dat$Score <- ifelse(dat$Time == "Immediate",
dat$Score + sample(0:1, nrow(dat), replace = T), # Immediateのスコアを上昇
dat$Score)

# スコアが1を超えないように調整
dat$Score <- pmin(dat$Score, 1)

# csvとしてデータを出力
write.csv(dat, "sample.csv")

作成されたデータは50名の参加者に対して、2つの介入 (GlossingとWriting) を行っています。Glossingでは15語、Writingでは15語を学び、合計30語の目標語を学習します。その成果を直後と遅延で測定します。測定方法にはRecallとRecognitionの2種類のテストがあります。

このデータは以下のようにScoreの列が1か0の2値データとなっています。

> head(dat)
Participant Item Treatment Test Time Score
1 1 1 Glossing Recall Immediate 1
2 2 1 Glossing Recall Immediate 1
3 3 1 Glossing Recall Immediate 1
4 4 1 Glossing Recall Immediate 1
5 5 1 Glossing Recall Immediate 1
6 6 1 Glossing Recall Immediate 1

ロジスティック回帰分析は目的変数 (Score) が2値のまま実行できるのですが、t検定やMANOVAは実行できません。そこで以下のようにコードで連続値へと足して15点満点にする必要があります。

# 参加者ごとにスコアを集計
dat_summarized <- dat %>%
mutate(Participant = factor(Participant),
Item = factor(Item)) %>%
group_by(Participant, Treatment, Test, Time) %>%
summarize(Score = sum(Score), .groups = 'drop')

# 記述統計
(desc <- dat_summarized %>%
group_by(Treatment, Test, Time) %>%
summarise(
Mean = mean(Score),
SD = sd(Score),
N = n(),
SE = SD / sqrt(N),
CI_lower = Mean - 1.96 * SE,
CI_upper = Mean + 1.96 * SE
))

以下は参加者がTreatment、Test、Timeごとに15点満点のテストで何点かを表しています。

> head(dat_summarized)
# A tibble: 6 × 5
Participant Treatment Test Time Score
<fct> <fct> <fct> <fct> <dbl>
1 1 Glossing Recall Immediate 10
2 1 Glossing Recall Delayed 3
3 1 Glossing Recognition Immediate 11
4 1 Glossing Recognition Delayed 7
5 1 Writing Recall Immediate 14
6 1 Writing Recall Delayed 8

記述統計をプロットを見ると、RecallおよびRecognitionでImmediateの方がDelayedよりも高く、Writingの方がGlossingよりも高い点数である傾向があることがわかります。

Untitled

多変量分散分析 (Multivariate Analysis of Variance: MANOVA)