Pearson两列之间的相关性

时间:2016-07-19 13:10:22

标签: linux shell pearson-correlation

早上好。这是我的问题: 我有几个文件,如下所示:

104 0.1697 12.3513214 15.9136214
112 -0.3146 12.0517303 14.8027303
122 0.2718 10.881109 13.259109
123 -0.4185 11.2880142 14.0237142
128 0.0205 13.0585763 15.4365763
132 0.1562 13.3956582 16.9579582
136 -0.4602 12.2567041 14.6347041
157 0.8142 13.6455927 17.2078927
158 -0.9244 8.0012967 11.5635967

大约10000个文件,每个文件有多行。   我需要为每个文件在第2列和第4列之间建立Pearson相关性。后来,我需要弄清楚这些相关性的平均值。我想通过Linux命令做所有事情。有人可以帮帮我吗? 感谢

2 个答案:

答案 0 :(得分:0)

试试这个脚本。你需要bash和bc(对浮点数进行操作)。

  • 授予执行权chmod +x /path/to/pearson.sh
  • 的权限
  • 将FILES更改为存储所有文件的目录
  • 调用没有参数bash /path/to/pearson.sh的脚本。

它应该产生根据这些文件的数据计算的所有Pearson相关系数的平均值。

#! /bin/bash

FILES=/path/to/files/

function add {
  echo $1 + $2 | bc
}
function sub {
  echo $1 - $2 | bc
}
function mult {
  echo $1*$2 | bc
}
function div {
  echo $1 / $2 | bc -l
}
function sqrt {
  echo "sqrt ($1)" | bc -l
}

X=0
X2=0
Y=0
Y2=0
XY=0

r=0
R=0
N=0

for f in $FILES/*; do
  N=$((N+1))
  n=0
  while read l; do
    n=$((n+1))
    read -r -a rows <<< $l
    x=${rows[1]}
    y=${rows[3]}
    X=$(add $X $x)
    X2=$(add $X2 $(mult $x $x))
    Y=$(add $Y $y)
    Y2=$(add $Y2 $(mult $y $y))
    XY=$(add $XY $(mult $x $y))
  done < $f;
  r=$(add $r $XY)
  r=$(sub $r $(div $(mult $X $Y) $n))
  d1=$(sub $X2 $(div $(mult $X $X) $n))
  d2=$(sub $Y2 $(div $(mult $Y $Y) $n))
  r=$(div $r $(sqrt $(mult $d1 $d2)))
  R=$(add $R $r)
  X=0
  X2=0
  Y=0
  Y2=0
  XY=0
  r=0
  n=0
done

echo Mean=$(div $R $N)

Ps:我假设所有文件的格式都与您提供的格式相同。评估系数的公式取自您给出的link

答案 1 :(得分:0)

如果您安装了 GNU datamash:

true

示例:

datamash -W ppearson 2:4 < file.txt # or specify delimiter using -t