1.6K Views
July 25, 23
スライド概要
神戸大学経営学研究科で2022年度より担当している「統計的方法論特殊研究(多変量解析)」の講義資料「04_予備的な分析と信頼性・妥当性」です。
神戸大学経営学研究科准教授 分寺杏介(ぶんじ・きょうすけ)です。 主に心理学的な測定・教育測定に関する研究を行っています。 講義資料や学会発表のスライドを公開していきます。 ※スライドに誤りを見つけた方は,炎上させずにこっそりお伝えいただけると幸いです。
4.1 分布の可視化 Chapter 4 予備的な分析と信頼性・妥当性 本資料は,神戸大学経営学研究科で 2022 年度より担当している「統計的方法論特殊研究(多 変量解析)」の講義資料です。CC BY-NC 4.0 ライセンスの下に提供されています。 作成者連絡先 神戸大学大学院経営学研究科 分寺杏介(ぶんじ・きょうすけ) mail: [email protected] website: https://www2.kobe-u.ac.jp/~bunji/ 前回までで,データを読み込み,転記ミスなどの異常が無いかを確認しました。また,適当 回答や欠測値の処理を行い,ようやく分析ができる「きれいな」データを用意することが出 来ました。今回は本格的な分析に入る前の前段階として,項目や尺度の性質・性能を簡単に 確認していきます。この段階で,明らかに良くない項目は事前に削除しておくことによって, その先の分析でより安定した結果が得られるようになるはずです。 Contents 4.1 4.2 4.3 4.4 4.5 分布の可視化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 項目分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 信頼性と妥当性の考え方 . . . . . . . . . . . . . . . . . . . . . . . . . . 妥当性の検証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 信頼性の検証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9 26 28 31 オブジェクトの読み込み 1 dat <- readRDS("chapter03.rds") 4.1 分布の可視化 データ内のゴミをある程度取り除けたところで,各変数の分布を見てみましょう。量的変数 の場合,要約統計量だけではなく分布を可視化するのも大事です。心理尺度の場合,合計点 だけでなく各項目のレベルで,できるだけ回答が正規分布に近い形でばらついている方が都 1
4.1 分布の可視化 合が良い事が多いです。例えば「毎日睡眠をとっている」や「ここ 1 ヶ月人と会話していな い」のように,ほぼすべての人に当てはまりすぎる・全く当てはまらないような項目は,ほ ぼすべての人が同じ回答になるため,その項目に対する回答が個人の特性値に対して何の情 報も与えない可能性があります。分析の前に,このような天井効果や床効果と呼ばれる状態 が発生していないかを確認したり,分布のピークが一つになっているかを確認しておきまし ょう。また余裕があれば,2 変数の散布図を書いたりして,項目間の相関関係について想像 したりするのも良いでしょう。 なお,ここから先では「とりあえず図を出す」レベルの話だけします。論文に載せるような きれいなグラフを描きたい場合には色々引数をいじりまくる必要がありますが,それだけで 1 コマくらいは潰れると思うので…*1 4.1.1 1 変数の棒グラフ・ヒストグラム リッカート尺度の項目反応など,取る値のパターンがせいぜい数個(離散変数や名義変数) の場合は,棒グラフが良いでしょう。棒グラフは barplot() と table() を組み合わせるこ とで描けます。 離散変数の棒グラフ 1 0 200 400 600 800 barplot(table(dat$Q1_1)) 1 2 3 4 5 6 図4.1 1 変数の棒グラフ barplot() は,与えられたベクトルの一つ一つの値を棒の長さで表現する関数です。そのた め,barplot(dat$Q1_1) というように直接データを与えてしまうと,図4.2のように左から 長さが 2, 2, 5, 4, 2, …という感じで 2800 本の棒グラフが誕生してしまいます。 *1 2 本気できれいな図を作りたい場合は,ggplot2 というパッケージがおすすめです。ただ,この授業で紹介す る方法とは設計の基本理念から異なっているので,紹介しているヒマがありません。論文用の図を作りたい 時が来たら個別に質問してください。
4.1 分布の可視化 table() を噛ませないとダメ barplot(dat$Q1_1) 0 1 2 3 4 5 6 1 図4.2 exttttable() を噛ませないと 年齢など,連続変数の場合はヒストグラムのほうが良いでしょう。ヒストグラムは hist() 関数で描くことが出来ます。 ヒストグラムを描く 1 hist(dat$age) 300 0 100 Frequency 500 Histogram of dat$age 0 20 40 60 80 dat$age 図4.3 1 変数のヒストグラム ヒストグラムでは,区切り幅が重要な役割を果たします。デフォルトでは,スタージェスの 公式と呼ばれるものに基づいて区切り幅が決定されています。これは,データの総数を 𝑛 と 置いた場合に,データの値が取る全範囲を 1 + log2 𝑛 個に等分割する方法です。したがっ て,2432 人分のデータがある dat では 1 + log2 2432 からおよそ 12 個に等分割された結果 が図4.3に表れています。基本的にはデータの数にあわせていい感じに調整してくれるので良 3
4.1 分布の可視化 いのですが,場合によっては「年齢を 10 刻みで区切る」など,区切り幅をきっちり指定した いこともあるでしょう。これを実現するためには,hist() の引数 breaks を指定してあげ ます。 区切り幅を変える 1 hist(dat$age, breaks = 20) # 左上 2 hist(dat$age, breaks = c(0, 10, 20, 40, 50, 100)) # 左下 3 hist(dat$age, breaks = seq(0, 100, by = 10)) # 右上 4 hist(dat$age, breaks = seq(0, 100, length = 10)) # 右下 breaks = seq(0,100,by=10) 600 400 Frequency 300 0 0 100 200 200 Frequency 400 500 800 600 breaks = 20 40 60 80 0 20 40 60 dat$age dat$age breaks = c(0,10,20,40,50,100) breaks = seq(0,100,length=10) 100 80 100 400 200 Frequency 600 800 80 0 Density 20 0.000 0.005 0.010 0.015 0.020 0.025 0 0 20 40 60 80 100 0 dat$age 20 40 60 dat$age 図4.4 区切り幅を変える hist() の引数 breaks の指定方法は,大きく分けると単一の整数を与える方法と,区切り位 置のベクトルを与える方法の2種類があります。前者の場合は,データの値が取る全範囲をそ の個数で等分割してくれます。後者の場合は,等分割以外の区切り方も指定可能(図4.4の左 下)ですが,上限と下限がデータの値が取る全範囲を含んでいないとエラーが返ってくるの でご注意ください。 ちなみに breaks の指定で使用した seq() 関数は,等差数列(ベクトル)を作成してくれる 関数です。 seq() 関数 4 1 # 最初の2つの引数が「どこからどこまで」 2 # 次に引数byを与えた場合,「いくつ刻み」
4.1 分布の可視化 3 1 seq(0, 100, by = 10) [1] 0 10 20 30 40 50 60 70 80 1 # 次に引数lengthを与えた場合,「長さいくつ」 2 seq(0, 100, length = 10) 90 100 1 [1] 0.00000 11.11111 22.22222 2 [7] 66.66667 77.77778 88.88889 100.00000 33.33333 44.44444 55.55556 天井効果・床効果の確認 天井効果または床効果が発生しているかの判断について,一発で見抜ける方法というものは ありません。あくまでも一つの基準としてですが,よく言われているのは「平均値 ± 標準偏 差が,取りうる値の範囲(今回の例では1から6)を超えている場合」というものらしいです (要出典)。特に変数の数が多くて全ての棒グラフを作って見るのも骨が折れる,という場合 には,まずこの判別方法であたりを付けてみるのも良いかもしれません。 天井効果または床効果の確認のためには,各変数(列)ごとに平均値や標準偏差を計算する 必要があります。普通に考えると次のようなコードによって実現可能です。 1 問目の平均値と標準偏差を足すと 1 # 欠測値があるため,na.rm=TRUEを引数に追加している 2 mean(dat[, "Q1_1"], na.rm = TRUE) + sd(dat[, "Q1_1"], na.rm = TRUE) 1 [1] 5.998918 1 問目の平均値から標準偏差を引くと 1 # 欠測値があるため,na.rm=TRUEを引数に追加している 2 mean(dat[, "Q1_1"], na.rm = TRUE) - sd(dat[, "Q1_1"], na.rm = TRUE) 1 [1] 3.18776 ただ,今回は 25 項目もあります。上の計算をそれぞれの列にやっても良いのですが効率が 悪いので,apply() を使って 列ごとの平均値 5 1 # 本当はQ1_1からQ1_25のところだけに適用したら良いが, 2 # 今回は全ての列がnumericかinteger型なので気にせず進めます。 3 apply(dat, 2, mean, na.rm = TRUE)
4.1 分布の可視化 1 ID Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 2 1396.945312 4.593339 4.801398 4.602385 4.691612 4.548931 3 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 4 4.527138 4.374178 4.301398 4.449013 3.692434 4.020148 5 Q1_12 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 6 3.846217 3.987253 4.414474 4.394326 2.944901 3.519737 7 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 8 3.226151 3.203947 2.972451 4.814967 4.314556 4.454359 9 Q1_24 Q1_25 gender education age 10 4.927632 4.528783 1.670230 3.190860 28.582237 とすればよいわけです。したがって,各列の平均値 ± 標準偏差をまとめて計算したい場合は それぞれ 1 apply(dat, 2, mean, na.rm = TRUE) + apply(dat, 2, sd, na.rm = TRUE) 1 ID Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 2 2207.424918 5.998918 5.974081 5.908401 6.172146 5.812634 3 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 4 5.758867 5.690390 5.589267 5.825444 5.323572 5.650285 5 Q1_12 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 6 5.458144 5.335440 5.876204 5.733057 4.519407 5.050856 7 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 8 4.819228 4.771938 4.594638 5.936672 5.866132 5.654409 9 Q1_24 Q1_25 gender education age 10 6.116027 5.852550 2.140456 4.302853 39.550527 1 apply(dat, 2, mean, na.rm = TRUE) - apply(dat, 2, sd, na.rm = TRUE) 1 ID Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 2 586.465707 3.187760 3.628715 3.296368 3.211077 3.285227 3 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 4 3.295409 3.057966 3.013529 3.072583 2.061297 2.390011 5 Q1_12 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 6 2.234291 2.639066 2.952743 3.055594 1.370395 1.988618 7 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 8 1.633075 1.635957 1.350264 3.693263 2.762979 3.254308 9 Q1_24 Q1_25 gender education age 10 3.739236 3.205016 1.200004 2.078867 17.613946 となります。天井効果が出ている可能性がある(平均値 +SD が 6 を超えている)変数は Q1_4,Q1_24 の 2 つです。また,床効果が出ている可能性のある項目はなさそうでした。 ということで,天井効果が出ている可能性のある変数のプロットが図4.5です。 6
4.1 分布の可視化 天井効果はあるのか? barplot(table(dat[, "Q1_4"])) 2 barplot(table(dat[, "Q1_24"])) 0 0 200 400 600 200 400 600 800 800 1 1 2 3 4 5 図4.5 6 1 2 3 4 5 6 天井効果が疑われる項目 実際に天井効果および床効果が生じていると思われる項目を分析から除外するかについては, 定量的な基準(平均 ± 標準偏差)だけで決めるべきではありません。実際には,この後紹介 する妥当性などの観点から項目の内容を吟味したりして,構成概念の定義的に無くなっても 問題ないかを判断する必要があります。ちなみに今回の程度であれば,分布が多少偏ってい るとはいえ,除外するほどの大きな問題とはいえないでしょう。 4.1.2 2 変数の関係をプロットする 2変数の散布図を描く場合には,plot() 関数が使えます。なお,plot() 関数は他にもデー タの形式などに合わせて何かしらの図を出してくれたりするので,色んなところでお世話に なると思います。 散布図を描く 1 # 1問目(Q1_1)と年齢(age)の散布図 2 # 2変数なので2列指定してあげる 3 plot(dat[, c("Q1_1", "age")]) 図4.6では Q1_1 の取りうる値が 6 通りしかないため散布図感が薄いですが,一つ一つのマル が各レコードを表しています。 また,2変数の table() を用いるとクロス表が得られるのですが,これを plot() に与える と違った形の図が得られます。 7 1 # 2変数のクロス表 2 table(dat[, c("Q1_1", "Q1_2")])
40 0 20 age 60 80 4.1 分布の可視化 1 2 3 4 5 6 Q1_1 図4.6 plot() による散布図 1 Q1_2 2 Q1_1 1 2 3 1 10 13 4 2 6 26 5 3 6 21 33 6 4 3 19 7 5 7 25 39 152 333 163 8 6 7 9 3 4 5 6 5 7 15 22 15 46 61 38 97 86 49 39 104 128 56 7 73 273 439 1 # そのままplot()に入れると 2 plot(table(dat[, c("Q1_1", "Q1_2")])) table(dat[, c("Q1_1", "Q1_2")]) 2 3 4 5 6 4 6 5 Q1_2 3 2 1 1 Q1_1 図4.7 table を plot 図4.7では,それぞれの四角形および行・列の幅が,各選択肢を選んだ人の割合をそれぞれ表 しています。 8
4.2 項目分析 変数の分布をプロットする方法は,他にも色々ありますが(例えば箱ひげ図やバイオリンプ ロットなど) ,必要に応じて適切な方法を選べるようになりましょう。本講義では,あくまで も基本的なプロットの方法のみの紹介にとどめて次に進んでしまいます。 4.2 項目分析 まずはじめに,項目単位での「変なやつ」がいないかをチェックしていきます。 4.2.1 I-T 相関 ここでは大前提として,心理尺度では複数の項目が同じ構成概念を測定しようとしているは ずだ,というところから出発して考えます。このとき,ある項目が,同じ尺度内の他の項目 と確かに同じ構成概念を測定しているならば,他の項目の得点との相関は高いはずです。と いうことは当然,合計点との相関も高いだろうという予測が立ちます。この考えに基づいて 算出される指標が,各項目の値と,尺度の合計点の相関である Item-Test (I-T) 相関です。 他の項目との一貫性という点では,後述する信頼性の分析の一部という見方もできます*2 。 I-T 相関を出すためには,まず合計点を出す必要があります。これは apply() を使えば簡単 に出来ます。最も簡便な尺度得点としてそのまま他の変数との関係を見る分析にも使えたり するので,ここで各因子ごとに合計点を作成して dat に追加しておきましょう。ほとんどの 場合,データフレームの存在しない列名を指定して代入すると,新しい列を追加してくれま す*3 。 合計点の算出 1 # 列の指定の仕方はいろいろありました 2 # Agreeableness 3 dat[, "Q1_A"] <- apply(dat[, paste0("Q1_", 1:5)], 1, sum) 4 # Conscientious 5 dat$Q1_C <- apply(dat[, paste0("Q1_", 6:10)], 1, sum) 6 # Extraversion 7 dat[, "Q1_E"] <- apply(dat[, paste0("Q1_", 11:15)], 1, sum) 8 # Neuroticism 9 dat["Q1_N"] <- apply(dat[, paste0("Q1_", 16:20)], 1, sum) 10 # Openness 11 dat$Q1_O <- apply(dat[, paste0("Q1_", 21:25)], 1, sum) 12 # 一旦確認 13 head(dat) 1 ID Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6 Q1_7 Q1_8 Q1_9 Q1_10 Q1_11 Q1_12 2 1 *2 1 5 4 3 4 4 2 3 3 3 3 4 4 一般的に信頼性(および妥当性)は尺度の性質として考えられるものなので,項目の性質の分析である I-T 相関の確認は信頼性とは別枠で紹介しています。 *3 ncol(dat)+1 列目を指定して代入することも可能ですが,この場合列の名前を決められないのでやめたほう が良いでしょう。 9
4.2 項目分析 3 2 2 5 4 5 2 5 5 4 4 4 3 6 6 4 3 3 2 4 5 4 4 4 5 4 5 2 5 3 5 4 4 3 4 6 5 5 4 4 3 2 2 2 4 6 5 5 5 3 3 4 5 4 4 5 4 5 5 5 7 6 6 1 6 5 6 5 6 6 6 6 4 5 6 8 Q1_13 Q1_14 Q1_15 Q1_16 Q1_17 Q1_18 Q1_19 Q1_20 Q1_21 Q1_22 Q1_23 9 1 3 4 4 3 4 2 2 3 3 1 3 10 2 6 4 3 3 3 3 5 5 4 5 4 11 3 4 4 5 4 5 4 2 3 4 5 5 12 4 4 4 4 2 5 2 4 1 3 4 4 13 5 5 4 5 2 3 4 4 3 3 4 4 14 6 6 5 6 3 5 2 2 3 4 4 5 15 Q1_24 Q1_25 gender education age Q1_A Q1_C Q1_E Q1_N Q1_O 16 1 4 4 1 NA 16 20 14 19 14 15 17 2 3 4 2 NA 18 21 20 25 19 20 18 3 5 5 2 NA 17 19 20 21 18 24 19 4 3 2 2 NA 17 23 15 18 14 16 20 5 3 4 1 NA 17 20 22 24 16 18 21 6 6 6 2 3 21 23 28 28 15 25 合計点が出来たら,後は相関係数を計算するだけです。ですが,ここで計算するべき相関係 数は,普通の(ピアソンの積率)相関係数ではありません。 カテゴリカル変数の相関 各項目への回答は,本来連続量である潜在変数(因子)の強さによって規定されます。実際 に観測できる項目反応(5 件法なら 1 から 5 の数字)は,この潜在変数を適当なところで打 ち切ってカテゴリ化された値とみなせるわけです。図4.8はその関係を表した図です。潜在変 数は通常,正規分布に従うと仮定されます。その仮定のもとで,潜在変数の強さの程度に応 じて,回答者は自分にあった強さの選択肢を選んでいる,というように考えます*4 。 1 2 3 4 5 図4.8 5 件法に対する潜在変数と回答の関係 ということは,合計点*5 との相関係数は,項目への回答そのものではなく,背後にある潜在 変数の値で計算されるべきなのです。むしろそうしないと,連続量をカテゴリに落とし込む ことで失われる情報のせいで,本来の相関係数よりも低い値が算出されてしまいます。 *4 もちろん,回答者自身が自分の潜在特性の強さと項目の閾値の関係を考えて回答を選んでいるわけではあり ません。あくまでも「こう考えたらしっくり来るよね」というイメージ的なものです。 *5 それなりの項目数があれば,合計点は連続変数とみなしても良いのでそのまま使います。 10
4.2 項目分析
今回はポリシリアル相関 (polyserial correlation) というものを使います。これは,連続変数
と(多値)カテゴリカル変数において,背後の連続量を仮定した相関係数です。他にも二値
変数と連続変数の相関(点双列相関係数)
,カテゴリカル変数同士の相関(ポリコリック相関
係数)
,二値変数同士の相関(テトラコリック相関係数)などがあります。これらの特殊な相
関係数を計算するためのパッケージとしては,polycor パッケージというものがあります。
今回はポリシリアル相関を計算するため,polyserial() を使用しましょう。
ポリシリアル相関の計算
1
# まだパッケージをインストールしていない場合は
2
# install.packages("polycor")
3
library(polycor)
4
5
# 第一引数に連続変数を,第二引数にカテゴリカル変数をおく
6
# 1変数ずつしか計算できないので,apply()を使って一気にやる
7
# x: I-T相関を出したい項目
8
# total: 合計点
9
itcor <- function(x, total) {
10
polyserial(total, x)
11
}
12
# apply()の第一引数xは,FUNに与えた関数(itcor)の第一引数になる
13
# 第二引数以降は引数FUNより後ろに明示的に与える
14
15
# Agreeableness
16
apply(dat[, paste0("Q1_", 1:5)], 2, itcor, dat[, "Q1_A"])
17
# Conscientious
18
apply(dat[, paste0("Q1_", 6:10)], 2, itcor, dat[, "Q1_C"])
19
# Extraversion
20
apply(dat[, paste0("Q1_", 11:15)], 2, itcor, dat[, "Q1_E"])
21
# Neuroticism
22
apply(dat[, paste0("Q1_", 16:20)], 2, itcor, dat[, "Q1_N"])
23
# Openness
24
apply(dat[, paste0("Q1_", 21:25)], 2, itcor, dat[, "Q1_O"])
1
2
1
2
1
2
1
2
11
Q1_1
Q1_2
Q1_3
Q1_4
Q1_5
0.6343893 0.8006811 0.8320099 0.7379408 0.7392092
Q1_6
Q1_7
Q1_8
Q1_9
Q1_10
0.6980845 0.7432043 0.7076029 0.7993942 0.7615535
Q1_11
Q1_12
Q1_13
Q1_14
Q1_15
0.7650335 0.8265158 0.7100692 0.8071135 0.6899571
Q1_16
Q1_17
Q1_18
Q1_19
Q1_20
0.8495472 0.8190185 0.8462378 0.7489533 0.7173007
4.2 項目分析
1
2
Q1_21
Q1_22
Q1_23
Q1_24
Q1_25
0.6689789 0.7160443 0.7168503 0.5418518 0.7209368
polyserial() 関数は,
「カテゴリ変数と連続変数の相関を出す」関数です。したがって,ポ
リシリアル相関の特殊なケースであるバイシリアル相関もこの関数で対応可能です。これと
は別に,polychoric() 関数というものも用意されています。こちらは「カテゴリ変数同士
の相関を出す」関数で,ポリコリック相関と点双列相関係数を出すことができます。
I-T 相関という場合,実は 2 種類の相関係数が考えられます。一つはいま計算した「合計点
との相関」です。しかし今回のように項目数が少ない場合,
「合計点」はその項目自身の影響
を結構強く受けていると考えられます。そこで,「合計点から自身の得点を引いたものとの
相関」I-T 相関として考えることもあります。例えば Q1_1 の I-T 相関であれば,Q1_2 から
Q1_5 までの 4 項目の合計点との相関を見る,ということです。
「合計点から自身の得点を引いたものとの相関」を見る場合,先程のように簡単にはいきませ
ん。これもやり方はいくつかあると思いますが,ここでは関数を定義してやってみましょう。
I-T 相関の計算その 2
1
# 合計点から自身の得点を引いたものとの相関を出す関数
2
itcor2 <- function(x, sum) {
3
4
polyserial(sum - x, x)
}
5
6
# Agreeableness
7
apply(dat[, paste0("Q1_", 1:5)], 2, itcor2, dat[, "Q1_A"])
8
# Conscientious
9
apply(dat[, paste0("Q1_", 6:10)], 2, itcor2, dat[, "Q1_C"])
10
# Extraversion
11
apply(dat[, paste0("Q1_", 11:15)], 2, itcor2, dat[, "Q1_E"])
12
# Neuroticism
13
apply(dat[, paste0("Q1_", 16:20)], 2, itcor2, dat[, "Q1_N"])
14
# Openness
15
apply(dat[, paste0("Q1_", 21:25)], 2, itcor2, dat[, "Q1_O"])
1
2
1
2
1
2
12
Q1_1
Q1_2
Q1_3
Q1_4
Q1_5
0.3497715 0.6254912 0.6506640 0.4597522 0.5309969
Q1_6
Q1_7
Q1_8
Q1_9
Q1_10
0.4966869 0.5445442 0.5033232 0.6130345 0.5143994
Q1_11
Q1_12
Q1_13
Q1_14
Q1_15
0.5473676 0.6487321 0.5260702 0.6280941 0.4922296
4.2 項目分析 1 Q1_16 2 Q1_17 Q1_18 Q1_19 Q1_20 0.7127767 0.6793635 0.7088856 0.5709521 0.5129809 1 Q1_21 2 Q1_22 Q1_23 Q1_24 Q1_25 0.4291648 0.3812691 0.4836023 0.2386248 0.4531874 当然ですが,自身の得点を引いたものとの I-T 相関のほうが低くなりました。ただ今回はい ずれの項目も問題ないレベルの I-T 相関を示しています。(当然と言えば当然ですが)サン プルデータなのでかなりきれいです*6 。 ちなみに I-T 相関が低いということは,それすなわち項目が悪い,というわけではありませ ん。あくまでも他の項目との相関が低いだけです。ただ,I-T 相関が低い項目が入っている 場合,因子分析をしても思った通りに因子がまとまらなかったり,項目反応理論もうまく適 用できない可能性が高くなります。そのため,内容次第ではありますが I-T 相関が低い項目 があればこの段階で分析から除外する,ということもあります。実際のところどの程度低か ったら問題視されるかの明確な基準は多分無いのですが,経験的には自身の得点を引いたも のとの I-T 相関が 0.2 から 0.1 を下回ると,相当厳しいケースが多いです。 【おまけ】カテゴリカルな相関係数の計算方法 上述したようなカテゴリ変数に対する相関係数では,図4.8に示したように,各項目への回答 の背後に正規分布に従う連続量があると仮定します。ここで,2 つの二値項目(当てはまる /当てはまらない)への回答 𝑥𝑖 , 𝑥𝑗 について, (点双列)相関係数の出し方を説明します。も ちろん多値項目に対する相関係数も原理は同じです。 二値項目その背後にある連続量をそれぞれ 𝑢𝑖 , 𝑢𝑗 としておきます。カテゴリカルな相関係数 では,連続量が閾値を超えていたら 1, 超えなければ 0 と回答している,と考えるので,各項 目についての閾値をそれぞれ 𝜏𝑖 , 𝜏𝑗 と置くと,項目への回答と連続量の関係性を以下のよう に表すことができます。 𝑥𝑖 = { 0 𝑢𝑖 < 𝜏 𝑖 1 𝑢𝑖 ≥ 𝜏 𝑖 𝑥𝑗 = { 0 𝑢 𝑗 < 𝜏𝑗 1 𝑢 𝑗 ≥ 𝜏𝑗 (4.1) 𝑢𝑖 に関して,ここまでの関係を表したものが図4.9です。同様の関係が 𝑢𝑗 についても存在し ているとします。 いま知りたいのは,2 つの回答の背後にある連続量同士の相関係数 𝑟𝑢𝑖 ,𝑢𝑗 です。これを計算 するためには,2 つの項目についての図4.9に 2 変量正規分布の図を組み合わせて,実際に得 られる回答の割合を考えます。図4.10の2つの図は,いずれも (𝜏𝑖 , 𝜏𝑗 ) = (0.2, −0.8) として 作図したものです。周辺尤度(上と右にある正規分布)にはいずれも標準正規分布を仮定し て,それぞれ 𝜏𝑖 = 0.2 以上および 𝜏𝑗 = 0.8 のところが塗りつぶされています。いま,各図の 中の楕円は 2 変量正規分布の確率密度(左:相関弱め,右:相関強め)を表しています。し *6 13 現実のデータで,これだけきれいに I-T 相関が高く出て(今後やりますが)きれいな因子構造が得られるこ とはまずありません。この授業ではかなり理想に近いデータを扱っていたんだということは,みなさんもい ずれ痛感するときが来るかもしれません。
4.2 項目分析 xi = 0 xi = 1 ui ti 図4.9 2 件法に対する潜在変数と回答と閾値の関係 たがって楕円のうち塗りつぶされている箇所(右上)は,2 変量正規分布において 𝜏𝑖 = 0.2 以上かつ 𝜏𝑗 = 0.8 となる確率を表しています。図からもわかるように,2 変量正規分布の形 は相関係数によって変化するため,2 つの閾値(𝜏𝑖 = 0.2 と 𝜏𝑗 = 0.8)で区切られた 4 つの 区間の面積は相関係数によって変わります。 2 2 3 X>t 3 X>t X>t Y>T Y>T X>t Y>T 0 X<t Y<T T X<t Y<T T -2 X>t Y<T -3 -3 -2 X>t Y<T Y>T rho = 0.8 phi = 0.41 -1 0 rho = 0.3 phi = 0.17 -1 X<t Y>T 1 1 X<t Y>T -3 -2 -1 0 1 2 3 図4.10 -3 -2 -1 0 1 2 3 2 つの潜在変数の相関関係と回答 そして観測されたデータには,2 つの二値項目に対する回答の組み合わせが 4 パターン存在 しうるので,それぞれの出現割合を表4.1のようにまとめておきます。 𝑥𝑖 𝑦𝑖 0 1 1 𝜋00 𝜋11 0 𝜋01 𝜋10 表4.1 2 項目への回答のパターンとその割合 これで材料が出揃いました。カテゴリ変数に対する相関係数では,図4.10の楕円の 4 つの 領域の確率と表4.1の 4 つの 𝜋 の割合が一致するように各項目の閾値 𝜏𝑖 , 𝜏𝑗 および相関係数 𝑟𝑢𝑖 ,𝑢𝑗 を求めます。例えば「100 人中 25 人が (1, 1) と回答した」という場合には 𝜋11 = 0.25 14
4.2 項目分析 となるので,図4.10の楕円のうち塗りつぶされている部分(右上)の確率も 0.25 になるよう に,(𝜏𝑖 , 𝜏𝑗 , 𝑟𝑢𝑖 ,𝑢𝑗 ) の 3 つを操作し,得られた 𝑟𝑢𝑖 ,𝑢𝑗 の値が(点双列)相関係数となるわけ です。 実際のアルゴリズムでは,これをもう少し簡便にした二段階推定法が用いられることが多い ようです。二段階推定法では,まず第一段階で閾値 𝜏𝑖 , 𝜏𝑗 を各回答の出現割合から決定して しまいます。例えば「100 人中 30 人が 𝑥𝑖 = 1 と回答した」という場合には,標準正規分布 のなかで上位 30% の人が 𝑢𝑖 ≥ 𝜏𝑖 であったと考えられます。したがって,閾値 𝜏𝑖 は,標準正 規分布における上側 30% の(図4.9において点線より右側の面積が 30% になる)点となり, これを計算するとおよそ 0.524 と求めることが出来ます。そして第二段階では,第一段階で 得られた閾値を固定して,相関係数 𝑟𝑢𝑖 ,𝑢𝑗 のみを計算します。 4.2.2 G-P 分析・トレースライン Good-Poor 分析とは,特に学力テストの文脈で用いられることのある分析方法です。テスト の場合,合計点が高い人ほど Good,低い人ほど Poor とされるわけですが,仮にある項目が テスト全体と同じものを測定しているならば,合計点が高い人ほど正答率が高く,低い人ほ ど正答率が低い,ということが言えそうです。…この考え方,先程の I-T 相関と非常に良く 似ていますね。 G-P 分析では,合計点によって全回答者を 3 群程度に分け,上位(Good)群と下位(Poor) 群での正答率の差をチェックします。もしも正答率に差があれば,たしかにその項目はその テスト全体が言うところの上位と下位を弁別できていそうだぞ,ということになるわけです。 トレースラインは,G-P 分析のときと同じように,合計点によって全回答者をいくつかの群 に分け,各群での各選択肢の選択率をプロットしていきます。一番左から順に,得点の低い 群から並べていった時に,誤答選択肢の選択率は右肩下がりに,正答選択肢の選択率が右肩 上がりになっていれば,たしかにその項目はそのテスト全体が言うところの上位と下位を弁 別できていそうだぞ,ということになるわけです。 図4.11は,仮想的な 5 件法の項目に対するトレースラインの例です。この例では,データを 合計点で 5 等分しています。したがって,各プロットの一番左は「合計点の下位20%の人た ちの,この項目への回答の平均点」を表しているわけです。では一つずつ図を見ていきまし ょう。 左上の図は,合計点が高い人ほどこの項目にも高い点をつけているため,良い項目だと判断 できます。言い換えると,この項目に対して何と回答したかによって,その人の合計点(そ の背後にある潜在特性)の高低を正しく評価できている,ということです。このような項目 では,I-T 相関も高く出ることでしょう。 右上の図は,合計点の最上位層のみが高い点をつけていて,他の人達は軒並み低い点をつけ ている項目です。このような項目は,床効果が出ている項目と見ることが出来ます。一方で, この項目は「高得点か否か」を識別できる項目としてはよく機能しているため,この程度の 床効果では削除する必要はない可能性が高いでしょう。I-T 相関はちょっと低くなるかもし れませんが,G-P 分析を行えば問題ない結果が出るはずです。 15
4.2 項目分析 高得点者だけ識別できる 5 4 4 回答の平均値 回答の平均値 良い項目 5 3 2 1 低い やや低い 平均 合計点 やや高い 3 2 1 高い 5 4 4 3 2 1 低い やや低い やや低い 平均 合計点 やや高い 高い 平均 合計点 やや高い 高い たぶん逆転項目 5 回答の平均値 回答の平均値 悪い項目 低い 平均 合計点 やや高い 図4.11 高い 3 2 1 低い やや低い トレースラインの例 左下の図は,合計点の高低にかかわらず平均値が概ね同じ値になっています。一般的には, このような項目が悪い項目と判断されます。この項目に何と回答するかが,その人の合計点 (その背後にある潜在特性)の高低と無関係になっているということは,この項目への回答が 潜在特性の高低の推定に役立っていないということです。このような項目では I-T 相関は低 く,G-P 分析もダメダメになると思われるので,事前に削除を検討しても良いと思います。 右下の図は,これまでと違って右下りになっています。ふつう心理尺度では,すべての項目 は同じ特性を反映していると考えているため,単一項目への回答と合計点は正の相関になる はずなので,ちょっとおかしいです。最もありえるのは「逆転項目の処理忘れ」でしょう。一 方で,もしも逆転項目のつもりではない項目でこのような関係が見られた場合は,ワーディ ングなどに問題を抱えている可能性が考えられるので,使用を慎重に検討したほうが良いか もしれません。 ここからは,実際に平均点のトレースラインを作成してみたいと思います。トレースライン 作成のために必要な工程は以下のとおりです。 1. 合計点を用いてデータをいくつかのグループに分ける 2. 各グループについて,特定の項目への回答の平均値を出す 3. X 軸を 1. で求めたグループ(小さい順),Y 軸を 2. で求めた平均値としてプロッ トする 工程 1. では新しい材料として,cut() 関数を使用します。この関数は,与えられたベクト ルの中身を小さい順に並び替えて breaks 等分したときに,各レコードが下から何番目のグ ループに入るかを教えてくれる関数です。 16
4.2 項目分析 cut() 関数 1 # まずはやってみる 2 # labelsにbreaksと同じ長さのベクトルを与えると表示がわかりやすい 3 cut(dat$Q1_A, breaks = 10, labels = 1:10) 1 [1] 6 7 6 8 6 8 8 4 9 8 7 8 4 7 7 7 6 8 3 2 [23] 8 8 6 10 6 8 9 10 9 8 5 9 6 10 8 9 8 6 10 10 5 8 3 [45] 6 10 10 9 7 6 10 8 5 6 8 7 7 7 6 10 7 3 8 9 8 6 4 [67] 8 8 9 10 8 5 8 8 6 8 10 8 7 9 9 9 8 8 9 8 6 5 [89] 3 9 6 6 7 8 6 10 1 6 [ reached getOption("max.print") -- omitted 2332 entries ] 6 9 9 8 10 9 8 7 Levels: 1 2 3 4 5 6 7 8 9 10 1 # これをデータにくっつけておく 2 dat$group_A <- cut(dat$Q1_A, breaks = 10, labels = 1:10) 工程 2. において便利なのが aggregate() 関数です。この関数は,指定した変数の値ごとに グルーピングしたうえで,それぞれのグループに対して計算を行ってくれる関数です。ちょ っとわかりにくいと思うので,以下のコード例を見てみてください。 aggregate() 関数 1 aggregate(Q1_1 ~ education, dat, mean, na.rm = TRUE) 1 education Q1_1 2 1 1 4.419192 3 2 2 4.296000 4 3 3 4.581395 5 4 4 4.832370 6 5 5 4.953168 aggregate() 関数には何通りかの記法があるのですが,ここでは formula を使った記法で 紹介します*7 。もともと formula は回帰分析の式(𝑦 = 𝑏1 𝑥 + 𝑏0 )に合わせた形で,左辺に被 説明変数,右辺に説明変数を書くという R 特有の記法の一つです。aggregate() 関数では, この記法を利用して左辺に計算対象の変数名,右辺にグルーピング対象の変数名を書き,その 後ろに「どのデータについて実行するか」 「どの関数を実行するか」をそれぞれ書いていきま す。したがって aggregate(Q1_1 ~ education, dat, mean, na.rm=TRUE) を書き下す ならば, 「dat について,education の値ごとにグループを作り,Q1_1 の mean(na.rm=TRUE) を計算してくれ」という指示になります。 ちなみに aggregate() では,複数の属性について同時にグルーピングを行い関数を適用す ることも出来ます。この場合,回帰分析の説明変数を追加する要領で,右辺に変数名を足し *7 17 formula 記法は回帰分析や SEM のところでガンガン使用するので,少しでも慣れておくと良いでしょう。
4.2 項目分析 ていくだけで OK です。ここでは使いませんが,以下のように「gender×education ごと の平均点」といった計算も可能です。 複数属性で aggregate() 1 aggregate(Q1_1 ~ education + gender, dat, mean, na.rm = TRUE) 1 education gender Q1_1 2 1 1 1 4.146341 3 2 2 1 4.195652 4 3 3 1 4.184818 5 4 4 1 4.475000 6 5 5 1 4.577778 7 6 1 2 4.612069 8 7 2 2 4.354430 9 8 3 2 4.737047 10 9 4 2 5.022124 11 10 5 2 5.175439 話を戻すと,今やりたいことは「各グループについて,特定の項目への回答の平均値を出す」 でした。aggregate() を使えば,以下のように実装することが出来ます。 グループ平均値を出す 1 group_mean <- aggregate(Q1_1 ~ group_A, dat, mean, na.rm = TRUE) 2 group_mean 1 group_A Q1_1 2 1 1 1.250000 3 2 2 2.476190 4 3 3 2.937500 5 4 4 3.154545 6 5 5 3.412281 7 6 6 3.801858 8 7 7 4.271084 9 8 8 4.527216 10 9 9 5.262295 11 10 10 5.821596 あとはこれをプロットするだけです。 平均値のトレースラインの作成 1 plot(group_mean) group_mean には 2 つの変数が入っているので,これで散布図が書けると思ったのですが, なんだか思ってたのとはちょっと違う図(4.12)が出てきました。実はこれは,aggregate() 18
2
3
Q1_1
4
5
6
4.2 項目分析
1
2
3
4
5
6
7
8
9
10
group_A
図4.12
トレースライン?
関数によってグルーピングされた変数の列が numeric 型ではなく factor 型になってしま
っているためです。
1
str(group_mean)
1
'data.frame':
10 obs. of
2 variables:
2
$ group_A: Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
3
$ Q1_1
: num
1.25 2.48 2.94 3.15 3.41 ...
R ではこのように,関数の挙動によって想定していたものと異なる型の変数に勝手に置き換
わってしまうことがちょくちょくあるので,ここは逃げずにきちんと変数の型を変更してか
ら再度プロットしましょう*8 。
型を修正してから再度プロット
1
group_mean$group_A <- as.numeric(group_mean$group_A)
2
plot(group_mean)
これでほぼ完成です(図4.13)
。もう少しトレースラインっぽくするならば,以下のように引
数 type を与えてあげましょう(図4.14)。
plot() の引数 type
1
plot(group_mean, type = "b")
引数 type として良く用いられるのは,p(点をうつ)
,l(線で結ぶ)
,b(p と l を両方)
,n
(何も表示しない)あたりでしょうか。他にも plot() には「線の太さ・色・形」「点の大き
*8
19
そして関数の挙動が思った通りにならない場合は,変数の型の間違いを疑うのも一つの手だということです。
2 3 Q1_1 4 5 6 4.2 項目分析 2 4 6 8 10 group_A トレースラインっぽくなってきた 2 3 Q1_1 4 5 6 図4.13 2 4 6 8 10 group_A 図4.14 トレースラインの完成 さ・色・形」 「軸の名前」 「図の上部に表示する名前」 「目盛りの大きさ」を始めとして様々な 設定が可能ですが,ここでは取り上げません*9 。 【おまけ 1】こういうときこそ関数化 トレースラインを作成する方法はわかりましたが,実際にはこの作業を項目の数だけ行う必 要があります。一つ一つの工程はシンプルですが,いちいち複数の工程をこなす必要があり, 結構面倒ですよね。こういったときこそ,同じ作業を関数化することを考えてみましょう。 以下に,トレースライン作成のコードを関数化するための(私なりの)手順を紹介しておき *9 20 以前も紹介しましたが,発表や論文用に図を作る場合は,ggplot2 というパッケージがおすすめです。plot() はあくまでもサッと図を作る用,と思っておくと良いと思います。とはいえもちろん plot() を駆使してき れいな図を作ることも可能です。お好きな方法を選んでください。
4.2 項目分析 ます。 関数化する場合も,最初は普通にコードを作成します。ということで,先程紹介したトレー スライン作成のコードを以下にまとめて示しておきます。 トレースラインの作り方 1 # 1. 合計点で10個にグルーピングしたものをdatに追加する 2 dat$group <- cut(dat$Q1_A, breaks = 10, labels = 1:10) 3 # 2. ある項目について,グループ平均値を出す 4 group_mean <- aggregate(Q1_1 ~ group, dat, mean, na.rm = TRUE) 5 # 3.1 factor型になっているところをnumericまたはinteger型に修正する 6 group_mean$group <- as.numeric(group_mean$group) 7 # 3.2 プロットする 8 plot(group_mean, type = "b") 次に,このコードのうち変わる部分はどこかを考えます。上記のコードでいえば, 「どの項目 についてトレースプロットを描くか」と「どの合計点(A,C,E,N,O)を使うか」の 2 点が変わ るところです。そこで,この「変わる部分」を一旦変数に代入します。 変数に置き換える 1 # データフレームの中の変数名を指定したい場合はchr型が一般的 2 # トレースプロットを描きたい変数 3 x <- "Q1_1" 4 # 合計点 5 total <- "Q1_A" そして,作成した変数 x, total を使って先程のコードを置き換えていきます。 変数 x, total に置き換える 1 # 列をdat$の代わりにchr型で指定する 2 # 1. 合計点で10個にグルーピングしたものをdatに追加する 3 dat$group <- cut(dat[, total], breaks = 10, labels = 1:10) 4 # 2. ある項目について,グループ平均値を出す 5 group_mean <- aggregate(x ~ group, dat, mean, na.rm = TRUE) 6 # 3.1 factor型になっているところをnumericまたはinteger型に修正する 7 group_mean$group <- as.numeric(group_mean$group) 8 # 3.2 プロットする 9 plot(group_mean, type = "b") 実際にやってみるとわかりますが,実はこのままではうまくいきません。 aggregate() でエラーが発生する 21 1 # 1. 合計点で10個にグルーピングしたものをdatに追加する 2 dat$group <- cut(dat[, total], breaks = 10, labels = 1:10) 3 # 2. ある項目について,グループ平均値を出す
4.2 項目分析
4
aggregate(x ~ group, dat, mean, na.rm = TRUE)
1
Error in model.frame.default(formula = x ~ group, data = dat): variable
lengths differ (found for 'group')
というのは,aggregate() 関数の第一引数を formula として与える場合,Q1_1 ~ group
のように “ “でくくらない(character 型ではない)必要があります。しかし,x <- "Q1_1"
を用いて x ~ group を書き換えると,"Q1_1" ~ group となってしまうために,正しく
formula として解釈されないのです。
この場合の対処法は,formula() 関数を用いることです。例えば以下のように,第一引数に
formula() 関数を噛ませた character 型(文字列)として与えることで,文字列のまま正
しく機能させることが出来ます。
formula() 関数を使う
1
# 元のコード
2
aggregate(Q1_1 ~ group, dat, mean, na.rm = TRUE)
1
group
2
1
1 1.250000
3
2
2 2.476190
4
3
3 2.937500
5
4
4 3.154545
6
5
5 3.412281
7
6
6 3.801858
8
7
7 4.271084
9
8
8 4.527216
10
9
9 5.262295
11
10
10 5.821596
1
# 同じ結果になる
2
aggregate(formula("Q1_1 ~ group"), dat, mean, na.rm = TRUE)
1
22
Q1_1
group
Q1_1
2
1
1 1.250000
3
2
2 2.476190
4
3
3 2.937500
5
4
4 3.154545
6
5
5 3.412281
7
6
6 3.801858
8
7
7 4.271084
9
8
8 4.527216
10
9
9 5.262295
4.2 項目分析
11
10
10 5.821596
ということで,先程のコードを更に書き換えていきます。
formula() 関数を使う
1
# 列をdat$の代わりにchr型で指定する
2
# 1. 合計点で10個にグルーピングしたものをdatに追加する
3
dat$group <- cut(dat[, total], breaks = 10, labels = 1:10)
4
# 2.1 formulaの文字列を作る
5
fml <- paste0(x, " ~ group")
6
# 2.2 ある項目について,グループ平均値を出す
7
group_mean <- aggregate(formula(fml), dat, mean, na.rm = TRUE)
8
# 3.1 factor型になっているところをnumericまたはinteger型に修正する
9
group_mean$group <- as.numeric(group_mean$group)
10
# 3.2 プロットする
11
plot(group_mean, type = "b")
これでようやく完成です。うまくできていれば,図4.14と同じトレースラインができるはず
です。
最後に,「変わる部分」を引数として,このコードをまるごと関数に入れてしまいましょう。
コメントは残しておくとあとあと見返したときにわかりやすいのでおすすめです。
自作関数を作る
1
traceline <- function(x, total) {
2
# 1. 合計点で10個にグルーピングしたものをdatに追加する
3
dat$group <- cut(dat[, total], breaks = 10, labels = 1:10)
4
# 2.1 formulaの文字列を作る
5
fml <- paste0(x, " ~ group")
6
# 2.2 ある項目について,グループ平均値を出す
7
group_mean <- aggregate(formula(fml), dat, mean, na.rm = TRUE)
8
# 3.1 factor型になっているところをnumericまたはinteger型に修正する
9
group_mean$group <- as.numeric(group_mean$group)
10
# 3.2 プロットする
11
plot(group_mean, type = "b")
12
}
実際に,作成した traceline() 関数を使うと,以下のように簡単に様々な変数のトレース
ラインを描くことが出来ます。
自作関数を使うぞ
1
traceline("Q1_16", "Q1_N")
関数化する必要があるのは,トレースラインの作成のように,同じような処理を繰り返す必
要がある場合です。同じ処理を何度も書いてしまうと,あとから修正を加えた際に一部だけ
23
4 3 1 2 Q1_16 5 6 4.2 項目分析 2 4 6 8 10 group 図4.15 traceline() 関数 修正して,残りを修正し忘れる,といって面倒が発生してしまいます。コードの保守や可読 性の観点から,同じような処理はなるべく繰り返し記述しないようにすることが望ましいわ けです。このルールは,プログラミングの世界では,よく DRY(Don’t Repeat Yourself) 原 則と呼ばれたりしています。 ということで,関数化の手順をまとめると,以下のようになります。 1. まずは愚直にコードを書く 2. 繰り返しにおいて変わる場所を変数に置き換える 3. うまく動くように必要に応じてコードを修正する 4. function() 関数を使って関数を作成する 特に 3. の部分に関しては,毎回どのようなエラーが発生するかは分かりません。したがって, R の経験値が重要になってきます。同じ結果をもたらす処理の書き方が複数通り存在すると いうことを知っていることで,解決策が見いだせるかもしれないのです(traceline() の例 の場合,データフレームの列名指定は $ ではなく character 型を使った方法の可能である ことや,formula の指定時に character 型に formula() を噛ませる方法もあるいうこと) 。 【おまけ 2】選択肢ごとのトレースライン 一応,以下に「選択肢ごとの選択率のトレースライン」のコード例を載せておきます*10 。た だ心理尺度の項目分析の場合はここまでやらなくても良いかもしれません。 選択肢ごとのトレースラインの作成 24 1 # 今回は10群に分けてやってみる 2 group_A <- cut(dat[, "Q1_A"], breaks = 10) 3 # グループごとに合計点の平均値を出す(X軸用) *10 【おまけ 1】の考え方からすると,もっと関数化してシンプルに書くことも可能です。もし暇なら,どのくら いコード量で作成できるか挑戦してみてください。
4.2 項目分析
4
group_mean <- aggregate(Q1_A ~ group_A, dat, mean, na.rm = TRUE)
5
# 各選択肢のグループごとの選択率を出すために関数を作る
6
# ↓ベクトルの中で値がkの割合を計算する関数
7
prop_k <- function(vec, k) {
8
9
mean(vec == k)
}
10
# 選択肢1のグループごとの選択率を出す
11
# 一時的な(無名)関数の定義を利用する
12
group_prop1_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 1)
13
# 他の選択肢についても
14
group_prop2_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 2)
15
group_prop3_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 3)
16
group_prop4_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 4)
17
group_prop5_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 5)
18
group_prop6_item <- aggregate(Q1_3 ~ group_A, dat, prop_k, 6)
19
# X軸はグループごとの「合計点」の平均値
20
# Y軸は各選択肢のグループごとの選択率
21
# type="n"とすると,何も表示しない=枠だけ作る
22
plot(x = c(min(group_mean$Q1_A), max(group_mean$Q1_A)), y = c(0, 1),
type = "n", xlab = "グループ平均値", ylab = "選択率")
23
# 選択肢ごとに線と点を別々に描き足していく
24
# 選択肢1
25
lines(x = group_mean$Q1_A, y = group_prop1_item$Q1_3) # 線
26
points(x = group_mean$Q1_A, y = group_prop1_item$Q1_3, pch = "1") # 点
27
# 選択肢2
28
lines(x = group_mean$Q1_A, y = group_prop2_item$Q1_3) # 線
29
points(x = group_mean$Q1_A, y = group_prop2_item$Q1_3, pch = "2") # 点
30
# 選択肢3
31
lines(x = group_mean$Q1_A, y = group_prop3_item$Q1_3) # 線
32
points(x = group_mean$Q1_A, y = group_prop3_item$Q1_3, pch = "3") # 点
33
# 選択肢4
34
lines(x = group_mean$Q1_A, y = group_prop4_item$Q1_3) # 線
35
points(x = group_mean$Q1_A, y = group_prop4_item$Q1_3, pch = "4") # 点
36
# 選択肢5
37
lines(x = group_mean$Q1_A, y = group_prop5_item$Q1_3) # 線
38
points(x = group_mean$Q1_A, y = group_prop5_item$Q1_3, pch = "5") # 点
39
# 選択肢6
40
lines(x = group_mean$Q1_A, y = group_prop6_item$Q1_3) # 線
41
points(x = group_mean$Q1_A, y = group_prop6_item$Q1_3, pch = "6") # 点
心理尺度項目では,各選択肢は順序変数になっています。ということは良い項目の場合,
図4.16のように,各選択肢のピークが順番に並ぶはずです。もしも X 軸の値に関係なく「ど
ちらでもない」の選択率が高い,といった事があれば,その項目では潜在特性以外の何かし
らの理由で「どちらでもない」を選択している人が一定数いそうだ,ということを確認した
りはできると思います。
25
1 1 0.6 6 0.4 1 2 0.0 0.2 選択率 0.8 1.0 4.3 信頼性と妥当性の考え方 2 5 3 4 6 2 3 5 4 6 5 3 4 6 10 5 5 2 4 3 2 3 1 4 5 1 6 5 6 15 4 5 4 5 3 2 6 1 3 6 2 1 20 6 4 6 5 4 3 2 1 3 1 2 4 3 1 2 25 グループ平均値 図4.16 選択肢ごとのトレースラインの例(Q1_3) 学力テストの場合は,ふつう選択肢に順序関係はありません。したがって, 「どの選択肢が誤 答として良く働いているか」や「下位層が特に引っかかりやすい誤答選択肢がないか」など, 選択肢レベルでの詳細な検討を行うことが出来るわけです。 4.3 信頼性と妥当性の考え方 デジタル体重計を開発する場合には,必ず出荷前に品質チェックを行うでしょう。その内容 はきっと「10kg のおもりを載せた時にきちんと 10kg と表示するか」や「様々な環境下で測 定しても安定して同じ重さを表示できるか」といったものだと推測されます。 これと同じように心理尺度の開発においても品質チェックが重要になります。構成概念とい う目に見えないものを測定しようとする心理尺度の場合,そのチェックは難解を極めます。 例えば「10kg のおもり」のように客観的にみて正しいと証明されている基準がないことや, 通常複数の項目の集合で単一の構成概念を測定すること,測定の安定性を脅かす要因が多様 であることなどがあるために,完全な形での品質チェックはほぼ不可能と言っても過言では ありません。 測定の質は,大きく分けると妥当性 (validity) と信頼性 (reliability) という 2 つの概念のも とで議論されます。簡単に言うと,妥当性は「測定値が,測定しようとしている構成概念を 正しく表した値か」の程度です。例えば「デジタル体重計」という名前で身長を測定する機 械があったとすると,これは明らかに妥当性がありません。さすがに体重計と身長計を間違 えることは無いでしょうが,心理尺度の場合,なにせ構成概念が目に見えないので, 「外向性」 のつもりで作った尺度が実は「攻撃性」を測定していた,ということが起こる可能性はゼロ とは言えないのです。 一方,信頼性は「測定値が,一貫して同じ値を表しているか」の程度です。例えば同じ人な のに乗るたびに表示される値が変わる体重計があっても,その結果を信頼することは出来ま せん。心理尺度でも同じことが言えます。 妥当性と信頼性は完全に独立した概念ではありません。これらの関係性は,良く図4.17のよ うなダーツのアナロジーによって説明されます。赤いマル一つ一つがダーツの刺さった場所 26
4.3 信頼性と妥当性の考え方 を表していると考えてください。ダーツ本来の目的である「真ん中に当てる」ということが, 心理尺度でいう「測定しようとしている構成概念を測定する」に相当します。真ん中に近い ほど測定しようとしているものに近い,ということですね。 図4.17 ダーツのアナロジー 一番左は,信頼性も妥当性も低いパターンです。毎回あっちへ行ったりこっちへ行ったりで, 測定が全く安定していません。毎回ぜんぜん違う結果が出てくるので,特定の回で見ればた またま測定したい真の値に近い結果が出ることもあるかもしれませんが,結局いつ当たった かがわからない以上使い物にはならないでしょう。 真ん中は,信頼性は高いが妥当性は低いパターンです。 「デジタル体重計」という名前で身長 を測定する機械があれば,これに該当するでしょう。毎回ほぼ同じ値を返してくるが,毎回 「測定しようとしているもの」とは異なる値を返している,という状態です。この場合は,元 々想定していた名前の尺度としては使えないかもしれませんが,もしこの尺度が本当は何を 測定していたかがわかれば, (マト自体をうごかしてやることで)別の尺度としては使えるよ うになるかもしれません。 一番右は,信頼性も妥当性も高いパターンです。この状態に持っていくことができれば,い つどこで測定しても安定して「測定しようとしている構成概念」を測定できるため,安心し て心理尺度を利用することが出来ますね。 ということで,心理尺度を作成・利用する際には,信頼性も妥当性も高くないといけないと いうことがわかりました。また,ダーツのアナロジーからは信頼性は妥当性の必要条件だと いうことがわかります。つまり「妥当性が高いのに信頼性が低い」というケースはあり得な い,ということです。 また,妥当性・信頼性を考える際に注意しなければいけないのは,妥当性・信頼性は尺度自 体が持つ性質ではなく,尺度得点に関する性質として評価されるという点です (Streiner and Norman, 2008)。初回の資料では,心理尺度が翻訳や時代の変化によって変質してしまう危 険性を指摘しました。つまり,ある集団において「良い」と判断された尺度があったとして も,それが自分の集めたサンプルについても「良い」尺度であるかどうかはわからない,とい うことです。したがって,先行研究ですでに妥当性や信頼性が検証済みの尺度を利用する場 合でも,基本的には自分で集めたデータにおける妥当性・信頼性は改めて評価する必要があ ると言えるでしょう。もちろん,先行研究で検証に使用されたサンプルの母集団と,自分が 27
4.4 妥当性の検証 利用するデータの母集団が(測定したい内容に関して)概ね同じであることが示せるならば いちいち再評価する必要はありません。まとめると,どこかから尺度を探して利用する場合 には,妥当性・信頼性は改めて評価する必要があるかよく考える必要があるということです。 それでは,ここからは具体的に妥当性・信頼性を検証するための方法について見ていきまし ょう。 4.4 妥当性の検証 妥当性の考え方は,未だにちょくちょく変化しています。その歴史的な変遷については例え ば村山 (2012) やStreiner and Norman (2008) などが詳しいですが,妥当性の考え方自体に トレンドのようなものがあり,「これぞ」という万人が納得できる答えはまだ見つかってい ません。そしてこのあたりの話は哲学チックなため,ここでは深く取り上げないことにして, まずは現代の妥当性の主流となっていると思われるMessick (1995) の考え方を紹介します。 4.4.1 妥当性の考え方 もともと心理学界隈では,妥当性にはいくつかのタイプが存在すると考えられていました (村山, 2012)。 1つ目は基準連関妥当性 (Criterion-related Validity) です。これは,ある尺度によって測 定された得点が,すでにその効果を認められている外的な基準とどの程度相関しているかに よって評価されます。何かを測定するための方法が確立しているが測定自体が大変(お金や 時間がかかる,などの)ときに,それよりも簡便な方法で同じものが測定できたら嬉しい,と いう考えが背景にあります。例えば認知症の診断を行う場合には,MRI を撮って脳の萎縮度 を見ればほぼ確実な診断ができますが,これには相当なお金がかかってしまいます。もしも これが,認知機能を測るいくつかの質問項目でほぼ同等の診断ができるとしたら,とても嬉 しいわけです。つまり,基準連関妥当性では,尺度を別の測定の代理変数 (proxy) として考 えている節がありそうです。 2つ目は構成概念妥当性 (Construct Validity) です。基準連関妥当性の考え方と比べると, 構成概念妥当性では,ある尺度によって測定された得点を,その背後にある構成概念の顕在 化した指標という感じで考えます。そして,構成概念の世界において理論的に導出される仮 説に合致する結果が得られた場合に,「確かにその尺度は想定していた構成概念を測定する 尺度なんだ」と言えるわけです。例えば「きょうだいの数」が多いほど大人になったときの 「外向性」が高い,というナントカ理論が存在したとします。このとき, 「外向性」を測定する ために作成した(がまだ本当に外向性を測定できているかわからない)尺度の得点と「きょ うだいの数」に強い正の相関が見られたとしたら,この尺度はたしかに「外向性」を測定出 来ている気がしてきます。もちろん,このたった一つの結果だけで尺度の妥当性が示せるわ けではないですが,このような要領で,構成概念の世界において理論的に導出される様々な 仮説を一つ一つ検証していくことで,その尺度が「もともと測定したかったもの」を表して いる可能性が高められていくわけです。属に「収束的妥当性 (Convergent validity)」や「弁 別的妥当性 (Discriminant validity)」と呼ばれるものは, 「相関が高い(低い)構成概念の間 では,それらを測定する尺度同士の得点も相関が高い(低い)はず」という構成概念妥当性 28
4.4 妥当性の検証 の考え方にもとづいたものです。 3つ目は内容的妥当性 (Content Validity) です。これは,構成概念妥当性と同様に,ある尺 度は特定の構成概念を測定するためのものとして考えます。ですが,内容的妥当性では「他 の構成概念との関係」などではなく,その尺度自体の内容から妥当性を判断します。具体的 には尺度の項目セットが,構成概念が指し示すあらゆる現象の全体からまんべんなく・過不 足なくサンプリングされたものであれば「内容的妥当性が高い」と判断することが出来ます。 例えば「高校数学の理解度」を評価するための(大学入試の)数学のテストでひたすら連立 方程式問題ばかりが出題されたとしたら,これは「高校数学の理解度」と言うよりは「連立 方程式の理解度」になってしまいます。このような場合には,内容的妥当性が低いと判断さ れてしまうわけです。 以上のように,妥当性には基準連関妥当性,構成概念妥当性,内容的妥当性の3つのタイプ がある,と長らく考えられてきました。しかしこの考え方は一方で「この3つの妥当性をそ れぞれクリアしたら良いんだな」というように,妥当性検証のプロセスをスタンプラリー化 してしまった (Landy, 1986) といった批判を生み出してしまいます。 こうした批判を踏まえてMessick (1995) は,妥当性とは「構成概念妥当性」そのものである という主張をしました。つまり妥当性を「尺度得点の意味や解釈に関する様々な証拠を統合 したもの」と定義したわけです。ここで重要なのは,妥当性が尺度得点をつかって行う解釈 や推論がどれだけ信頼できるものかを表すための指標として考えられている点です。そして この定義に従うと,基準連関妥当性や内容的妥当性はいずれも, (構成概念)妥当性を示す傍 証の一つとして考えることが出来ます。その意味で,これらは妥当性の「基準連関的証拠」 や「内容的証拠」と呼ばれることがあります。 Messick の考え方では,妥当性の証拠としてどのようなものが重要視されるかは,尺度の目 的などによって変わります。例えば「同じ構成概念を少ない項目数で測定したい」という短 縮版尺度の目的からすると,元の尺度との相関によって示される「基準連関的証拠」が重要 になるでしょう。一方で,学力テストのように総合的な能力を評価したい尺度では,専門家な どによって内容的側面の評価が重要になるはずです。このように,本来妥当性の評価は「お 決まりのパターン」があるわけではなく,目的と対象に応じて必要な証拠を収集していく作 業です*11 。 といった議論を踏まえて,ここからはアメリカ心理学会が発行している「テストスタンダー ド」(American Educational Research Association et al., 2011) に掲載されている妥当性の 証拠のパターンについて紹介したいと思います。 内容について 内容に関する証拠 (Evidence based on test content,内容的妥当性とも呼ばれる) は,デー タから確認するというよりも,尺度作成時の手続きに関する話です。構成概念および下位概 念の定義を明確にした上で,その定義を満たすと考えられる内容に関する項目をきちんと *11 29 まあそんなものは理想論なのかもしれません。妥当性の定義についても未だに議論は尽きません。重要なの は,先行研究のやり方が常に正しいと思うな,もっと良い妥当性の証拠はあるかもしれないぞと常に考え続 けることなのかもしれません…。
4.4 妥当性の検証 用意する必要があり,その手続きに関して論文などの中での説明が求められます。いわゆる 「複数の専門家によって議論した」であったり,項目案を先行研究から引用したり,という話 は,この点をクリアするために必要な記述,というわけですね。 認知的なこと 回答過程に関する証拠 (Evidence based on response processes) は,回答者が各項目に対し て,作成者の想定していた通りに「測定しようとしている構成概念」のことを考えていたか, といった側面のことです。テストスタンダード内でもこの点に関する記述はかなり少なく, また実際の論文などでこの側面に関して妥当性検証を行っているものは見たことが無い(か なり少ない?)のですが,検証する方法として Cognitive interview(e.g., Beatty and Willis, 2007; Peterson et al., 2017) といった方法があるようです。例えば「回答中に,(構成概念) についてどのようなことを考えていましたか?」と言った内容を事後的にインタビューする 方法のようです。かなり大変そうですね… 内部構造 内部構造に関する証拠 (Evidence based on internal structure,因子妥当性とも呼ばれる) は,いわゆる「因子構造」のことを指していると思われます。事前に因子の構造(下位概念) について仮定を置いて項目を作成した場合には,因子分析をした結果,項目が想定通りの分 かれ方をしていれば良さそうな気がする,ということです。この視点に関連する分析(因子 分析)の結果を「妥当性の証拠」という位置づけで提示する研究は心理学ではあまり見られ ないですが,マーケティング系などでは割と用いられている気もします*12 。「構成概念をこ う定義して,下位概念としてこれとこれがあると考える」という仮定のもとで,項目が実際 に下位概念と適合する形で分かれるようであれば,妥当性の傍証にはなりそうです*13 。 また,もしも特定の属性の人では異なる挙動を示す項目(特異項目機能;DIF, Differential Item Functioning)や尺度があったとすると,これは妥当性を脅かす要因の一つになりえま す。DIF の対象となりうる属性の例としては,年齢や性別,人種や宗教など様々なものが考 えられます。DIF が発生しそうな項目の例も挙げておきましょう。例えば「他者に助けを求 める傾向」という尺度の中に「苦しいときには神に祈る」という項目があったとします。項 目作成者としては「他者に助けを求める傾向が強いほど,神にもすがるようになるだろう」 という感覚で項目を作成したとしても,実際にはたぶん宗教観によってその回答は大きく変 わるでしょう。本来,尺度項目への回答は想定される構成概念(因子)の強さのみによって 規定されるべきですが,DIF がある場合にはこれに加えて特定の属性が影響を与えていると 考えられます。すなわち,その特定の属性が意図していなかった因子として因子構造に混ざ ってしまっている,という状態です。先程の例で言えば,その項目だけが「他者に助けを求 める傾向」と「宗教観」という 2 つの因子の影響を受けてしまっている,ということになり, これは当初想定していた因子構造から逸脱してしまっている状態です。こういったことがな いかを確認するために,分析の際にはデータを属性ごとに分割してそれぞれで分析を行った *12 因子分析や SEM の結果から CR や AVE と言われる指標を算出し,これが所定の値より高いことをもって 「収束的妥当性が示された」という書き方をしているものがちょくちょく見られます。 *13 もちろん,下位概念の構造を含めてそっくりそのままコピーしたような別の構成概念が存在している可能性 は否定できません。つまり CR や AVE だけで満足しているものは正直言うと「不十分」だと思っています。 30
4.5 信頼性の検証 り,SEM の枠組みの中で多母集団同時分析を行ったりするわけですね。 他の変数との関係 他の変数との関係に関する証拠 (Evidence based on relations to other variables,基準連関 妥当性とも呼ばれる) は,たぶん妥当性検証の中では最もよく提示される証拠です。概念的 に関連があると考えられる別の尺度や指標との相関が高いこと(収束的証拠)や,概念的に 関連がないと考えられるものとの相関が低いこと(弁別的証)をもって,妥当性の証拠とし ます。 先程説明した通り,比較対象の変数は,心理尺度に限りません。例えば「外向性」の妥当性 検証であれば,「SNS の友だちの数」や「直近 1 年で何回パーティーに行ったか」といった 行動指標なども考えられるでしょう。むしろ心理尺度どうしの相関では,両方の変数の誤差 項には共通の「自己申告によるバイアス」が含まれることで,誤差項同士が相関してしまう 可能性があります。その結果,本当の相関よりも過大に推定されてしまうかもしれません (common method bias, Podsakoff et al., 2003)。そういった意味で,心理尺度以外の変数 (特に行動指標)との関連を考えてみるのも良いでしょう。 また,「予測」という観点でもこの妥当性は重要な意味を持ちます(予測的妥当性)。例えば 入社試験での性格検査は, 「外向的な性格のひとだから営業に配属しよう」的な意思決定を行 うために利用されているかもしれません。言い換えると,この性格検査には,最もパフォー マンスが良くなる配属先を予測する機能が求められていることになります。この場合,性格 検査が「測定しようとしている構成概念を測定できている」ことよりも, 「それによって将来 のパフォーマンスが予測できている」ことのほうが重要になります。この場合,やることと しては尺度得点と「1 年後の営業成績」の相関を見るということで,やることは先程と同じ ですが妥当性の観点は異なっていたりします。 まとめ 妥当性を検証する最良の方法,というものは見つかっていません。というか多分一つに決め るのは不可能です。したがって,上に紹介したような妥当性検証の方法についても,お決ま りのルーティーン実行したら十分(スタンプラリー)というわけではなく,可能であれば複 数の観点から検証した上で「これだけ証拠が出揃ってるんだからいいだろう」的なスタンス で行くことが望ましいですね。 4.5 信頼性の検証 信頼性は,妥当性よりも統計的に評価することが出来ます。そのために,古典的テスト理 論 (Classical Test Theory [CTT]; Lord and Novick 1968) に基づく以下のモデルを考え ます。 𝑥=𝑡+𝑒 (4.2) (4.2)式において,𝑥 は実際に観測される得点を,𝑒 は測定誤差を表します。そして 𝑡 は真値 と呼ばれます。言い換えると 𝑡 こそが「測定しようとしている構成概念」を直接的に反映し た値である,ということです。理想的には,真値 𝑡 のみによって回答値が決まれば良いので 31
4.5 信頼性の検証 すが,それに対して何らかの測定誤差が混ざることで,実際に観測される得点が決まる,と いう状況を仮定しています。 このモデルにおける重要な(そして自然に受け入れられる)仮定として,真値と測定誤差は 無相関ということが置かれます。したがって,観測値 𝑥 の分散は 𝜎𝑥2 = 𝜎𝑡2 + 𝜎𝑒2 (4.3) というように,真値と測定誤差の分散の単純な和として表すことができます。このとき,信 頼性係数 𝜌 は 𝜌= 𝜎𝑡2 𝜎𝑒2 = 1 − 𝜎𝑥2 𝜎𝑥2 (4.4) と表すことができます。つまり,観測変数の分散に占める真値の分散の割合ということです。 もちろん実際に知ることができるのは観測値の分散 𝜎𝑥2 だけであり,真値の分散 𝜎𝑡2 を知るこ とはできません。 以下で紹介する信頼性係数の求め方は,このような仮定のもとで,信頼性係数 𝜌 を直接求 めようとしています。いくつかの方法があるのですが,測定誤差として何を取り上げている かが方法によって異なるので,その点には少し注意が必要です。なお,ここから先の説明に ついては 岡田 (2015) を拝借しています。 妥当性の定式化 (4.3) 式の要領で妥当性を定式化する方法も一応存在しています。CTT では,観測得 点を「真値」と「誤差」に分解していましたが,このうち「誤差」をより詳細に見て いくと,「系統誤差 (systematic error)」と「偶然誤差 (random error)」に分けるこ とが出来ます (Maruyama and Ryan, 2014)。 系統誤差とは,繰り返し測定を行った場合に測定値を常に一定方向に動かすような誤 差です。例えば体重計が壊れていて常に実際の体重よりも 5% 大きな値を表示してし まう場合を考えてみます。この体重計では,同じ人が何回乗っても必ず実際の体重よ り少し大きな値が出てしまっているわけなので,これは系統誤差にあたります。 一方偶然誤差とは,繰り返し測定を行った場合に測定値が毎回ランダムに変動してし まうような誤差です。体重計で言えば,「乗るたびに表示される値が変わる」程度を 指しています。 ポイントは,真値と偶然誤差が無相関であるように,系統誤差と偶然誤差も無相関で 2 あるという点です。これを踏まえると観測値の分散は,系統誤差による分散 𝜎𝑆𝐸 と 2 偶然誤差による分散 𝜎𝑅𝐸 を用いて (4.3) 式からさらに以下のように分解することが 出来ます。 𝜎𝑥2 = 𝜎𝑡2 + 𝜎𝑒2 2 2 = 𝜎𝑡2 + 𝜎𝑆𝐸 + 𝜎𝑅𝐸 ここで信頼性の定義に立ち返ってみると,信頼性とは「測定値が,一貫して同じ値を 表しているか」の程度でした。この観点から言うと,常に同じだけ値をずらす系統誤 32
4.5 信頼性の検証 差は信頼性に影響がないことがわかります。したがって,信頼性は 𝜌= 2 2 𝜎𝑡2 + 𝜎𝑆𝐸 𝜎𝑅𝐸 = 1 − 𝜎𝑥2 𝜎𝑥2 と表すことが出来ます。一方で,妥当性は「測定値が,測定しようとしている構成概 念を正しく表した値か」の程度なので,系統誤差であってもそのズレは許容されませ ん。したがって,妥当性は 𝜌= 2 2 𝜎𝑆𝐸 + 𝜎𝑅𝐸 𝜎𝑡2 = 1 − 𝜎𝑥2 𝜎𝑥2 と表すことができるわけです。 (4.4) 式では,信頼性を観測変数の分散に占める真値の分散の割合として表しました。 しかし実際には真値と系統誤差は区別できないことが多いのです。例えば体重の真値 がわからないときに,ある体重計が「乗るたびに値が変わる」ことはわかっても, 「常 に 5% 大きな値を示している」ことを証明するのはかなり難しいでしょう。なのです が,信頼性の定義からすると,系統誤差の有無は実用上問題ではありません。そのた め,この後紹介する信頼性の評価方法においても,系統誤差は無視して扱っています。 (平行テスト法) はじめに,真の信頼性係数 𝜌 を求めるための「理想」のお話を少しだけしておきます。真の 信頼性係数 𝜌 を求めるためには,真値と誤差分散が同じ 2 つのテスト(平行テストと呼ぶ) を独立に実施する必要があります。平行テストがある場合,2 つのテスト得点 𝑥1 および 𝑥2 はそれぞれ 𝑥1 = 𝑡 + 𝑒1 𝑥2 = 𝑡 + 𝑒2 (4.5) と置くことが出来ます。この 2 つのテスト得点の共分散 𝜎𝑥1 𝑥2 は,真値と測定誤差は 無相関であり,また独立に実施しているならば異なるテストの真値と測定誤差も無相関 (𝜎𝑡,𝑒2 = 𝜎𝑒1 ,𝑡 = 𝜎𝑒1 ,𝑒2 = 0) になるはずなので, 𝜎𝑥1 ,𝑥2 = 𝜎(𝑡+𝑒1 ),(𝑡+𝑒2 ) = 𝜎𝑡,𝑡 + 𝜎𝑡,𝑒2 + 𝜎𝑒1 ,𝑡 + 𝜎𝑒1 ,𝑒2 = (4.6) 𝜎𝑡2 となり,結果的に真値の分散に一致します。また,誤差分散が同じであれば,2 つのテスト の得点の分散は一致する(𝜎𝑥2 1 = 𝜎𝑥2 2 = 𝜎𝑥2 )ため,真の信頼性 𝜌 は 𝜎𝑡2 𝜎𝑥2 𝜎𝑥1 ,𝑥2 = 𝜎𝑥1 𝜎𝑥2 𝜌= (4.7) = 𝑟𝑥1 ,𝑥2 ということで,2 つのテスト得点の相関係数に一致するため,理論上は計算可能となるわけ です。 33
4.5 信頼性の検証 再テスト法 ただ,真値と誤差分散が同じ 2 つのテスト・心理尺度なんていうものは,言い換えると内容 は異なるが平均点および分散が全く同じテスト・尺度ということであり,そう簡単には作れ ません。そこで,同じテスト・尺度を 2 回実施するという考えが浮かんできます。これなら ば,当然内容は全く同じなので平行テスト法の条件は満たされているといえます。 心理尺度の場合,この再テスト法でもそれなりに妥当に信頼性を測定できるような気がしま す。しいて言えば,2 回間隔をあけて同じ人に実施することのコストがかかりますが,それ さえクリアできれば…という感じです。 学力テストの場合,同じ問題のテストを 2 回実施するのはほぼ不可能です。出題がネタバレ しているテストならば,事前準備が容易なため 2 回目の方がほぼ確実に得点が高くなってし まうでしょう。ということで再テスト法もできそうにない,ときました。さてどうしようか… 折半法 1 回のテストで平行テストみたいなものを 2 つ用意するために,大昔には 1 つのテストを 2 つに分けるという考え方が用いられていました。1 つの尺度ならば,うまいこと半分に分け れば平行テストに見えなくもない気がします。この折半法では,2 つに分けたときのそれぞ れの得点の相関 𝑟𝑥1 ,𝑥2 について,スピアマン・ブラウンの公式にもとづいて,信頼性を 𝜌𝑠ℎ = 2𝑟𝑥1 ,𝑥2 1 + 𝑟𝑥1 ,𝑥2 (4.8) と計算します。 平行テスト法および再テスト法では,真値 𝑡 は尺度全体の真値を,誤差分散 𝑒 には尺度の 外側にある余計なものを想定していました。これに対して折半法での信頼性は,真値 𝑡 は尺 度の半分の真値(尺度の中で共通の成分)を,誤差分散 𝑒 には尺度の中の項目間(前半と後 半)で異なる成分を表している,と見ることが出来ます*14 。その意味では真の信頼性 𝜌 とは ちょっと意味合いが異なるのですが,ひとまず折半法によって,1 回のテストから信頼性係 数が求められるようになった,ということでこの方法が一時期スタンダードだったわけです。 ちなみに,折半法的な意味での信頼性は内的一貫(整合)性などと呼ばれたりします。 ただ,当然ですが折半法では尺度の分け方によって信頼性係数の値が変わってしまいます。 これは Science としてはあまりよろしくないですね。特に現代のコンピュータを使えば,全 ての分け方を試した上で最も高い値を示す分け方で信頼性を主張してしまうことも可能で しょう。これは良くないということで,全ての分け方で算出される 𝜌𝑠ℎ の平均値として, KR-20(Kuder and Richardson, 1937) と呼ばれる公式が提案されました。これならば分け 方の恣意性は無視できるようになります。ただし KR-20 は二値項目にしか適用できない公 式だったため,このままではリッカート式の尺度などには使えません。 *14 34 なおスピアマン・ブラウンの公式は,尺度の半分に対する信頼性 𝑟𝑥1 ,𝑥2 を補正することで,尺度全体での信 頼性を求めようとしています。その点はちゃんと気をつけています。
4.5 信頼性の検証 クロンバックの 𝛼 係数 現在最も広く用いられている 𝛼 係数 (Cronbach, 1951) は,クロンバックが KR-20 を多値項 目でも使えるように一般化したものです。𝑛 項目の尺度に対する 𝛼 係数の計算式は 𝑛 ∑ 𝜎𝑥2 𝑛 𝛼= (1 − 𝑖=12 𝑖 ) 𝑛−1 𝜎𝑥 (4.9) となっており,これが KR-20 と同様に全ての分け方で算出される 𝜌𝑠ℎ の平均値になってい ます。 𝛼 係数は今でも様々な論文で利用されているものですが,様々な批判もあります。 • 𝜌 の下界の一つであるため,ほぼ確実に 𝜌 を過小推定する*15 • 項目数が多いほど大きな値になりやすい=項目数の影響を受ける • 一次元性の指標とはいえない側面がある 3 点目については,図4.18(岡田, 2015) にあるように,実際には尺度が一次元ではなさそう な場合でも,𝛼 係数だけを見ていては判断できないケースがある,ということです。現在で も多くの論文が 𝛼 係数だけを見て「一次元性が確認された」などと供述していますが,実際 には 𝛼 係数は一次元性の必要条件にすぎず,もうすこし詳細な確認をすべきだと言えます。 そんな 𝛼 係数に変わって,現在では 𝜔 係数などの信頼性係数や,SEM に基づく方法,一般 化可能性理論と呼ばれる理論に基づく方法が提案されています。ただここで説明している余 裕と事前知識が不足しているため,後ほど因子分析の回において 𝜔 係数を紹介します。 とはいえ 𝛼 係数はまだ現役で使われている方法なので,ここでも 𝛼 係数の使い方を紹介して おきます。R では psych::alpha() という関数があります。今回のように一因子ではなく 複数の因子がある尺度の場合は,25 項目全てではなく各因子ごとに alpha() 関数を適用し, それぞれで出た値を報告するようにしましょう。 alpha 係数を計算する 1 # もしまだ読み込んでいなければ 2 # library(psych) 3 4 # 第一因子の5項目についてalpha() 5 # 残りの因子についても,コードは省略していますがチェックしておいてください。 6 alpha(dat[, paste0("Q1_", 1:5)]) 1 2 Reliability analysis 3 Call: alpha(x = dat[, paste0("Q1_", 1:5)]) 4 5 *15 35 raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r 一応,尺度全体において,項目レベルで (本質的) タウ等価(タウ,つまり真値が同じか,個人によらず一定 のズレがある状態)であれば,𝛼 係数は真値 𝜌 に一致するのですが,そうでない場合は,𝜌 を過小推定する ことが知られています。
4.5 信頼性の検証 図4.18 � 係数と一次元性 6 0.71 0.72 0.69 0.34 2.6 0.0092 4.6 0.91 0.35 7 8 95% confidence boundaries 9 lower alpha upper 10 Feldt 0.7 0.71 0.73 11 Duhachek 0.7 0.71 0.73 12 13 Reliability if an item is dropped: 14 raw_alpha std.alpha G6(smc) average_r S/N alpha se 15 Q1_1 0.73 0.74 0.68 0.41 2.8 0.009 0.0061 0.39 16 Q1_2 0.63 0.64 0.59 0.31 1.8 0.012 0.0167 0.30 17 Q1_3 0.61 0.63 0.57 0.30 1.7 0.013 0.0089 0.34 18 Q1_4 0.69 0.70 0.66 0.37 2.4 0.010 0.0155 0.37 19 Q1_5 0.66 0.67 0.62 0.34 2.0 0.011 0.0126 0.35 20 21 22 36 var.r med.r Item statistics n raw.r std.r r.cor r.drop mean sd 23 Q1_1 2432 0.59 0.58 0.39 0.32 4.6 1.4 24 Q1_2 2432 0.73 0.75 0.67 0.57 4.8 1.2 25 Q1_3 2432 0.77 0.77 0.72 0.60 4.6 1.3
4.5 信頼性の検証 26 Q1_4 2432 0.67 0.64 0.49 0.41 4.7 1.5 27 Q1_5 2432 0.69 0.70 0.60 0.50 4.5 1.3 28 29 Non missing response frequency for each item 30 1 2 3 4 5 6 miss 31 Q1_1 0.03 0.08 0.12 0.14 0.30 0.33 0 32 Q1_2 0.02 0.05 0.06 0.20 0.37 0.32 0 33 Q1_3 0.03 0.06 0.07 0.20 0.36 0.27 0 34 Q1_4 0.05 0.08 0.06 0.16 0.24 0.41 0 35 Q1_5 0.02 0.07 0.09 0.22 0.35 0.25 0 出力を上から見ていきましょう。 【5-6 行目】 各種信頼性係数の指標です。基本的には最初の 2 つの alpha を見ておけば良 いですが,気になる人もいるかもしれないので解説しておきます。左から raw_alpha データの共分散行列から普通に計算した 𝛼 係数です。基本的にはこれを報告し ておけば OK です。 std.alpha 共分散行列の代わりに相関行列を用いて計算した 𝛼 係数です。つまり全ての項 目の得点の分散を 1 に統一するため,特に項目ごとに満点が一定ではないような場合 には raw_alpha と異なる値を出します。リッカート尺度の場合は満点は同じなので, raw_alpha でもどちらでも良いと思います。 G6(smc) 俗にガットマンの 𝜆6 (Guttman, 1945) と呼ばれる指標です。各項目について「そ れ以外の項目で重回帰分析した際の重相関係数」をもとに計算する指標です。重相関 係数が高いということは,その項目が「他の項目との相関が高い」ことを意味するた め,これも内的一貫性の指標になっています。が,𝛼 係数を報告しておけば十分です。 average_r 項目間相関の平均値です。5 項目ならば 5 𝐶2 = 10 通りの相関があり,その平 均値です。 s/n Signal/Noise 比です。上の average_r を 𝑟 とすると,𝑛𝑟/(1 − 𝑟) で計算されていま す。 ase 𝛼 係数の漸近標準誤差 (asymptotic standard error) だと思われます。 mean 項目レベルでの平均値です。 sd 項目レベルでの標準偏差です。 median_r 項目間相関の中央値です。 【8-11 行目】 95% 信頼区間です。どちらの方法でも別にかまわないですが,余裕があれば いずれかの信頼区間を報告するようにしましょう。 【13-19 行目】 1 項目を除外した時に各種指標がどう変化するかを表しています。今回の場 合,raw_alpha を見ると Q1_1 だけは 5 行目に表示されているものよりも高い値を示してい ます。つまりこの場合,統計的にはQ1_1 は除外したほうが内的一貫性は高まる,ということ です。ただ,実際にはこれを見て機械的に項目を除外するのではなく,内容面などを吟味し 37
4.5 信頼性の検証 た上で削除するかを決定しましょう。図4.19のように,特定の項目が他の項目と相関が低い としても,内容的にその項目が無いと構成概念の全要素をカバーしているとは言えなくなる ような項目であれば,除外せず残したほうが妥当性は高い可能性があります*16 。今回の場合 は,raw_alpha も大した改善ではないので,このまま残して分析を進めることにします。 図4.19 項目と構成概念の関係 【21 行目以降】 項目ごとの要約統計量および各カテゴリの選択率です。まあ,説明するこ とも無いでしょう。ちなみに,23-27 行目の一番左の raw.r はピアソンの積率相関係数とし て計算した場合の I-T 相関を指しています。 信頼性係数の基準 信頼性係数は,その定義から 0 ≤ 𝜌 ≤ 1 の値を取ります。直感的には,1 に近いほどよい感 じがしますね。実際に,平行テスト法や再テスト法的な意味での 𝜌 は,1 に近いほど良い指 標です。一方で,内的一貫性としての信頼性係数は,1 に近すぎるとかえって良くないとさ れています。というのも, 「内的一貫性」という言葉から想像できるように,𝛼 係数が 1 にな るのは全ての項目が全く同じものを測定しているような場合です。言い換えると,全ての項 目間の相関係数が 1 の場合になります。相関係数が 1 ということは,一方の値によってもう 一方の値が完全に説明可能な状態にあるため,実質的に 1 項目の回答だけわかれば尺度内の 残りの全項目の回答が分かってしまう状態です。つまり 1 項目だけあれば十分であり,尺度 として何項目も用意した意味がなくなってしまうことになります。本来,構成概念の多くは 普通に 1 項目で聞いただけでは十分に測定できないために,その構成概念を表す様々な側面 に関する質問を重ねることによって,その共通成分としてあぶり出そうとしています。それ なのに 1 項目分しか機能していないとしたら,それは尺度の失敗と言っても良いでしょう。 一方,最低でもどの程度の信頼性が欲しいかですが,これも一貫した答えはまだありません。 𝛼 係数について言えば,項目数の影響を受けるため,一概にどれだけあれば良い,という話は 出来ないはずです。世間では 0.7 だの 0.8 だの 0.9 だの言っている人がいるようですが,最 終的には信頼性も連続的な指標のため,明確な閾値を考えるよりは,ありのままの値を報告 するくらいの気持ちでいたほうが健全だと思います。…とはいいつつ「少なくとも 0.7 くら いは欲しいかなぁ」という個人的な気持ちもあったりしますが… *16 38 たぶんその場合は,下位概念を導入して複数因子の構造を考えるのが良いかもしれませんね。
4.5 信頼性の検証 最後に保存 1 39 saveRDS(dat, "chapter04.rds")
参考文献 参考文献 American Educational Research Association, American Psychological Association, and National Council on Measurement in Education (Eds.) (2011). Standards for educational and psychological testing. American Educational Research Association. Beatty, P. C. and Willis, G. B. (2007). Research synthesis: The practice of cognitive interviewing. Public Opinion Quarterly, 71(2), 287–311. https://doi.org/10.1093/po q/nfm006 Cronbach, L. J. (1951). Coefficient alpha and the internal structure of tests. Psychometrika, 16(3), 297–334. https://doi.org/10.1007/BF02310555 Guttman, L. (1945). A basis for analyzing test-retest reliability. Psychometrika, 10(4), 255–282. https://doi.org/10.1007/BF02288892 Kuder, G. F. and Richardson, M. W. (1937). The theory of the estimation of test reliability. Psychometrika, 2(3), 151–160. https://doi.org/10.1007/BF02288391 Landy, F. J. (1986). Stamp collecting versus science: Validation as hypothesis testing. American Psychologist, 41(11), 1183–1192. https://doi.org/10.1037/0003-066X.41. 11.1183 Lord, F. M. and Novick, M. R. (1968). Statistical theories of mental test scores. AddisonWesley. Maruyama, G. and Ryan, C. S. (2014). Research methods in social relations (eighth edition ed.). John Wiley & Sons Inc. Messick, S. (1995). Validity of psychological assessment. American Psychologist, 50(9), 741–749. https://doi.org/10.1037/0003-066X.50.9.741 村山航 (2012). 妥当性:概念の歴史的変遷と心理測定学的観点からの考察 教育心理学年報, 51, 118–130. https://doi.org/10.5926/arepj.51.118 岡田謙介 (2015). 心理学と心理測定における信頼性について――Cronbach の 𝛼 係数とは何な のか, 何でないのか―― 教育心理学年報, 54, 71–83. https://doi.org/10.5926/arepj.54.71 Peterson, C. H., Peterson, N. A., and Powell, K. G. (2017). Cognitive interviewing for item development: Validity evidence based on content and response processes. 40
参考文献 Measurement and Evaluation in Counseling and Development, 50(4), 217–223. https: //doi.org/10.1080/07481756.2017.1339564 Podsakoff, P. M., MacKenzie, S. B., Lee, J.-Y., and Podsakoff, N. P. (2003). Common method biases in behavioral research: A critical review of the literature and recommended remedies.. Journal of Applied Psychology, 88(5), 879–903. https: //doi.org/10.1037/0021-9010.88.5.879 Streiner, D. L. and Norman, G. R. (2008). Health measurement scales: A practical guide to their development and use (4th ed.). Oxford University Press. 41