[英]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.