はたの授業サイト(龍谷大学社会学部)

一元配置反復測定分散分析

対応あるサンプルのt検定の変数が3つ以上になったデータは一元配置反復測定分散分析を用いる。

スマートフォン利用時間の変化に関する調査データ(架空データ)を用いる。

ある大学で学生の一日あたりのスマートフォンの利用時間を調査した。学生を無作為で50人抽出し、一週間の平均利用時間を記録する。

調査は同じ学生を対象にある人気ゲームアプリリリース前と直後、そして1ヶ月後の3回実施し、その結果をまとめた(架空調査)。

このデータから人気ゲームアプリリリースとスマホ利用時間の変化について分析せよ。

なまえ直後1ヶ月後
後藤202224215
松浦184187184
藤本223245258

分析対象

アプリリリースとの時間関係をスマホ利用時間を変動させる「要因」と考える。そしてデータ一件一件がサンプルである。

サンプルサイズは各要因で等しくなければならない。どの列にも一つでも欠損値があれば、行ごと省く(complete)。これで要因数*サンプルサイズのデータ表が作られる。

data <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/smartphone04.csv", fileEncoding = "utf-8")
data <- na.omit(data[-1]) #1列目noは不要

#平均値
col.mean <- colMeans(data) #列(要因)単位の平均
row.mean <- rowMeans(data) #行(サンプル)単位の平均
all.mean <- mean(row.mean) #全平均

#データの大きさ
col.N <- length(col.mean) #要因数
row.N <- length(row.mean) #サンプルサイズ
N <- row.N*col.N          #表のセル数

#自由度
col.df <- col.N - 1 #要因自由度
row.df <- row.N - 1 #サンプル自由度
res.df <- N - row.df - col.df -1 #残差自由度

要因偏差とサンプル偏差

一元配置要因分散分析においては

  • 個々の値 ← 全体の平均 + 要因ごとの平均差 + 誤差(残差)

で個々の値が説明された。データに対応関係があればそれにサンプルごとの平均差が加わる。

  • 個々の値 ← 全体の平均 + サンプルごとの平均差 + 要因ごとの平均差 + 誤差(残差)

ある人のある時期の利用時間は「全体の傾向+その人の利用時間の傾向+時期ごとの利用時間の傾向+誤差」で説明できると考える。

なまえ直後1ヶ月後サンプル偏差
後藤202224215後藤平均-全平均
松浦184187184松浦平均-全平均
藤本223245258藤本平均-全平均
要因偏差前平均-全平均直後平均-全平均一ヶ月後平均-全平均

この式での誤差に対する要因ごと・サンプルごとの平均差の比率が大きければ、その平均差は有意であるとする。偏差の比率の有意性は分散比の検定(F検定)で確認される。

col.effects <- col.mean - all.mean #要因ごとの平均差(要因偏差)
row.effects <- row.mean - all.mean #サンプルごとの平均差(サンプル偏差)

#要因数*サンプルサイズの表にする(元データ表と同じ大きさにする)
col.effects.matrix <- matrix(rep(col.effects,row.N),ncol=col.N,byrow=T) 
row.effects.matrix <- matrix(rep(row.effects,col.N),ncol=col.N)

#残差 ← 個別値 - 全体平均 - 要因ごとの平均差 - サンプルごとの平均差
res.matrix <- data - all.mean - col.effects.matrix - row.effects.matrix

要因分散・サンプル分散・残差分散

要因偏差、サンプル偏差、残差から各々偏差平方和(変動)を求める。

そして目的の分散は「変動 / 自由度」である。

#変動(偏差平方和)
col.ss <- sum(col.effects.matrix^2)
row.ss <- sum(row.effects.matrix^2)
res.ss <- sum(res.matrix^2)

#分散
col.ms <- col.ss / col.df
row.ms <- row.ss / row.df
res.ms <- res.ss / res.df

F検定

あとは要因分散 / 残差分散を求め、その分散比をF検定で有意性を確認する(対立仮説:残差に埋もれないほど要因間のズレは大きい)。

#分散比(F値)
col.F <- col.ms / res.ms

#有意性(p値)
col.p <- 1 - pf(col.F,col.df,res.df)

このF検定はおなじみ、「残差より大きい」ことを言うための片側検定(>)である。

多重比較

  1. すべての組み合わせにおいて対応あるサンプルのt検定のt値を求める。
  2. それを多重検定に合わせてp値を出す。
    • スチューデント化した範囲の分布を用いてp値を出す(Tukey)
    • t分布を用いてp値を求め、それをBonferroni,Holm,Benjamini & Hochbergなどで修正する

一元配置要因分散分析との違い

一元配置反復分散分析は一元配置要因分散分析に「サンプルごとの平均差の効果」を足したものである。この差は分散分析表では残差変動・残差分散の差となって現れる。一元配置反復測定分散分析の方がサンプル効果を組み入れた分、残差が減る。F値の分母となる残差が減れば、有意性が出やすくなるというわけだ。

反復測定分散分析
変動要因変動自由度分散Fp
時期10900.4925450.2555.030.00%
サンプル7050924914389.63
残差9706.849899.049
要因分散分析
変動要因変動自由度分散Fp
時期10900.4925450.25 1.1232.88%
残差714798.841474862.58

Rでの一元配置反復測定分散分析

data <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/smartphone04.csv", fileEncoding = "utf-8")
data <- na.omit(data[-1]) #1列目noは不要
summary(data)

#今のデータはアンスタック型のデータなのでそれをスタック型データに変換する
no <- factor(rep(seq(1,length(data[[1]])),length(data)))
value <- vector()
for(i in 1:length(data)) value <- append(value,data[[i]])
group <- factor()
for(i in 1:length(data)) group <- append(group,rep(colnames(data)[i],length(data[[i]])))

#分散分析表
summary(aov(value~group + Error(no)))