心理学実験データの解析例
従属変数を実験条件ごとに平均する
以下のような形式のファイルを解析したいとする [サンプルファイル]。
従属変数はRT,実験条件は参加者内要因2x2
Frequency:high, low
Congruency:congruent, incongruent
その他の列は呈示刺激(単語)の属性
このデータを一般的な心理学的な統計解析(分散分析など)にかける場合,まず参加者ごとに実験条件の平均値を算出する必要がある(試行の情報を全部使うこともできるけれど,ここでは古典的なやり方を想定している)。
参加者分のデータファイルをエクセルで開いて平均値を算出することも可能だし,量が多くない場合にはそっちの方が正確/早いこともある。そのため,自身のスキルや時間にあった方法を選ぶ。エクセルを用いる場合にはピボットテーブルを使用すると非常に楽である(リンクはYouTube)。
以下では,フリーの統計ソフトRを使用して条件ごとの平均値を計算・出力する方法を示す。基本的にはコピペしていけばOK。
このプログラムでは外れ値やエラーの除外は行っていないので,自分で書くか,エクセルで下処理してからプログラムを実行すること!
とりあえず一人分のデータファイルを処理する
準備とデータの読み込み
# ワーキングディレクトリの設定
# メニューバーからSession → Set Working Directory → Choose Directoryでもよい
# csvデータファイルが存在するディレクトリを設定する(個々人によってパスが異なるので注意)
setwd("C:/Users/xxxxxx/xxxxxx/xxxxxx/xxxxxx/")
# 一度dplyrのパッケージをインストールしてから実行する
# インストールはRStudioでは「Tools→Install packages..」で可能
# 複数の条件を指定したフィルタリングに使用する
library(dplyr)
# データの読み込み(一人分)
# 古いwindowsのデフォルトがShift-JIS
# ファイルの読み込みがうまくいかない場合には(NAが出るなど),fileEncoding = "Shift-JIS"を削除する
# あるいは,fileEncoding = "UTF-8"とする
data <- read.csv("001_1_2023-05-16 13_43_49.csv", fileEncoding = "Shift-JIS")
# コンソールに出力して読み込めているか確認
print(data)
各条件の値を取得する(一人分)
# dplyrパッケージのfilter関数を使って,ある条件に当てはまるデータを取得する
a1 <- filter(data, Frequency.group=="high", Congruency=="congruent")
a2 <- filter(data, Frequency.group=="high", Congruency=="incongruent")
a3 <- filter(data, Frequency.group=="low", Congruency=="congruent")
a4 <- filter(data, Frequency.group=="low", Congruency=="incongruent")
各条件の平均値を取得する(一人分)
m1 <- mean(a1$RT..ms.)
m2 <- mean(a2$RT..ms.)
m3 <- mean(a3$RT..ms.)
m4 <- mean(a4$RT..ms.)
# 4条件のデータをまとめる
one_sub <- c(m1,m2,m3,m4)
# コンソールに出力して確認
print(one_sub)
# コンソールに出力して確認
print(one_sub)
csvファイルに出力する(一人分のファイル)
# 出力ファイル名はoutput.csvとなっている。適宜変更すること。
write.table(t(one_sub),"output.csv",row.names=FALSE, sep = ",", col.names=c("High-Cong","High-Incong","Low-Cong","High-Incong"))
上の作業を参加者数(データファイル)分一括処理する
上の作業を一人一人実施するのはだるいので一括で処理する。
下準備として,ある特定のディレクトリにデータファイルを全部入れておく。余計なファイルはできるだけ入れないこと。ただし,下のプログラムでは「あるディレクトリの中にある,名前に”2023”を含むファイルを全部処理する」ものとなっているので,ファイル名さえ気をつければ問題ない。
作業ディレクトリの移動や,パッケージの読み込みは必要に応じておこなっておくこと!
このプログラムでは外れ値やエラーの除外は行っていないので,自分で書くか,エクセルで下処理してからプログラムを実行すること!
# 新しいセッションを始める場合には,ライブラリの読み込みを忘れないこと
# セッションを継続している場合には読み込みは不要
library(dplyr)
# 現在のディレクトリのパスを取得(データが存在するディレクトリを作業ディレクトリに指定している前提)
# 作業ディレクトリとデータのディレクトリが異なる場合などには,getwd()を使わず,直接文字列としてディレクトリを指定するのでもOK
path <- getwd()
# ファイル名に「2023」を含むファイルを取得(なので,余計なファイルは別ディレクトリに移動させておく!)
files <- list.files(path, pattern="2023")
# 被験者数(ファイル数)
n <- length(files)
# 変数を用意
all_sub <- matrix(0, nrow = n, ncol = 4)
print(all_sub)
for (i in 1:n) {
# データの読み込み
# 作業ディレクトリにデータがない場合,paste(path,"/",files[i], sep="")のような形でファイル名を指定するのでもOK
# ファイルの読み込みがうまくいかない場合にはEncodingを変える(一人分の解析を参照)
data <- read.csv(files[i], fileEncoding = "Shift-JIS")
# 各条件の値を取得する
a1 <- filter(data, Frequency.group=="high", Congruency=="congruent")
a2 <- filter(data, Frequency.group=="high", Congruency=="incongruent")
a3 <- filter(data, Frequency.group=="low", Congruency=="congruent")
a4 <- filter(data, Frequency.group=="low", Congruency=="incongruent")
# 各条件の平均値を取得する
m1 <- mean(a1$RT..ms.)
m2 <- mean(a2$RT..ms.)
m3 <- mean(a3$RT..ms.)
m4 <- mean(a4$RT..ms.)
# 4条件のデータをまとめる
all_sub[i,] <- c(m1,m2,m3,m4)
}
# 確認する
print(all_sub)
# 出力する
write.table(all_sub,"output_ALL.csv",row.names=FALSE, sep = ",", col.names=c("High-Cong","High-Incong","Low-Cong","High-Incong"))
↑で出力されたファイルはanovakunでそのまま読み込める形になっている(被験者内要因計画)。
output_ALL.csvを使用して分散分析をする
anovakunの詳しい使い方はこちらを参照
# anovakunのソースファイルを読み込む
source("XXXXXXXXX/anovakun_XXX.txt")
# データを読み込む
data <- read.csv("output_ALL.csv",header=F)
# anovakunを実行
anovakun(data,'sAB',2,2,holm=T,peta = T)
# 平均値一括処理と同じセッション内であれば,そのままall_subを使って解析も可能
anovakun(all_sub,'sAB',2,2,holm=T,peta = T)
分散分析後は有意差の結果を見るだけではなく,anovakunの出力全体を見て,分散分析が正しくおこなえているかを確認すること。特に使用されているデータ数,平均値などが妥当なものなのかをチェックする
データの読み込みがうまくいっていない場合にはfileEncodingをチェックし,適宜修正する