Regression models can detect a “vector” effect in their flower visiting pattern
Session information
R version 4.3.2 (2023-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.2 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3; LAPACK version 3.9.0
locale:
[1] LC_CTYPE=pt_BR.UTF-8 LC_NUMERIC=C
[3] LC_TIME=es_CR.UTF-8 LC_COLLATE=pt_BR.UTF-8
[5] LC_MONETARY=es_CR.UTF-8 LC_MESSAGES=pt_BR.UTF-8
[7] LC_PAPER=es_CR.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=es_CR.UTF-8 LC_IDENTIFICATION=C
time zone: America/Costa_Rica
tzcode source: system (glibc)
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] htmlwidgets_1.6.4 compiler_4.3.2 fastmap_1.1.1 cli_3.6.2
[5] tools_4.3.2 htmltools_0.5.7 rstudioapi_0.15.0 yaml_2.3.8
[9] rmarkdown_2.25 knitr_1.45 jsonlite_1.8.8 xfun_0.42
[13] digest_0.6.34 rlang_1.1.3 evaluate_0.23
Source Code
---title: Mite plant preferencesubtitle: Mite-hummingbird-plant comensalism networksauthor:- <a href="https://marce10.github.io">Marcelo Araya-Salas, PhD</a> date: "`r Sys.Date()`"toc: truetoc-depth: 2toc-location: leftnumber-sections: truehighlight-style: pygmentsformat: html: df-print: kable code-fold: show code-tools: true css: qmd.css---::: {.alert .alert-info}# Purpose {.unnumbered .unlisted}- The first goal of this report- The second goal of this report:::# Simulation ## Function to simulate dataParameters: - n_mites: number of mite species - n_plants: number of plant species - n_hummers: number of hummer species - prop_mh: proportion of hummers used by mites (in average) -prop_hp: proportion of plants used by hummers (in average) - prob_visit: probability for a mite to visit a plant visited by a hummer it uses as vector```{r}sim_networks <-function(x, n_mites, # number of mite species n_plants, # number of plant species n_hummers, # number of hummer species prop_mh, # proportion of hummers used by mites (in average) prop_hp, # proportion of plants used by hummers (in average) prob_visit, # probability for a mite to visit a plant visited by a hummer it uses as vectorseed =NULL) {set.seed(seed) mites <-paste0("m", seq_len(n_mites)) plants <-paste0("p", seq_len(n_plants)) hummers <-paste0("h", seq_len(n_hummers))# hummers vs mites org_mh_dat <- mh_dat <-expand.grid(mites = mites,hummers = hummers,stringsAsFactors =FALSE) mh_dat <- mh_dat[sample(seq_len(nrow(mh_dat)), size =nrow(mh_dat) * prop_mh),]# hummers vs plants org_hp_dat <- hp_dat <-expand.grid(hummers = hummers,plants = plants,stringsAsFactors =FALSE) hp_dat <- hp_dat[sample(seq_len(nrow(hp_dat)), size =nrow(hp_dat) * prop_mh),]nrow(hp_dat) /nrow(org_hp_dat) visited_plants <-unique(hp_dat$plants) out_list <-lapply(unique(mh_dat$mites), function(x) { hummers_this_mite <- mh_dat$hummers[mh_dat$mites == x] plants_by_hummer <- hp_dat$plants[hp_dat$hummers %in% hummers_this_mite] bin_visit <-lapply(visited_plants, function(y) { visit <-if (y %in% plants_by_hummer)rbinom(n =1,size =1,prob = prob_visit)elserbinom(n =1,size =1,prob =1- prob_visit) out1 <-list(visit, y %in% plants_by_hummer)return(out1) }) out <-data.frame(mites = x,plants = visited_plants,hummer_visited =as.numeric(sapply(bin_visit, "[[", 2)),mite_visited =sapply(bin_visit, "[[", 1) )return(out) }) dat <-do.call(rbind, out_list)return(dat) }```## OutputSimulated data contains: - mites: mite species ID - plants: plant species ID - hummer_visited: whether that plant was visited by a hummingbird "used" by that mite species - mite_visited: whether that mite visited that plant```{r}sim_data <-sim_networks(n_mites =12,n_plants =15,n_hummers =10,prop_mh =0.3,prop_hp =0.3,prob_visit =0.6)# proportion of plants visited# sum(sim_data$mite_visited) / nrow(sim_data)head(sim_data, 20)```# Simulations## Probability of visiting a flower visited by the hummingbird is 0.5 (expected by chance)```{r, eval = TRUE}sim_data <- sim_networks( n_mites = 12, n_plants = 15, n_hummers = 10, prop_mh = 0.3, prop_hp = 0.3, prob_visit = 0.5, seed = 123)mod_hummers <- glm(mite_visited ~ hummer_visited, data = sim_data, family = "binomial")mod_hummers_mites_plants <- glm(mite_visited ~ hummer_visited + mites + plants, data = sim_data, family = "binomial")mod_hummers_plants <- glm(mite_visited ~ hummer_visited + plants, data = sim_data, family = "binomial")mod_hummers_mites <- glm(mite_visited ~ hummer_visited + mites, data = sim_data, family = "binomial")mod_mites_plants <- glm(mite_visited ~ mites + plants, data = sim_data, family = "binomial")mod_mites_plants_int <- glm(mite_visited ~ hummer_visited * mites, data = sim_data, family = "binomial")null_mod <- glm(mite_visited ~ 1, data = sim_data, family = "binomial")aic_tab <- AIC(mod_mites_plants_int, mod_mites_plants, mod_hummers_mites, mod_hummers_plants, mod_hummers_mites_plants, mod_hummers, null_mod)aic_tab <- aic_tab[order(aic_tab$AIC),]aic_tab$delta.AIC <- aic_tab$AIC - min(aic_tab$AIC)aic_tab```## Probability of visiting a flower visited by the hummingbird is 0.7 (higher than expected by chance)```{r, eval = TRUE}sim_data <- sim_networks( n_mites = 12, n_plants = 15, n_hummers = 10, prop_mh = 0.3, prop_hp = 0.3, prob_visit = 0.7, seed = 123)mod_hummers <- glm(mite_visited ~ hummer_visited, data = sim_data, family = "binomial")mod_hummers_mites_plants <- glm(mite_visited ~ hummer_visited + mites + plants, data = sim_data, family = "binomial")mod_hummers_plants <- glm(mite_visited ~ hummer_visited + plants, data = sim_data, family = "binomial")mod_hummers_mites <- glm(mite_visited ~ hummer_visited + mites, data = sim_data, family = "binomial")mod_mites_plants <- glm(mite_visited ~ mites + plants, data = sim_data, family = "binomial")mod_mites_plants_int <- glm(mite_visited ~ hummer_visited * mites, data = sim_data, family = "binomial")null_mod <- glm(mite_visited ~ 1, data = sim_data, family = "binomial")aic_tab <- AIC(mod_mites_plants_int, mod_mites_plants, mod_hummers_mites, mod_hummers_plants, mod_hummers_mites_plants, mod_hummers, null_mod)aic_tab <- aic_tab[order(aic_tab$AIC),]aic_tab$delta.AIC <- aic_tab$AIC - min(aic_tab$AIC)aic_tab```::: {.alert .alert-success}# Takeaways {.unnumbered .unlisted}- Regression models can detect a "vector" effect in their flower visiting pattern ::: <!-- '---' adds a gray vertical line -->--- <!-- add packages used, system details and versions --># Session information {.unnumbered .unlisted}```{r session info, echo=F}sessionInfo()```