Bash中AWK如何计算某列值的标准差?
How to calculate the standard deviation of a column value by AWK in Bash?
我的数据如下:
condition A
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
然后我使用 awk 命令计算出此条件的平均值为 0.875,如下所示:(基本上它只是将所有值除以行数求和)
平均值:cat $a.csv | awk -F"," '=="Picture" && =="1" && =="hit" && ==1{c++} END {print c/16}'
我的问题是如何计算这个条件的标准偏差?
我已经知道这种情况的 SD 是 0.3415650255 EXCEL...
我已经尝试了几个 awk 命令,但仍然无法得到正确的结果...
cat $a.csv | awk -F"," '=="Picture" && =="2" && =="hit" && =="2"{c++} END {c=0;ssq=0;for (i=1;i<=16;i++){c+=$i;ssq+=$i**2}; print (ssq/16-(c/16)**2)**0.5}'
cat $a.csv | awk -F"," '=="Picture" && =="2" && =="hit" && ==2{c++} {delta=-(c/16); avg==delta/16;mean2+=delta*(-avg);} END { avg=c/16; printf "mean: %f. standard deviation: %f \n", avg, sqrt(mean2/16) }'
cat $a.csv | awk -F"," '=="Picture" && =="2" && =="hit" && ==2{c++} END { avg=c/16; printf "mean: %f. standard deviation: %f \n", avg, sqrt((c/16-1)-(c/16-1)^2) }'
在这种情况下,我仍然无法获得正确的标准偏差。
有谁知道问题出在哪里?
回忆如何计算standard deviation。您需要所有值,因为您需要与均值的个体差异。
首先手动执行,在 Excel:
现在您可以使用任何具有数组和数学函数的语言轻松实现它。
在awk
中:
$ echo "1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0" | tr " " "\n" > file
$ awk 'function sdev(array) {
for (i=1; i in array; i++)
sum+=array[i]
cnt=i-1
mean=sum/cnt
for (i=1; i in array; i++)
sqdif+=(array[i]-mean)**2
return (sqdif/(cnt-1))**0.5
}
{sum1[FNR]=}
END {print sdev(sum1)}' file
0.341565
我的数据如下:
condition A
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
然后我使用 awk 命令计算出此条件的平均值为 0.875,如下所示:(基本上它只是将所有值除以行数求和)
平均值:cat $a.csv | awk -F"," '=="Picture" && =="1" && =="hit" && ==1{c++} END {print c/16}'
我的问题是如何计算这个条件的标准偏差? 我已经知道这种情况的 SD 是 0.3415650255 EXCEL...
我已经尝试了几个 awk 命令,但仍然无法得到正确的结果...
cat $a.csv | awk -F"," '=="Picture" && =="2" && =="hit" && =="2"{c++} END {c=0;ssq=0;for (i=1;i<=16;i++){c+=$i;ssq+=$i**2}; print (ssq/16-(c/16)**2)**0.5}'
cat $a.csv | awk -F"," '=="Picture" && =="2" && =="hit" && ==2{c++} {delta=-(c/16); avg==delta/16;mean2+=delta*(-avg);} END { avg=c/16; printf "mean: %f. standard deviation: %f \n", avg, sqrt(mean2/16) }'
cat $a.csv | awk -F"," '=="Picture" && =="2" && =="hit" && ==2{c++} END { avg=c/16; printf "mean: %f. standard deviation: %f \n", avg, sqrt((c/16-1)-(c/16-1)^2) }'
在这种情况下,我仍然无法获得正确的标准偏差。 有谁知道问题出在哪里?
回忆如何计算standard deviation。您需要所有值,因为您需要与均值的个体差异。
首先手动执行,在 Excel:
现在您可以使用任何具有数组和数学函数的语言轻松实现它。
在awk
中:
$ echo "1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0" | tr " " "\n" > file
$ awk 'function sdev(array) {
for (i=1; i in array; i++)
sum+=array[i]
cnt=i-1
mean=sum/cnt
for (i=1; i in array; i++)
sqdif+=(array[i]-mean)**2
return (sqdif/(cnt-1))**0.5
}
{sum1[FNR]=}
END {print sdev(sum1)}' file
0.341565