Awk 绘制的平均值和置信区间
我有一个数据文件,列之间用制表符分隔,如下所示:Awk 绘制的平均值和置信区间,awk,gnuplot,Awk,Gnuplot,我有一个数据文件,列之间用制表符分隔,如下所示: 6 27 4 12 20 100 50000 false 0.1 "DFSA" 2 201414 31.47408 3 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204236 31.91436 4 27 4 12 20 100 50000 false 0.1 "DFSA" 2 206964 32.09382 8 27
6 27 4 12 20 100 50000 false 0.1 "DFSA" 2 201414 31.47408
3 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204236 31.91436
4 27 4 12 20 100 50000 false 0.1 "DFSA" 2 206964 32.09382
8 27 4 12 20 100 50000 false 0.1 "DFSA" 2 203379 31.88138
1 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207287 32.4096
2 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207115 32.61346
7 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207751 32.77364
5 27 4 12 20 100 50000 false 0.1 "DFSA" 2 209856 32.77856
13 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204257 32.08478
10 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207335 32.22742
9 27 4 12 20 100 50000 false 0.1 "DFSA" 2 200518 31.64624
11 27 4 12 20 100 50000 false 0.1 "DFSA" 2 202415 32.0591
16 27 4 12 20 100 50000 false 0.1 "DFSA" 2 201548 31.59604
12 27 4 12 20 100 50000 false 0.1 "DFSA" 2 213840 33.27478
15 27 4 12 20 100 50000 false 0.1 "DFSA" 2 208926 32.37782
14 27 4 12 20 100 50000 false 0.1 "DFSA" 2 210572 32.81294
17 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204724 32.26324
20 27 4 12 20 100 50000 false 0.1 "DFSA" 2 199169 31.53494
18 27 4 12 20 100 50000 false 0.1 "DFSA" 2 208179 32.73408
19 27 4 12 20 100 50000 false 0.1 "DFSA" 2 204342 31.82608
21 27 4 12 20 100 50000 false 0.1 "DFSA" 2 205068 31.986
24 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207798 32.49448
22 27 4 12 20 100 50000 false 0.1 "DFSA" 2 207499 32.60746
23 27 4 12 20 100 50000 false 0.1 "DFSA" 2 214065 33.17844
25 27 4 12 20 100 50000 false 0.1 "DFSA" 2 198386 31.4488
26 27 4 12 20 100 50000 false 0.1 "DFSA" 2 208307 32.77412
28 27 4 12 20 100 50000 false 0.1 "DFSA" 2 208669 32.77474
27 27 4 12 20 100 50000 false 0.1 "DFSA" 2 214324 33.16506
30 27 4 12 20 100 50000 false 0.1 "DFSA" 2 209924 32.77186
29 27 4 12 20 100 50000 false 0.1 "DFSA" 2 212959 33.3218
32 27 4 12 20 100 50000 false 0.2 "DFSA" 2 486241 64.3479
31 27 4 12 20 100 50000 false 0.2 "DFSA" 2 487487 64.65076
33 27 4 12 20 100 50000 false 0.2 "DFSA" 2 494703 65.06718
34 27 4 12 20 100 50000 false 0.2 "DFSA" 2 488164 64.77828
36 27 4 12 20 100 50000 false 0.2 "DFSA" 2 476513 63.3158
35 27 4 12 20 100 50000 false 0.2 "DFSA" 2 491005 65.02426
38 27 4 12 20 100 50000 false 0.2 "DFSA" 2 487454 64.44962
37 27 4 12 20 100 50000 false 0.2 "DFSA" 2 490494 65.06572
39 27 4 12 20 100 50000 false 0.2 "DFSA" 2 472081 63.31234
40 27 4 12 20 100 50000 false 0.2 "DFSA" 2 498294 65.02114
数据继续向下增长第9列中的值(30行值为0.1,30行值为0.2,另外30行值为0.3,依此类推)。
我想在Gnuplot中用yerrorlines为30行中的每一行绘制第13列的平均值,第9列的值相同。为了绘制图,我应该传递Gnuplot第9列值、30行第13列的平均值以及置信区间的最小值和最大值(例如95%)。在0.1的情况下,要传递给Gnuplot的行应该如下所示:
0.1 36.08 35.83 36.33
0.2 ..... ..... .....
0.3 ..... ..... .....
... ..... ..... .....
假设95%置信区间为+0.25和+0.25,平均值为36.08
谢谢你的帮助
问候回答
ARGS:
1.pat
-第9列中的编号
2.sum
-包含pat相同的所有行第13列的总和
3.cnt
-包含帕特发红的时间
拆毁
开始{sum=0;pat=0;cnt=0}
-设置所有变量
if(pat==9美元)
-检查图案是否相同
如果是相同形式的平均值和增量ctn
else
-如果cnt=0
(平均值的pat行求和)将所需值打印到屏幕上
printf“%s%2.2f%2.2f%2.2f\n”,pat,(sum/cnt)*0.95,sum/cnt,sum/cnt*1.05
%2.2f
获取浮点00.00结构
END
打印最后一份的平均值
输出(对于上面输入的文件)
答复
ARGS:
1.pat
-第9列中的编号
2.sum
-包含pat相同的所有行第13列的总和
3.cnt
-包含帕特发红的时间
拆毁
开始{sum=0;pat=0;cnt=0}
-设置所有变量
if(pat==9美元)
-检查图案是否相同
如果是相同形式的平均值和增量ctn
else
-如果cnt=0
(平均值的pat行求和)将所需值打印到屏幕上
printf“%s%2.2f%2.2f%2.2f\n”,pat,(sum/cnt)*0.95,sum/cnt,sum/cnt*1.05
%2.2f
获取浮点00.00结构
END
打印最后一份的平均值
输出(对于上面输入的文件)
我想完成上面@shaikisiegal添加公式的脚本,以使用t-student pdf计算置信区间
awk '
BEGIN {sum=0;pat=0;cnt=0;summ=0}{
if(pat==$9) {sum=sum+$13; arr[cnt]=$13; cnt++} else {
if (cnt!=0) {
for (i=1;i<=cnt;i++) {
summ+=(arr[i]-(sum/cnt))^2
}
printf "%s %2.2f %2.2f %2.2f\n" ,pat, sum/cnt, (sum/cnt)-2.045*sqrt(summ/(cnt-1))/sqrt(cnt), (sum/cnt)+2.045*sqrt(summ/(cnt-1))/sqrt(cnt)
}
pat=$9;sum=0;cnt=0;summ=0
}
}
END {
for (i=1;i<=cnt;i++) {
summ+=(arr[i]-(sum/cnt))^2
}
printf "%s %2.2f %2.2f %2.2f\n" ,pat, sum/cnt, (sum/cnt)-2.045*sqrt(summ/(cnt-1))/sqrt(cnt), (sum/cnt)+2.045*sqrt(summ/(cnt-1))/sqrt(cnt)
}
' data_table.txt
awk'
开始{sum=0;pat=0;cnt=0;sum=0}{
如果(pat=$9){sum=sum+$13;arr[cnt]=$13;cnt++}else{
如果(cnt!=0){
对于(i=1;i我想完成上面的@shaikisiegal脚本,添加公式以使用t-student pdf计算置信区间
awk '
BEGIN {sum=0;pat=0;cnt=0;summ=0}{
if(pat==$9) {sum=sum+$13; arr[cnt]=$13; cnt++} else {
if (cnt!=0) {
for (i=1;i<=cnt;i++) {
summ+=(arr[i]-(sum/cnt))^2
}
printf "%s %2.2f %2.2f %2.2f\n" ,pat, sum/cnt, (sum/cnt)-2.045*sqrt(summ/(cnt-1))/sqrt(cnt), (sum/cnt)+2.045*sqrt(summ/(cnt-1))/sqrt(cnt)
}
pat=$9;sum=0;cnt=0;summ=0
}
}
END {
for (i=1;i<=cnt;i++) {
summ+=(arr[i]-(sum/cnt))^2
}
printf "%s %2.2f %2.2f %2.2f\n" ,pat, sum/cnt, (sum/cnt)-2.045*sqrt(summ/(cnt-1))/sqrt(cnt), (sum/cnt)+2.045*sqrt(summ/(cnt-1))/sqrt(cnt)
}
' data_table.txt
awk'
开始{sum=0;pat=0;cnt=0;sum=0}{
如果(pat=$9){sum=sum+$13;arr[cnt]=$13;cnt++}else{
如果(cnt!=0){
对于(i=1;i我知道这个问题的标签是awk
,但是既然提到了gnuplot
,我可以建议一个只使用gnuplot的解决方案吗
Gnuplot有一个smooth unique
函数,它可以查找唯一值(在第9列中)并对y值进行简单的平均(在第13列中)。您可以直接绘制此图,但只需几行额外的代码,就可以使输出变得更好
使用问题的输入文件和以下代码:
set term png
set out "test.png"
set table "tab.tmp"
plot "data.txt" u 9:13 smooth unique
unset table
set xrange[0.09:0.21]
set yrange[25:75]
set style fill transparent solid 0.2 noborder
set key top left
set multiplot layout 2,1
plot "tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2*0.95):($2*1.05)
with filledcurves title '95% confidence', \
"tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2)
with lp lt 1 pt 7 ps 1.0 lw 3 title 'mean value'
plot "tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2):($2*0.95):($2*1.05) \
with yerrorlines lt 1 pt 7 ps 1.0 lw 3 title 'value+confidence'
set table
部分创建一个具有唯一值及其平均值的新表:
# Curve 0 of 1, 3 points
# Curve title: ""tmp" u 9:13"
# x y type
0.1 32.3633 i
0.2 64.5033 i
0.1 32.0938 u
然后,您可以将此文件视为常规数据文件,并根据需要进行绘图。唯一的技巧是:(strcol(3)eq“u”?1/0:$2)
。这是一个简单的条件,告诉gnuplot忽略列3为“u”(未定义)的行。然后您可以根据需要直接计算置信区间
运行这些行将提供以下输出,以及两种建议的布局:
来自和的一点帮助
无论如何,希望它能有所帮助!我知道这个问题的标签是awk
,但是既然提到了gnuplot
,我可以建议一个只使用gnuplot的解决方案吗
Gnuplot有一个smooth unique
函数,它可以查找唯一值(在第9列中)并对y值进行简单的平均(在第13列中)。您可以直接绘制此图,但只需几行额外的代码,就可以使输出变得更好
使用问题的输入文件和以下代码:
set term png
set out "test.png"
set table "tab.tmp"
plot "data.txt" u 9:13 smooth unique
unset table
set xrange[0.09:0.21]
set yrange[25:75]
set style fill transparent solid 0.2 noborder
set key top left
set multiplot layout 2,1
plot "tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2*0.95):($2*1.05)
with filledcurves title '95% confidence', \
"tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2)
with lp lt 1 pt 7 ps 1.0 lw 3 title 'mean value'
plot "tab.tmp" u 1:(strcol(3) eq "u" ? 1/0: $2):($2*0.95):($2*1.05) \
with yerrorlines lt 1 pt 7 ps 1.0 lw 3 title 'value+confidence'
set table
部分创建一个具有唯一值及其平均值的新表:
# Curve 0 of 1, 3 points
# Curve title: ""tmp" u 9:13"
# x y type
0.1 32.3633 i
0.2 64.5033 i
0.1 32.0938 u
然后,您可以将此文件视为常规数据文件,并根据需要进行绘图。唯一的技巧是:(strcol(3)eq“u”?1/0:$2)
。这是一个简单的条件,告诉gnuplot忽略列3为“u”(未定义)的行。然后您可以根据需要直接计算置信区间
运行这些行将提供以下输出,以及两种建议的布局:
来自和的一点帮助
无论如何,希望它能有所帮助!目标是你添加一些自己的代码,以显示至少你自己为解决这个问题所做的研究工作。抱歉,但不清楚你如何计算你的平均值……36.08
35.83
36.33
来自何处?@Allan感谢你的评论。36.08是上一次co的平均值列值,其中第8列的de值为0.1。如果置信区间为0.5,则35.83为置信区间的最小值,36.33为de最大值。目标是您添加一些自己的代码,以至少显示您自己为解决此问题所做的研究工作。抱歉,但不清楚如何计算平均值…代码在哪里>36.08
35.83
36.33
来自何处?@Allan,感谢评论。36.08是最后一列值的平均值,其中第8列的de值为0.1。35.83是置信区间的最小值,如果置信区间为0.5,则为36.33 de最大值。非常感谢。awk代码非常完美。我只需要