Моделируйте стохастическую двудольную сеть на основе значений признаков видов - в R

Я хотел бы создать двудольные сети в R. Например, если у вас есть data.frame двух типов видов (которые могут взаимодействовать только между видами, а не внутри видов), и каждый вид имеет значение признака (например, размер «пасть в хищнике» позволяет кому есть какие виды добычи), как моделировать сеть на основе характеристик вида (то есть, два вида могут взаимодействовать только в том случае, если их черты совпадают по значениям, например)?

ОБНОВЛЕНИЕ: вот минимальный пример того, что я пытаюсь сделать. 1) создать филогенетическое дерево; 2) моделировать черты по филогенезу; 3) создавать сети, основанные на ценностях видовых признаков.

# packages
install.packages(c("ape","phytools"))
library(ape); library(phytools)

# Make phylogenetic trees
tree_predator <- rcoal(10)
tree_prey <- rcoal(10)

# Simulate traits on each tree
trait_predator <- fastBM(tree_predator)
trait_prey <- fastBM(tree_prey)

# Create network of predator and prey
## This is the part I can't do yet. I want to create bipartite networks, where 
## predator and prey interact based on certain crriteria. For example, predator
## species A and prey species B only interact if their body size ratio is
## greater than X.

person sckott    schedule 27.08.2012    source источник
comment
можешь быть более конкретным? для начала, вы можете моделировать значения признаков, используя любое разумное случайное распределение (например, логнормальное - ›rlnorm) и бинарное взаимодействие (ест / не ест) либо на основе отсечки (например, хищники съедают всю добычу, где соотношение размеров меньше чем порог), или с помощью механизма типа логистической регрессии. Немного подробнее о том, каких результатов вы ожидаете, очень поможет ...   -  person Ben Bolker    schedule 28.08.2012
comment
@BenBolker Верно, я определенно могу моделировать черты характера, в данном случае я использую phytools :: fastBM. Скоро обновлю сообщение примером ...   -  person sckott    schedule 28.08.2012
comment
@BenBolker Отредактировал сообщение с минимальным примером того, что я пытаюсь сделать.   -  person sckott    schedule 28.08.2012


Ответы (1)


Формат ответа действительно зависит от того, что вы хотите сделать дальше, но вот попытка:

set.seed(101)
npred <- nprey <- 10
tree_predator <- rcoal(npred)
tree_prey <- rcoal(nprey)

## Simulate traits on each tree
trait_predator <- fastBM(tree_predator)
trait_prey <- fastBM(tree_prey)

(Я использовал set.seed(101) для воспроизводимости, так что это результаты моих черт ...

> trait_predator
         t1          t9          t4          t8          t5          t2 
-2.30933392 -3.17387148 -0.01447305 -0.01293273 -0.25483749  1.87279355 
         t6         t10          t3          t7 
 0.70646610  0.79508740  0.05293099  0.00774235 
> trait_prey
         t10           t7           t9           t6           t8           t1 
 0.849256948 -0.790261142  0.305520218 -0.182596793 -0.033589511 -0.001545289 
          t4           t5           t3           t2 
-0.312790794  0.475377720 -0.222128629 -0.095045954 

...)

Значения, которые вы сгенерировали, находятся в неограниченном пространстве, поэтому на самом деле нет смысла брать их отношения; мы предположим, что это логарифмы размера, поэтому exp(x-y) будет соотношением размера хищника / жертвы. Произвольно, я предполагаю, что отсечка составляет 1,5 ...

Используйте outer для сравнения всех признаков хищника и жертвы: это создает двоичную (0/1) матрицу.

bmatrix <- outer(trait_predator,trait_prey,
      function(x,y) as.numeric(exp(x-y)>1.5))

Один из способов визуализировать результаты ...

library(Matrix)
image(Matrix(bmatrix),xlab="Prey",ylab="Predator",sub="")

введите описание изображения здесь

Вы можете видеть, например, что хищник №6 (помеченный t2 в выходных данных выше) действительно большой (размер журнала = 1,87), поэтому он поедает все виды добычи ...

Использование igraph (некоторые из моих подходов здесь немного взломаны)

library(igraph)

edges <- which(bmatrix==1,arr.ind=TRUE)  ## extract vertex numbers
## distinguish prey (columns) from pred (rows)
edges[,2] <- npred+edges[,2]             

gg <- graph.bipartite(rep(1:0,c(npred,nprey)),
             c(t(edges))) 
## c(t(edges)) collapses the two-column matrix to a vector in row order ...
## now plot ...
plot(gg,vertex.color=rep(c("cyan","pink"),c(npred,nprey)),
     edge.arrow.mode=">")

Это соответствует формату матрицы выше - хищники 1 и 2 (= вершины 1 и 2) никого не едят, добыча 2 (= вершина 12) поедается множеством разных хищников ... Это представление красивее, но не обязательно яснее ( например, оба хищника 7 и 8 съедают добычу 2 (вершина 12), но их стрелки совпадают). Однако иметь его в форме igraph может быть неплохо, если вы хотите применить теоретико-графические подходы (и существует множество вариантов компоновки для построения графиков).

введите описание изображения здесь

person Ben Bolker    schedule 28.08.2012
comment
Спасибо, я думаю, это то, что мне нужно! - person sckott; 28.08.2012