【问题标题】:How to compute trend using awk?如何使用 awk 计算趋势?
【发布时间】:2017-03-21 01:02:36
【问题描述】:

我有一个时间序列的温度数据:

ifile.txt
1921  25
1922  25.1
1923  24.2
1924  23.4
1925  24.4
1926  25.1
1927  23.6
1928  25.2
1929  23.9
1930  25.6

我想计算 1923-1929 年期间的趋势。

我的算法是:

将上述点拟合成一条线,例如

Y = mX + c ; where m is the trend

我可以找到整个时期的趋势,但在选择特定时期时我无法修改我的脚本。请检查我的脚本好吗?

awk '/1923/,/1929/ {if (NR==FNR) x[NR] = $1;y[NR] = $2;
      sx += x[NR]; sy += y[NR];
      sxx += x[NR]*x[NR];
      sxy += x[NR]*y[NR];}
      END{
      det = NR*sxx - sx*sx;
      trend = (NR*sxy - sx*sy)/det;
      print trend;}' ifile.txt

它没有打印正确的值。

 The correct value is 0.0679

【问题讨论】:

  • 对你来说“正确”的趋势是什么?
  • @dawg :这实际上是价值。

标签: shell awk rate trend


【解决方案1】:

你可以稍微简化一下,你没有计算匹配的记录。 NR 将是 END 块中的总行数。

awk '/1923/,/1929/ {sx+=$1; sy+=$2; c++;
                    sxx+=$1*$1; sxy+=$1*$2}
           END     {det=c*sxx-sx*sx;
                    print det?(c*sxy-sx*sy)/det:"DIV0"}' file

还需要考虑分母为零。趋势出现了

0.0678571

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2012-02-18
  • 2011-02-15
  • 1970-01-01
  • 2018-07-18
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多