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代码非常完美。我只需要