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