不平等と異質性

Inequality and Heterogeneity: A Primitive Theory of Social Structure

Inequality and Heterogeneity: A Primitive Theory of Social Structure

 標題の本を題材として輪読会をするという噂を聞いて。

 Linの『Social Capital』でも引用されていたBlauの書。手に入るのかな……。

値のリコードとクロス表分析

 リコード作業に入る前に欠損値の指定をおこなう。SPSSでデータを作るとき、NAやDKに“9”や“99”を振ることが多い。分析の際、この“9”や“99”を必要に応じて欠損値扱いにする。Rでも“9”や“99”をそのままにしておくと普通の値として計算されてしまうので、欠損値であることを明確にしておく。

sex <- replace(d1$q1, which(d1$q1==9), NA)	# q1は性別
age <- replace(d1$q2, which(d1$q2==99), NA)	# q2は年齢	
vol <- replace(d1$q12, which(d1$q12==97), NA)	# q12はボランティア参加の程度
vol <- replace(vol, which(vol==99), NA)

 sex、age、volをデータフレームに追加。

d1 <- cbind(d1, sex, age, vol)

 欠損データをデータフレームから除去。

d2 <- na.omit(d1)


 リコードは群馬大学の青木先生が作成された関数を使って*1

age5 <- ctgr(d2$age, c(30, 40, 50, 60),	# 区切り値
             c("20代", "30代", "40代", "50代", "60代以上"))	# ラベル

 n個の区切り値でn+1個の区間に区切る。区切り値は区間の左端に含まれる。たとえば、volの値は1「積極的に参加している」から4「参加していない」の4分位なので

vol2 <- ctgr(d2$vol, c(4), c("参加している","参加していない"))

とすれば、1から3までと4のふたつの区間に区切られる(区切り値は4)。

 なお、この関数を使うとリコード後の変数は質的変数になる。carパッケージのrecode関数を利用すれば、連続変数のまま複数の値を統合することが可能。


 リコードしたage5とvol2をクロス集計する。

t1 <- table(age5, vol2)

 出力を確認。

> t1
          vol2
age5       参加している 参加していない
  20代               19            104
  30代               42            107
  40代               66            126
  50代              100            179
  60代以上          137            174

 セル度数だけだと分かりにくいので、周辺度数を追加。

t2 <- addmargins(t1, c(1, 2))
> t2
          vol2
age5       参加している 参加していない  Sum
  20代               19            104  123
  30代               42            107  149
  40代               66            126  192
  50代              100            179  279
  60代以上          137            174  311
  Sum               364            690 1054

 行%の計算は次のようにする。

t3 <- 100*prop.table(t1, 1)
> t3
          vol2
age5       参加している 参加していない
  20代         15.44715       84.55285
  30代         28.18792       71.81208
  40代         34.37500       65.62500
  50代         35.84229       64.15771
  60代以上     44.05145       55.94855

 カイ二乗検定

> chisq.test(t1)

        Pearson's Chi-squared test

data:  t1 
X-squared = 35.148, df = 4, p-value = 4.331e-07

 この\chi^2値をもとに、クラマーのVを計算。

 

だから

vnum <- 35.148	#分子
vden <- 1054*(2-1)	#分母
v <- sqrt(vnum/vden)

で求まる。

> v
[1] 0.1826123

 たいした手間ではないが、直接、クラマーのVを出せるコマンドがあったらいいな、と思っていたらこんなのを発見。

# クラマー係数を関数として定義
cr <- function(x) {
 if (dim(x)[1] > dim(x)[2] ) 
 return(sqrt(chisq.test(x)$statistic/sum(x)/(dim(x)[2]-1)))
 else return(sqrt(chisq.test(x)$statistic/sum(x)/(dim(x)[1]-1)))
 }

 簡単にV係数をえることができる。

> cr(t1)
X-squared 
0.1826122 

*1:関数は青木先生のページ(http://aoki2.si.gunma-u.ac.jp/R/recode.html)で公開されています。もとの関数の名前はrecodeですが、recodeという関数は他にもあるので、利用に際して関数名を変えさせていただきました。

SPSSのデータをRに読み込む

 SPSSのデータファイルをdat形式(タブ区切りのテキスト)で保存する。データは2006年兵庫県民調査のデータセット*1

SAVE TRANSLATE OUTFILE='D:\R\hyogo05.dat'
  /TYPE=TAB
  /MAP
  /REPLACE
  /FIELDNAMES
  /CELLS=VALUES.

 Excelでdatファイルを開いてデータを確認。使う変数がはっきりしている場合、このときにオートフィルタで欠損値を空白セルに置き換えておくとよい。

 データファイルをRに読み込む。

d1 <- read.delim("D:/R/hyogo05.dat", header=TRUE)

 欠損値を指定してファイルを読む込むときは、次のようにプログラムを書く。

d1 <- read.delim("D:/R/hyogo05.dat", header=TRUE, na.strings="#NULL!")
d2 <- na.omit(d1)

 「#NULL!」のセルをNA扱いにして、さらにNAがあるケースをデータフレームから除去する、という意味。欠損値を空白セルにしているのであれば、na.stringsの引数は要らない。

*1:兵庫県民調査の詳細は鵜飼孝造編,2007,『新しいコミュニティの構想――2006年兵庫県民調査報告書』(科学研究費補助金基盤研究(B)16330112)を参照されたい。

指定した値をシステム欠損値に置換するためのシンタックス

 SPSSのデータ上で欠損値として定義されている値を、いわゆる「システム欠損値」に置き換えるためのシンタックス。たとえばq13aという変数では「7」と「9」が欠損値に指定されているとする。この場合、まず欠損値の指定を解除したうえで、以下のシンタックスを実行する。

if (q13a = 7) or (q13a = 9) q13a = $sysmis.

 データビューを確認すると「7」と「9」の値が入っていたセルが空欄(「.」)になっているはずである。複数の変数をまとめて処理するときは次のシンタックスが便利。

do repeat a = q13b to q13e/
          b = q13b to q13e.
recode a (1 thru 4 = copy) (7 thru 9 = sysmis) into b.
end repeat.

 recodeとdo repeatの組み合わせ。こちらの方法でシステム欠損値に置き換える場合は事前に欠損値の解除をおこなう必要がない。

PISA2000の生徒データと学校データをマージ

 マニュアルやホームページでシンタックスが公開されていなかったので。

get file 'C:\PISA\Data2000\intscho.sav'.
sort cases by country subnatio schoolid.
save outfile='C:\PISA\Data2000\intscho.sav'.
get file='C:\PISA\Data2000\intstud_read.sav'.
sort cases by country subnatio schoolid.
match files file=* /table='C:\PISA\Data2000\intscho.sav'
  /by country subnatio schoolid.

 PISA2003用のプログラムとのちがいは"sort cases by"以下で"country"も指定しないといけないところ。2000データは2003データと"subnatio"コードの振り方にちがいがありケースをソートする際に"country"も参照しないとキーの重複が起きてしまう(ようだ)。

 日本のデータだけをとりだして別ファイルとして保存する場合、下記のコマンドを追加。

Select if cnt='JPN'.
Save outfile='C:\PISA\Data2000\2000R JPN_sch.sav'.

欠損データ

Missing Data (Quantitative Applications in the Social Sciences)

Missing Data (Quantitative Applications in the Social Sciences)

 アンケート調査における欠損データ(わからない、無回答)にどう対処したらよいのかについて、わかりやすく書かれた解説書。

 欠損データには「完全にランダムな欠損」(Missing Completely at Random)と「ランダムな欠損」(Missing at Random)、そして「無視できない欠損」がある。最後の「無視できない欠損」をいい加減に扱うと、パラメータの推定にゆがみが生じる。

 たとえば、英語のジャーナルを読んでいると、欠損データを平均値で置き換えて、置き換えをおこなったかどうかを示すダミー変数を投入する、という手続きをよく見かけるが、この方法で欠損データを処理すると、パラメータ推定値は「真」の値から大きくはずれたものになってしまう。

 欠損データを埋める効果的な方法として、マルティプル・インピュテーションとEMアルゴリズムを用いた方法が紹介されている。

 理論的には理解できるものの、いざ実践するとなると、ハードルがもう一段高くなるという印象を受けた。とりわけ「簡便な」方法ではなく、「効果的」だとされる方法にかんしては、SPSSを使って遂行するのは難しいようだ。大学のコンピュータに入っているソフトでできそうなのはSASとAmosか。