Я немного поиграл с уравнением Торнтвейта для моих мастеров экологии, и эта реализация кажется немного странной.Несмотря на то, как это может выглядеть здесь, уравнению нужно больше, чем просто средняя температура и широта в качестве входных данных.На самом деле ему нужна средняя продолжительность дня данного месяца, но ее можно рассчитать по широте и дате, и 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]))