2016-07-19 21 views
0

早上好。这里是我的问题: 我有几个文件类似下面:皮尔森两列之间的相关性

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命令来做所有事情。任何人都可以帮助我吗? 谢谢

+0

小心告诉两个值之间的'Pearson相关性'是如何完成的? – Inian

+0

感谢您的关注..那么,在这个网站有一个简单的例子: http://www.stat.wmich.edu/s216/book/node122.html –

回答

0

试试这个脚本。你将需要bash和bc(在浮点数上操作)。

  • 授予访问权限来执行它chmod +x /path/to/pearson.sh
  • 文件更改为您的目录中的所有文件都存储
  • 调用脚本不带参数bash /path/to/pearson.sh

它应该产生所有皮尔逊相关系数的平均值,这些系数是根据这些文件的数据计算出来的。

#! /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

+0

谢谢,它的工作.. =) ,感谢您的帮助和支持 –