Rを使って順位相関係数を計算する
順位相関係数といえばSpeamanさんとKendallさんが有名.順位相関はいろんなところで使うので,Cで練習がてらに書いてみた.
けれど同順位がある場合,実装が少しややこしい.ぱっと実装できなかったので,諦めてRのcor関数を使うことにした.出力を他のプログラムで使いやすいように,相関係数だけを標準出力に出してくれることにこだわってみた.
フォーマットはなんでもいいのだけれど,とりあえず行がi番目の要素に対応し,その値がi番目の値を表すとする.(順位ではない).
# data1.dat 1 2 3 4 5
# data2.dat 1 2 3 5 4
これらを入力として順位相関を計算する.
$ ./rankcor.sh data1.dat data2.dat 0.9 0.8
1行目がSpearman,2行目がKendallの順位相関係数.
つくったスクリプトはこんな感じ.ラッパーもへったくれもない.おいおいこんなんありかよ,という無理やりさ.
#!/bin/sh TMP_FILE="./__calc_rank_cor.tmp" if [ $# -lt 2 ]; then echo $0" <input file1> <input file2>" exit 1 fi INPUT1=$1 INPUT2=$2 echo "x <- read.table(\"${INPUT1}\")" > $TMP_FILE echo "y <- read.table(\"${INPUT2}\")" >> $TMP_FILE echo "cor(rank(t(x[1])), rank(t(y[1])), method=\"s\")" >> $TMP_FILE echo "cor(rank(t(x[1])), rank(t(y[1])), method=\"k\")" >> $TMP_FILE R --vanilla --slave < $TMP_FILE | cut -d" " -f2 rm $TMP_FILE
動くからいいや.
ちなみにcor.test()関数で検定もしてくれる.