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()関数で検定もしてくれる.