绘图的均值和置信区间

时间:2018-02-01 00:01:06

标签: 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  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中为{30}中的每一行绘制具有相同值的第9列的平均值第13列with yerrorlines。为了绘制图,我应该通过Gnuplot column 9 value,{{1}在30行中,以及置信区间的最小值和最大值(例如95%)。在0.1的情况下,传递给Gnuplot的行应如下所示:

mean of column 13

假设95%置信区间为+0.25且平均值为36.08附近+0.25

感谢您的帮助 此致

3 个答案:

答案 0 :(得分:3)

答案

awk 'BEGIN{sum=0;pat=0;cnt=0}{if(pat==$9) {sum=sum+$13;cnt++} else {if (cnt!=0) {printf "%s %2.2f %2.2f %2.2f\n" ,pat,(sum/cnt)*0.95,sum/cnt,sum/cnt*1.05} pat=$9;sum=0;cnt=0} }END{printf "%s %2.2f %2.2f %2.2f\n" ,pat,(sum/cnt)*0.95,sum/cnt,sum/cnt*1.05}' data_table.txt

ARGS:

1.pat - 第9栏中的数字

2.sum - 包含pat相同的所有行的第13列的总和

3.cnt - 包含pat为红色的时间

撕下

  1. BEGIN{sum=0;pat=0;cnt=0} - 设置所有变量
  2. if(pat==$9) - 检查模式是否相同 如果它是相同的形式平均值和增量ctn
  3. else - 如果cnt!=0(pat line总和为平均值)将所需值打印到屏幕
  4. printf "%s %2.2f %2.2f %2.2f\n" ,pat,(sum/cnt)*0.95,sum/cnt,sum/cnt*1.05 %2.2f得到浮点00.00结构
  5. END打印最后一次拍摄的意思
  6. 输出(上面输入的文件)

     0.1 30.77 32.39 34.01
     0.2 61.29 64.52 67.75
    

答案 1 :(得分:2)

我想完成@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

其中2.045是t-student pdf分布表的95%和30个数据样本的表格值。

答案 2 :(得分:2)

我知道问题的标签为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列是&#34; u&#34; (不确定)。然后,您可以根据需要直接计算置信区间。

运行这些行将为您提供以下输出,其中包含两个建议的布局: enter image description here

来自herehere

的一些帮助

无论如何,希望它有所帮助!