Mite plant preference

Mite-hummingbird-plant comensalism networks

Author
Published

March 5, 2024

Purpose

  • The first goal of this report

  • The second goal of this report

1 Simulation

1.1 Function to simulate data

Parameters:

  • 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
Code
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 vector
           seed = 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)
        else
          rbinom(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)
  }

1.2 Output

Simulated 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
Code
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)
mites plants hummer_visited mite_visited
m6 p3 1 0
m6 p7 1 1
m6 p11 0 1
m6 p10 1 1
m6 p5 1 0
m6 p2 0 0
m6 p6 1 0
m6 p14 1 1
m6 p1 0 1
m6 p4 0 0
m6 p8 0 0
m6 p9 0 1
m6 p12 1 1
m6 p13 1 0
m6 p15 0 1
m4 p3 1 1
m4 p7 1 0
m4 p11 1 0
m4 p10 1 1
m4 p5 1 1

2 Simulations

2.1 Probability of visiting a flower visited by the hummingbird is 0.5 (expected by chance)

Code
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
df AIC delta.AIC
null_mod 1 230.7325 0.000000
mod_hummers 2 232.2473 1.514777
mod_hummers_mites 12 234.7845 4.052019
mod_mites_plants_int 22 237.8886 7.156074
mod_mites_plants 25 240.3152 9.582644
mod_hummers_plants 16 241.5721 10.839563
mod_hummers_mites_plants 26 241.8975 11.164971

2.2 Probability of visiting a flower visited by the hummingbird is 0.7 (higher than expected by chance)

Code
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
df AIC delta.AIC
mod_hummers 2 194.3888 0.00000
mod_hummers_mites 12 204.9242 10.53536
mod_mites_plants_int 22 205.0163 10.62750
mod_hummers_plants 16 208.0262 13.63733
mod_hummers_mites_plants 26 217.3070 22.91813
null_mod 1 228.0586 33.66973
mod_mites_plants 25 248.2047 53.81589

Takeaways

  • 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