我的问题:需要从一组集合中找到所有不重叠的集合。
背景:我正在使用比较进化方法研究鸟类特征演化。我有一棵包含大约300个物种的树。这棵树可以被分成子类(即子树)。如果两个子类没有共同的物种,它们是独立的。我正在寻找一种算法(如果可能的话,还需要一个R实现),它将找到所有可能的子类分区,每个子类都有大于10个生物分类单元,并且所有子类都是独立的。每个子类都可以被视为一个集合,当两个子类是独立的(没有共同的物种)时,这些子类就是不相交的集合。
希望这很清楚,希望有人能够提供帮助。
以下代码生成一个示例数据集。其中,子类是一个包含所有可能子类(集合)的列表,我想从中采样X个不相交的集合,而集合长度为Y。
背景:我正在使用比较进化方法研究鸟类特征演化。我有一棵包含大约300个物种的树。这棵树可以被分成子类(即子树)。如果两个子类没有共同的物种,它们是独立的。我正在寻找一种算法(如果可能的话,还需要一个R实现),它将找到所有可能的子类分区,每个子类都有大于10个生物分类单元,并且所有子类都是独立的。每个子类都可以被视为一个集合,当两个子类是独立的(没有共同的物种)时,这些子类就是不相交的集合。
希望这很清楚,希望有人能够提供帮助。
以下代码生成一个示例数据集。其中,子类是一个包含所有可能子类(集合)的列表,我想从中采样X个不相交的集合,而集合长度为Y。
###################################
# Example Dataset
###################################
library(ape)
library(phangorn)
library(TreeSim)
library(phytools)
##simulate a tree
n.taxa <- 300
tree <- sim.bd.taxa(n.taxa,1,lambda=.5,mu=0)[[1]][[1]]
tree$tip.label <- seq(n.taxa)
##extract all monophyletic subclades
get.all.subclades <- function(tree){
tmp <- vector("list")
nodes <- sort(unique(tree$edge[,1]))
i <- 282
for(i in 1:length(nodes)){
x <- Descendants(tree,nodes[i],type="tips")[[1]]
tmp[[i]] <- tree$tip.label[x]
}
tmp
}
tmp <- get.all.subclades(tree)
##set bounds on the maximum and mininum number of tips of the subclades to include
min.subclade.n.tip <- 10
max.subclade.n.tip <- 40
##function to replace trees of tip length exceeding max and min with NA
replace.trees <- function(x, min, max){
if(length(x) >= min & length(x)<= max) x else NA
}
#apply testNtip across all the subclades
tmp2 <- lapply(tmp, replace.trees, min = min.subclade.n.tip, max = max.subclade.n.tip)
##remove elements from list with NA,
##all remaining elements are subclades with number of tips between
##min.subclade.n.tip and max.subclade.n.tip
subclades <- tmp2[!is.na(tmp2)]
names(subclades) <- seq(length(subclades))
length(clade.x) >=10
,然后在该子集的所有组合上运行intersect
。 - Carl Witthofti <- 3; j <- 4; length(intersect(A[[i]],A[[j]]))>0
- Stéphane Laurent