两列之间的 Pearson 相关性
Pearson Correlation between two columns
早上好。这是我的问题:
我有几个文件,如下所示:
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 命令来完成所有事情。任何人都可以帮助我吗?
谢谢
试试这个脚本。您将需要 bash 和 bc(对浮点数进行运算)。
- 授予执行它的权限
chmod +x /path/to/pearson.sh
- 将 FILES 更改为您存储所有文件的目录
- 不带参数调用脚本
bash /path/to/pearson.sh
。
它应该生成根据这些文件中的数据计算的所有 Pearson 相关系数的平均值。
#! /bin/bash
FILES=/path/to/files/
function add {
echo + | bc
}
function sub {
echo - | bc
}
function mult {
echo * | bc
}
function div {
echo / | bc -l
}
function sqrt {
echo "sqrt ()" | 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。
如果您安装了 GNU datamash:
datamash -W ppearson 2:4 < file.txt # or specify delimiter using -t
示例:
datamash -W ppearson 1:2 << EOF
1 1
2 4
3 3
EOF
0.65465367070798
早上好。这是我的问题: 我有几个文件,如下所示:
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 命令来完成所有事情。任何人都可以帮助我吗? 谢谢
试试这个脚本。您将需要 bash 和 bc(对浮点数进行运算)。
- 授予执行它的权限
chmod +x /path/to/pearson.sh
- 将 FILES 更改为您存储所有文件的目录
- 不带参数调用脚本
bash /path/to/pearson.sh
。
它应该生成根据这些文件中的数据计算的所有 Pearson 相关系数的平均值。
#! /bin/bash
FILES=/path/to/files/
function add {
echo + | bc
}
function sub {
echo - | bc
}
function mult {
echo * | bc
}
function div {
echo / | bc -l
}
function sqrt {
echo "sqrt ()" | 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。
如果您安装了 GNU datamash:
datamash -W ppearson 2:4 < file.txt # or specify delimiter using -t
示例:
datamash -W ppearson 1:2 << EOF
1 1
2 4
3 3
EOF
0.65465367070798