簡體   English   中英

使用dplyr和purrr函數模擬復制和繼承

[英]simulating reproduction and inheritance with dplyr and purrr functions

我正在嘗試在R中建立一個基於個體的模型,以模擬鳥類的整個生命周期。 因此,模擬的個體會繁殖,遷移,死亡等,並且這種循環持續了很多年。

我有一個初始的鳥類種群,它表示為每行包含一個個體及其屬性的數據框。 遷移,死亡率等被寫成管道函數,將個人數據框作為輸入。 種群(下面的“代理商”數據框)繁殖,遷移,個體死亡等,看起來像這樣:

agents <- agents %>%
    reproduce() %>%
    determine_migration_distance() %>%
    migrate() %>%
    mortality() %>%
    increment_age()

這將放置在for循環中,以使該循環每年重復其自身50年,並且我將添加更多代碼來存儲每年感興趣的數據。

我難以思考和創建的一個功能是模擬復制的功能。 首先,雌性與雄性配對。 其次,雌性決定產生的后代數量(基於基本的rmrm功能)。 這仍然是我的“代理”數據框,在此步驟中看起來像這樣:

library(tidyverse)
agents <- structure(list(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
101L, 102L, 103L, 104L, 105L, 106L, 107L, 108L, 109L, 110L), 
    mate = c(101L, 102L, 103L, 104L, 105L, 106L, 107L, 108L, 
    109L, 110L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), sex = c("female", 
    "female", "female", "female", "female", "female", "female", 
    "female", "female", "female", "male", "male", "male", "male", 
    "male", "male", "male", "male", "male", "male"), ageClass = c("adult", 
    "adult", "adult", "adult", "adult", "adult", "adult", "adult", 
    "adult", "adult", "adult", "adult", "adult", "adult", "adult", 
    "adult", "adult", "adult", "adult", "adult"), migStrategy = c("migrant", 
    "resident", "resident", "migrant", "migrant", "resident", 
    "migrant", "resident", "migrant", "migrant", "resident", 
    "migrant", "resident", "migrant", "migrant", "migrant", "resident", 
    "resident", "resident", "resident"), numOffspring = c(4L, 
    5L, 5L, 5L, 5L, 3L, 4L, 4L, 4L, 4L, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA)), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"), spec = structure(list(cols = list(id = structure(list(), class = c("collector_integer", 
"collector")), mate = structure(list(), class = c("collector_integer", 
"collector")), sex = structure(list(), class = c("collector_character", 
"collector")), ageClass = structure(list(), class = c("collector_character", 
"collector")), migStrategy = structure(list(), class = c("collector_character", 
"collector")), numOffspring = structure(list(), class = c("collector_integer", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector"))), class = "col_spec")) 

> agents
# A tibble: 20 x 6
      id  mate sex    ageClass migStrategy numOffspring
   <int> <int> <chr>  <chr>    <chr>              <int>
 1     1   101 female adult    migrant                4
 2     2   102 female adult    resident               5
 3     3   103 female adult    resident               5
 4     4   104 female adult    migrant                5
 5     5   105 female adult    migrant                5

“ id”是個人的標識符,“ mate”是伴侶的標識符。

然后,我可以創建僅包含后代的第二個數據框,我希望這些后代最終綁定到代理程序數據框,但是我需要讓后代跟蹤父母並從他們那里繼承信息。 現在,后代采用其母親的身份證作為跟蹤方式,如下所示:

# function to determine sex
set_offspring_sex <- function(...) {
  randDraw <- runif(1, 0, 1)
  if (randDraw < 0.5) {
    val <- 'male'
  } else {
    val <- 'female'
  }
  return(val)
}

breedingFemales <- agents %>% 
  drop_na(numOffspring) # get rid of males

N <- as.vector(breedingFemales$numOffspring)

juv <- tibble(
  id = rep(seq(breedingFemales$id), times=N),
  mate = NA,
  sex = NA,
  ageClass = 'juvenile',
  migStrategy = NA,
  numOffspring = NA
)

juv <- juv %>%
  mutate(
    sex = pmap_chr(., set_offspring_sex)
  )
juv

但是,我希望雌性后代繼承其母親的遷移策略('migStrategy'),而雄性后代繼承其父親的遷移策略。 鏈接這些數據幀是我遇到的困難。

在此步驟之前或期間,是否有更好的方法來構造我的數據幀? 還有讓后代繼承這些信息的方法嗎?

這是我在評論中說的一個實際示例:

library(dplyr)
library(tidyr)
library(purrr)

# join juv to agents table in order to get the parents ids
ag_juv <- breedingFemales %>% left_join(juv, by = "id", suffix = c("_ag", "_juv")) %>% 
  mutate(id_Mo = id, id_Fa = mate_ag) %>% 
  select(-contains("_ag"))

# join females to mothers to get mig strategy and give them a unique id
f_juv <- ag_juv %>% filter(sex_juv == "female") %>% 
  left_join(breedingFemales %>% select(id, migStrategy), by = c(id_Mo = "id")) %>% 
  mutate(migStrategy_juv = migStrategy,
         id = last(agents$id)+1:n()) %>% 
  select(-migStrategy) %>% 
  rename_at(vars(contains("_juv")), ~gsub("_juv", "", .))


# I will let you do the same for juv males


# append the juvs to the agents 

agents_gen2 <- agents %>% bind_rows(f_juv)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM