Как запустить функцию tornthwaite (которая вычисляет стандартный индекс осадков) по местоположению и широте в R? - PullRequest
0 голосов
/ 01 октября 2018

У меня есть следующие данные:

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
   2  1986    1      -12.9    7.2    42.46
   2  1986    2      -11.6    19.7   42.46", header=TRUE)

, где

  • id - это единица измерения моего местоположения в диапазоне от 1 до 90
  • TMED - среднемесячная температура поместоположение
  • PRCP - количество осадков по местоположению
  • широта - широта по местоположению
  • ГОД колеблется в период с 1986 по 2016 год
  • МЕСЯЦ варьируется от 1 до 12

Мне нужно запустить следующую функцию в R для расчета индекса SPEI (стандартного индекса осаждения-испарения) для каждого местоположения:

library(SPEI)

dat$PET <- thornthwaite(dat$TMED, dat$lat[1])

dat$BAL <- dat$PRCP-dat$PET

spei1 <- spei(dat$BAL, scale = 1)

dat$spei1=l

Этот код работает для одного местоположения.Но мне нужно сделать петлю по широте и местоположению.Одна из проблем заключается в том, что широта должна вводить функцию thornthwaite в виде числа (не в виде списка / переменной).

1 Ответ

0 голосов
/ 01 октября 2018

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