全変数の相関係数をcsvで書き出す

以前エントリしたhetcor関数を使った全変数の関連を把握する試みの続き。

ides.hatenablog.com

エントリを入れたときにはサンプルデータでやったのでうまくいったが、実際のデータでやってみたところ使いにくさを感じた。
困った点はは変数が多すぎると相関係数の表示が見にくく、かつ、全部表示されないというものだ。
改善を試みてみた。

実際に例をあげて述べていこう。
サンプルデータは以前と同じものを使用する。

library(AER)
data(CPS1985)
str(CPS1985) # データ構造の把握
r <- cbind(1, 2, 3, 4, 6, 7, 10, 11) # 連続と2値データのみ抽出
data <- CPS1985[,r]

CPS1985の変数は11なので、さほど問題が起きなかった。 しかし、社会学などでは変数が200以上というデータセットはそれほど珍しくない。最近扱ったデータセットもそういうものだった。 こういった場合、相関マトリックスの組み合わせが非常に多くなってしまう。

以前のエントリでは、printコマンドでテキストデータでをするようにしていたが、100以上変数があるとRStudioではすべて表示できないし、Rのコンソールでもすべて表示できず、表示が欠けてしまう。そもそも取り回しが非常に不便なのだ。

csv形式で書き出し

そこで、結果を外部に出力する方法を試みてみた。 相関行列の形式はデータ構造は行列(マトリックス)なので、csvなどの表計算ソフトで扱える形式にして出力することができる。

library(polycor)
het<- hetcor(data)
res <-het$correlations # 相関行列のみ取り出し
## print(res)

関連の高い相関係数のみを表示

ついでに結果を見やすくすることもしてみた。
相関係数なので、絶対値0.3以上の相関係数のみ残して、残りはNAを挿入した。そうすると関連の薄い項目は表示されないので、相関係数も見やすくなる。
NAがあって見にくい場合には、出力後にExcelなどでNAを空白で置換するとよい。

res02<-res # 正の相関用のオブジェクト
res03<-res # 負の相関用のオブジェクト
res02[res02 <= 0.3] <- NA # 相関係数が0.3以下のものにNAを代入; 正の相関
res03[res03 >= -0.3] <- NA # 相関係数が-0.3以上のものにNAを代入; 負の相関
write.csv(res02, file = "resplus.csv", row.names=TRUE, fileEncoding ="cp932") # 正の相関のマトリックスをShift-JISで書き出し
write.csv(res03, file = "resminus.csv", row.names=TRUE, fileEncoding ="cp932") # 負の相関のマトリックスをShift-JISで書き出し

正の相関用と負の相関のオブジェクトを2つ作っているのは、Rで絶対値0.3以上という数値の指定の方法がわからなかったため。
できない訳はないのだが、今の僕の知識ではうまく処理できなかった。Rのプログラムに詳しい人なら、すぐにでも解決できる問題だと思うが、今回はやり方がわからなかった。

書き出しファイルのエンコードはShift-JISにした。日本人の多くのWindowsユーザーのExcelはShift-JISで動いているためである。Macユーザーの場合はcp932のところをUTF-8と書くのだと思う。

出力したファイル

出力されたファイルはExcelでみると次のような形になって出力されている。

f:id:iDES:20200221194123p:plain

だいぶ見やすくなったように思う。

課題

同じ変数が行列に入っているので、同じ組み合わせが2組み含まれている。これを整理できれば、なお良い。 また、変数の組み合わせと相関係数が自動的に表で出力されると、まとめるのが非常に便利になるだろうということである。
解決法やよいプログラムが書けそうなら、またエントリを入れたい。