Индивидуальное моделирование в г - PullRequest
0 голосов
/ 29 августа 2018

Моя проблема с кодированием лучше всего объясняется вначале описанием системы и данных, с которыми я работаю. Тогда я представлю свою проблему / задам вопрос.

Я пытаюсь моделировать рост и развитие отдельных насекомых в популяции. Развитие в значительной степени зависит от температуры. Таким образом, развитие измеряется в «накопленном тепле», то есть, больше тепла означает больше развития. Однако существует температура, ниже которой развитие не может происходить («основание»).

Каждое насекомое проходит множество стадий в процессе развития, и каждая стадия имеет уникальную базовую температуру.

Наконец, количество тепла, необходимое для перехода от одной стадии к другой, варьируется у разных людей.

Хорошо, некоторые примеры данных:

# df1: Hourly temperatures
df1 = data.frame(DateTime = seq(
  from = as.POSIXct("1986-1-1 0:00"),
  to = as.POSIXct("1986-1-8 23:00"), 
  by = "hour"))

temp = c(5,5,5,6,7,8,9,10,13,17,22,25,26,28,26,25,25,22,19,14,10,8,5,5)

df1$temp <- temp 

# df2: Each row is an individual insect. 
#      s1_thresh is the number of degrees that need to accumulate for each 
#      individual to advance from stage 1 to stage 2. 

df2 <- data.frame(id = c("A", "B", "C", "D", "E"), 
              s1_thresh = c(21.5, 25.1, 19.9, 20.4, 21.4))

# Stage-specific base temperatures below which no degrees accumulate

base_s1 <- 10.5  # base temp for stage 1
base_s2 <- 8.6   # base temp for stage 2

# Temperature accumulation above base_s1 
df1$dd_s1 <- ifelse(temp >= base_s1, (temp - base_s1)/24, 0)
df1$cumdd_s1 <- cumsum(df1$dd_s1)

Вот мой вопрос: Поскольку каждый человек будет переходить / продвигаться на этапах в независимые моменты времени из-за неоднородности в потребностях в тепле, как я могу сместить базовую температуру для каждого человека, когда происходит этот переход? Вот желаемый результат (своего рода) для отдельного «А» из df1.

# Example for single individual:
# Individual "A" has s1_thresh of 21.5, so a shift to base_2 occurs on 1986-01-04 16:00:00, row 89
df1$dd_s2 <-  ifelse(df1$cumdd_s1 > df2$s1_thresh[df2$id == "A"] & temp >= base_s2, (temp - base_s2)/24, 0) 
df1$cumdd_s2 <- cumsum(df1$dd_s2)

Я пытаюсь избежать нескольких столбцов накопления температуры для каждого человека, но важно знать количество тепла, которое накапливается для каждого человека в течение ограниченного периода времени.

Большое спасибо за ваше время!

1 Ответ

0 голосов
/ 29 августа 2018

Предполагая, что вы просто хотите получить вектор накопленных 2-х ступенчатых дней для каждого человека:

# transformed temperatures series relative to stages
df1$temps_b1 <- pmax(df1$temp - base_s1, 0)
df1$temps_b2 <- pmax(df1$temp - base_s2, 0)

ddsum <- function(theid) {
  in_stage1 <- cumsum(df1$temps_b1/24) < df2$s1_thresh[df2$id==theid]
  s2_temp <- ifelse(in_stage1, 0, df1$temps_b2)
  return(cumsum(s2_temp/24))
}

res<-as.data.frame(sapply(df2$id, FUN=ddsum))
names(res) <- df2$id
res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...