Я немного поигрался с уравнением Торнтвейта для своих мастеров по экологии, и эта реализация кажется немного странный. Несмотря на то, как это может выглядеть здесь, уравнение требует в качестве входных данных больше, чем просто среднюю температуру и широту. На самом деле ему нужна средняя продолжительность светового дня в данном месяце, но ее можно вычислить по широте и дате, и thornthwaite()
получает дату, просто предполагая, что первая точка данных представляет январь, а остальные следуют последовательно. Уравнение Торнтуэйта также зависит от годового индекса тепла, что означает, что вам нужны среднемесячные значения температуры за весь год. thornthwaite()
решает эту проблему путем агрегирования по заданному вами вектору температуры.
В итоге, для thornthwaite()
работы вам потребуется последовательность значений среднемесячных температур, начиная с января и охватывая не менее одного года. Таким образом, функция не будет работать с предоставленными вами данными.
Я предлагаю вам убедиться, что ваша серия достаточно длинная, а также разбить ее на отдельные data.frames для каждого местоположения. Для этого можно использовать split()
(split(dat, dat$id)
).
В ?thornthwaite
есть несколько примеров, в том числе один, демонстрирующий его использование для временных рядов, что полезно, если ваша серия не начинается в январе.
Я сделал макет, демонстрирующий один из возможных подходов:
(Обратите внимание, что функция будет возвращать значения, даже если данные не охватывают полный год, тогда эти значения будут весьма ненадежными.)
dat <- read.table(text="
id YEAR MONTH TMED PRCP lat
1 1986 1 -14.5 2.3 42.4863
1 1986 2 -13.9 5.7 42.4863
1 1986 3 -10.5 2.3 42.4863
1 1986 4 -7.9 5.7 42.4863
1 1986 5 -4.5 2.3 42.4863
1 1986 6 0.9 5.7 42.4863
1 1986 7 10.5 2.3 42.4863
1 1986 8 17.9 5.7 42.4863
2 1986 1 -12.9 7.2 42.46
2 1986 2 -11.6 19.7 42.46
2 1986 3 -8.9 7.2 42.46
2 1986 4 -5.9 7.2 42.46
2 1986 5 1.6 19.7 42.46
2 1986 6 12.9 7.2 42.46
2 1986 7 21.6 19.7 42.46
2 1986 8 25.6 19.7 42.46", header=TRUE)
dat.s <- split(dat, dat$id)
lapply(dat.s, function(x) thornthwaite(x$TMED, x$lat[1]))
person
AkselA
schedule
01.10.2018
thornthwaite()
тот, что находится вSPEI
библиотеке? - person AkselA   schedule 01.10.2018