28

24 (行) x 16 (列) のデータを持つ 'file.dat' があります。

各列の平均を計算する次の awk スクリプトは既にテスト済みです。

touch aver-std.dat
awk '{   for (i=1; i<=NF; i++) { sum[i]+= $i } }
END { for (i=1; i<=NF; i++ )  
{ printf "%f \n", sum[i]/NR} }' file.dat >> aver-std.dat

出力「aver-std.dat」には、これらの平均を含む 1 つの列があります。

平均計算と同様に、データ ファイル 'file.dat' の各列の標準偏差を計算し、それを出力ファイルの 2 列目に書きたいと思います。つまり、最初の列に平均値、2 番目の列に標準偏差を含む出力ファイルが必要です。

私はこのようなさまざまなテストを行ってきました

touch aver-std.dat
awk '{   for (i=1; i<=NF; i++) { sum[i]+= $i }}
END { for (i=1; i<=NF; i++ )  
{std[i] += ($i - sum[i])^2 ; printf "%f %f \n", sum[i]/NR, sqrt(std[i]/(NR-1))}}' file.dat >> aver-std.dat

2列目に値を書き込みますが、標準偏差の正しい値ではありません。偏差の計算がなぜか正しくありません。助けていただければ幸いです。よろしく

4

4 に答える 4

4

これは、中断しなければならなかった長時間の浸漬テストのために、グラインダー データ出力ファイルで行った計算の一部です。

標準偏差(バイアス) + 平均:

cat <grinder_data_file> | grep -v "1$" | awk -F ', '  '{   sum=sum+$5 ; sumX2+=(($5)^2)} END { printf "Average: %f. Standard Deviation: %f \n", sum/NR, sqrt(sumX2/(NR) - ((sum/NR)^2) )}'

標準偏差(バイアスなし) + 平均:

cat <grinder_data_file>  | grep -v "1$" | awk -F ', '  '{   sum=sum+$5 ; sumX2+=(($5)^2)} END { avg=sum/NR; printf "Average: %f. Standard Deviation: %f \n", avg, sqrt(sumX2/(NR-1) - 2*avg*(sum/(NR-1)) + ((NR*(avg^2))/(NR-1)))}'
于 2014-06-18T12:14:18.960 に答える