03: データ作成と合成変数

Introduction

 今日は、前回扱った文字型変数の作成のもう一つの手法について説明します。また、合成変数の作成と信頼度について取り上げます。実際には、因子分析などを経て、合成変数を作成することが一般的ではありますが、今回の事例のように、データを直接足し合わせて合成変数を作成することもできます。その際には、信頼性の判断がカギとなります。

複数条件に基づいた変数の作成

前回で、|を使ったデータの作成の仕方について、学歴を例として以下のように書きました。  

jgss2012$educ <- NA
jgss2012$educ[jgss2012$xxlstsch == 1|jgss2012$xxlstsch == 2|
                jgss2012$xxlstsch == 3|jgss2012$xxlstsch == 8] <- "primary"
jgss2012$educ[jgss2012$xxlstsch == 4|jgss2012$xxlstsch == 5|
                jgss2012$xxlstsch == 6|jgss2012$xxlstsch == 9|
                jgss2012$xxlstsch == 10|jgss2012$xxlstsch == 11] <- "secondary"
jgss2012$educ[jgss2012$xxlstsch == 7|jgss2012$xxlstsch == 12|  
                jgss2012$xxlstsch ==13] <- "tertiary"

これでも、そのまま使えますが、何回も変数名のコピペをしないといけないという煩雑な作業があります。そこで、もっと簡単にやりたい場合には、%in%を使用します。この演算子は、簡単にいうと「含まれる」という意味です。

そこで、この演算子を使って、新しい変数を作成すると、こうなります。

jgss2012$educ <- jgss2012$xxlstsch #そのままxxlstschのデータをeducという変数にコピーする
jgss2012$educ[jgss2012$educ %in% c(1,2,3,8)] <- "primary"
jgss2012$educ[jgss2012$educ %in% c(4,5,6,9,10,11)] <- "secondary"
jgss2012$educ[jgss2012$educ %in% c(7,12,13)] <- "tertiary"
jgss2012$educ[jgss2012$educ %in% c(14, 99)] <- NA  

このように、学歴が%in%の後の数値のどれかと一致する場合、の後の文字列で入れ替わるという意味です。

また、それぞれの数値を事前に定義してから、%in%を用いることもできます。

primary <- c(1,2,3,8)
secondary <- c(4,5,6,9,10,11)
tertiary <- c(7,12,13)
na <- c(14, 99)
jgss2012$educ[jgss2012$educ %in% primary] <- "primary"
jgss2012$educ[jgss2012$educ %in% secondary] <- "secondary"
jgss2012$educ[jgss2012$educ %in% tertiary] <- "tertiary"
jgss2012$educ[jgss2012$educ %in% na] <- NA  

実行したら、データの確認をしましょう。

jgss2012$educ %>% 
  table()  

間違っていなければ、以下のようなテーブルが返ってくるはずです。  

primary secondary tertiary
809 2752 1085

以上、%in%の使い方でした(slack参照)。

合成変数と信頼性

JGSSのような社会調査を行う場合、ある構成概念を測定するために、複数の質問項目を設けることがあります。このような複数の項目を分析する際に、一つの尺度に統合してからの方が分析しやすく、結果の解釈もしやすくなります。このような変数を合成変数と呼びます。基本的に合成変数を作る際には、質問項目の結果の和を単純に足し上げるか、合計を項目数で割リます。

ここで考えないといけないことは、このいくつかの質問項目は、本当に同じ尺度について聞いているのかという項目の内部の一貫性の問題があります。これを統計的には、Cronbach α で判断します。このαは0から1までの値をとり、値が大きければ大きいほど、データ内部の内的一貫性が高いという意味です。これに関する具体的な説明を省きますが、出し方と判断の仕方について説明します。

ではまず、データの欠損値などの下処理や、逆転項目の処理を行います。データの処理などには、tidyversemutateなどを使ってご自身で行ってみてください。

では、まずCronbach αを算出するために、psychのパッケージを読み取ってください。まだ入れていないのであれば、インストールしてください。

library("psych")

今回は、例えば、sfmhpeac, sfmhengy, sfmhdprsの三つの変数を使って、合成変数を作成するとしましょう。データの下処理が完了したら、この三つのデータのみが含まれるサブセット・データを作ります。

#やり方1  
a1 <- c("sfmhpeac", "sfmhengy", "sfmhdprs")
a11 <- jgss2012[a1]  

#やり方2
a11 <- subset(jgss2012, select=c(sfmhpeac, sfmhengy, sfmhdprs))  

作成できたら、右のデータの部分に、a11という三つの変数があるデータセットが作成されているはずです。

サブセットができたら、alphaという関数を使って、Cronbach αを出してみましょう。

alpha(a11, check.keys = T)

Reliability analysis
Call: alpha(x = a11, check.keys = T)

raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.69 0.69 0.61 0.42 2.2 0.008 3.4 0.75 0.45

Reliability if an item is dropped:

raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
sfmhpeac 0.49 0.49 0.33 0.33 0.97 0.0149 NA 0.33
sfmhengy 0.62 0.62 0.45 0.45 1.63 0.0111 NA 0.45
sfmhdprs- 0.67 0.67 0.50 0.50 1.99 0.0098 NA 0.50

以上のような結果が返ってきます(一部省略)。ここでは、たまに下記のような警告が出てくる場合があります。

警告メッセージ:
alpha(a11, check.keys = T) で:
Some items were negatively correlated with total scale and were automatically reversed.
This is indicated by a negative sign for the variable name.

これは、逆転項目が反転されていないことを警告するものです。上の出力されたReliability if an item is droppedの部分をみてみれば、最後の変数名に**-**がついていることがわかります。これは、この変数が逆転していないことを示します。したがって、この変数の順序を逆にしましょう。

ただし、pyschパッケージのすごい点として、逆転項目を逆転作業していなくても、Cronbach αを算出する際には、自動的に逆転してくれます。そのため、返ってきたCronbach αの数値は、そのまま扱っても良いです。データを判断する時には、最初の返ってきた行をみてみましょう。

raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.69 0.69 0.61 0.42 2.2 0.008 3.4 0.75 0.45

ここの項目について、それぞれの意味は以下の通りです。

raw_alpha std.alpha G6(smc) average_r ase mean sd median_r
α係数 標準化されたα係数 ガットマンのラムダ6 項目間相関の平均値 αの標準誤差 平均 標準偏差 項目間相関の中位数

とりあえず、最初のraw_alphaをみて判断するのが良いでしょう。ここでは.69で、あまり高くはなかったですが、無理やり合成変数を作るというと作れるものでしょう。一般的には、.70以上で一貫性の高い尺度とみなされます。

また、この下にあるReliability if an item is droppedには、特定の変数を合成変数を作成する候補から落とした場合に、α係数がどのように変化するのかを算出しています。これを参照して、どのように合成変数を作成した方が良いかを判断する必要があります。

合成変数の作成には、実際にはさまざまな方法がありますが、以下は、変数の総和を変数数で割ったものです。もっともよく使われる方法です。

jgss2012 <- jgss2012 %>% 
  mutate(mentalhealth = (sfmhpeac + sfmhengy + sfmhdprs)/3)

以上で、今回の内容でした。
次回は、引き続き、データの処理によく使われるdyplrのパッケージの使い方について書きたいと思います。