Как рассчитать тренд, используя awk?

У меня есть временной ряд данных о температуре как:

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

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
Другие вопросы по тегам