【问题标题】:Mean and Confidence Interval to plot要绘制的均值和置信区间
【发布时间】:2018-02-01 00:01:06
【问题描述】:

我有一个包含制表符分隔列的数据文件,如下所示:

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

0.1  36.08  35.83  36.33
0.2  .....  .....  .....
0.3  .....  .....  .....
...  .....  .....  .....

假设 95% 的置信区间是平均值 36.08 附近的 +0.25 和 +0.25

感谢您的帮助 问候

【问题讨论】:

  • 目标是您添加一些自己的代码,以至少展示您为解决这个问题所做的研究工作。
  • 对不起,但不清楚你如何计算你的平均值......36.08 35.83 36.33 来自哪里?
  • @Allan 感谢您的评论。值 36.08 是最后一列值的平均值,其中第 8 列的 de 值为 0.1。如果置信区间为 0.5,则 35.83 是置信区间的最小值,36.33 de 最大值。

标签: awk gnuplot


【解决方案1】:

我知道这个问题的标签是 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”(未定义)的行。然后您可以根据需要直接计算置信区间。

运行这些行将为您提供以下输出,并带有两种建议的布局:

来自herehere 的一点帮助

不管怎样,希望对你有帮助!

【讨论】:

  • 谢谢。你是对的,我在问题中添加了Gnuplot。我非常喜欢仅 Gnuplot 的解决方案,但我不知道是否可以使用公式 mean +- sqrt{ \sum{x_i - mean}^2/(count-1)} / sqrt{count} 而不是 mean*1.05 和 mean*0.95 添加置信区间的计算。
  • 是的,这实际上是可能的。 Gnuplot 有一个内置的stats 函数。使用您的输入文件,尝试stats "datafile" u ($9==0.1?$13:1/0)。当第 9 列 ==0.1 时,这将为您提供第 13 列的基本数字。然后,gnuplot 将所有这些存储在变量中,例如,您可以执行print STATS_records(计数)、STATS_sum(总和)和STATS_mean(平均值)。在情节中包含一些额外的编码,但我怀疑不会很多。
  • 谢谢。我将尝试 Gnuplot stats。请问($9==0.1?$13:1/0)中的1/0是什么意思?
  • 来自gnuplot 手册:整数表达式“1/0”可用于生成“未定义”标志,这会导致点被忽略。所以($9==0.1?$13:1/0) 说:如果字段 $9 是 0.1,则打印(绘图)字段 $13;否则忽略这一点
【解决方案2】:

回答

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 - 包含拍红的次数

拆掉

  1. BEGIN{sum=0;pat=0;cnt=0} - 设置所有变量
  2. if(pat==$9) - 检查模式是否相同 如果它的形式相同,则表示并增加 ctn
  3. else - 如果cnt!=0(拍线被求和为平均值)将想要的值打印到屏幕
  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 打印最后一拍的意思

输出(对于上面输入的文件)

 0.1 30.77 32.39 34.01
 0.2 61.29 64.52 67.75

【讨论】:

  • 非常感谢。 awk 代码是完美的。我只需要更改置信区间的最小值和最大值的公式,即可使用 t-student pdf 进行计算。
【解决方案3】:

我想完成@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 个数据样本的表格值。

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 2020-08-04
    • 1970-01-01
    • 2017-04-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2015-10-24
    相关资源
    最近更新 更多