Как рассчитать тренд, используя 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