一元配置反復測定分散分析
対応あるサンプルのt検定の変数が3つ以上になったデータは一元配置反復測定分散分析を用いる。
スマートフォン利用時間の変化に関する調査データ(架空データ)を用いる。
ある大学で学生の一日あたりのスマートフォンの利用時間を調査した。学生を無作為で50人抽出し、一週間の平均利用時間を記録する。
調査は同じ学生を対象にある人気ゲームアプリリリース前と直後、そして1ヶ月後の3回実施し、その結果をまとめた(架空調査)。
このデータから人気ゲームアプリリリースとスマホ利用時間の変化について分析せよ。
なまえ | 前 | 直後 | 1ヶ月後 |
---|---|---|---|
後藤 | 202 | 224 | 215 |
松浦 | 184 | 187 | 184 |
藤本 | 223 | 245 | 258 |
… |
分析対象
アプリリリースとの時間関係をスマホ利用時間を変動させる「要因」と考える。そしてデータ一件一件がサンプルである。
サンプルサイズは各要因で等しくなければならない。どの列にも一つでも欠損値があれば、行ごと省く(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ヶ月後 | サンプル偏差 |
---|---|---|---|---|
後藤 | 202 | 224 | 215 | 後藤平均-全平均 |
松浦 | 184 | 187 | 184 | 松浦平均-全平均 |
藤本 | 223 | 245 | 258 | 藤本平均-全平均 |
… | … | |||
要因偏差 | 前平均-全平均 | 直後平均-全平均 | 一ヶ月後平均-全平均 |
この式での誤差に対する要因ごと・サンプルごとの平均差の比率が大きければ、その平均差は有意であるとする。偏差の比率の有意性は分散比の検定(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検定はおなじみ、「残差より大きい」ことを言うための片側検定(>)である。
多重比較
- すべての組み合わせにおいて対応あるサンプルのt検定のt値を求める。
- それを多重検定に合わせてp値を出す。
- スチューデント化した範囲の分布を用いてp値を出す(Tukey)
- t分布を用いてp値を求め、それをBonferroni,Holm,Benjamini & Hochbergなどで修正する
一元配置要因分散分析との違い
一元配置反復分散分析は一元配置要因分散分析に「サンプルごとの平均差の効果」を足したものである。この差は分散分析表では残差変動・残差分散の差となって現れる。一元配置反復測定分散分析の方がサンプル効果を組み入れた分、残差が減る。F値の分母となる残差が減れば、有意性が出やすくなるというわけだ。
変動要因 | 変動 | 自由度 | 分散 | F | p |
---|---|---|---|---|---|
時期 | 10900.49 | 2 | 5450.25 | 55.03 | 0.00% |
サンプル | 705092 | 49 | 14389.63 | ||
残差 | 9706.84 | 98 | 99.049 |
変動要因 | 変動 | 自由度 | 分散 | F | p |
---|---|---|---|---|---|
時期 | 10900.49 | 2 | 5450.25 | 1.12 | 32.88% |
残差 | 714798.84 | 147 | 4862.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)))