tree<-read.tree("rockfish.phy")
library(ape);library(geiger);library(ouch);library(vegan)
library(ape);library(geiger);library(vegan)#
#
litdata<-read.csv("litdata_mar10.csv",row.names=1)#
#tree in newick format#
tree<-read.tree("rockfish.phy")#
#file with trait data for each species (rownames are species names, same as tree tip labels)#
sebdata<-read.csv("spmeans_RMAres_NEP.csv",row.names=1)#
#file with community data: rownames are species, column names are different communities, species presence/absence coded as 1/0#
comdata<-read.csv("/Users/ingram/Documents/Rockfish/ Assembly MS 2008/NOAA surveys/comdata_June23_08.csv",row.names=1)#
#file with additional community info (mostly depth and latitude)#
comnotes<-read.csv("/Users/ingram/Documents/Rockfish/ Assembly MS 2008/NOAA surveys/comnotes_June23_08.csv",row.names=1)
sebdata<-read.csv("rockfish_traits.csv",row.names=1)
comdata<-read.csv("community_presabs.csv",row.names=1)
comnotes<-read.csv("community_info.csv",row.names=1)
rownames(comdata)[c(80,52)]
tree$tip.label
rownames(comdata)[c(80,52)]
comdata<-read.csv("community_presabs.csv",row.names=1)
rownames(comdata)[c(80,52)]
tree$tip.label%in%rownames(sebdata)==FALSE]
tree$tip.label%in%rownames(sebdata)==FALSE
sebdata[tree$tip.label,]
comdata[tree$tip.label,]
litdata[tree$tip.label,]
names(comdata)
rownames(comdata)
sebdata<-sebdata[tree$tip.label,]#
comdata<-comdata[tree$tip.label,]#
litdata<-litdata[tree$tip.label,]
rownames(comdata)
library(ape);library(geiger);library(vegan)#
#
litdata<-read.csv("litdata_mar10.csv",row.names=1)#
#tree in newick format#
tree<-read.tree("rockfish.phy")#
#file with trait data for each species (rownames are species names, same as tree tip labels)#
sebdata<-read.csv("rockfish_traits.csv",row.names=1)#
#file with community data: rownames are species, column names are different communities, species presence/absence coded as 1/0#
comdata<-read.csv("community_presabs.csv",row.names=1)#
#file with additional community info (mostly depth and latitude)#
comnotes<-read.csv("community_info.csv",row.names=1)#
#
#remove any species from tree that aren't represented in trait data (have all NEP species described by 2007)#
tree<-drop.tip(tree,tree$tip.label[tree$tip.label%in%rownames(sebdata)==FALSE])#
#
#also drop two species that couldn't have been in the community data (recently described cryptic species)#
tree<-drop.tip(tree,c("Sebastes_melanostictus","Sebastes_variabilis"))
sebdata<-sebdata[tree$tip.label,]#
comdata<-comdata[tree$tip.label,]#
litdata<-litdata[tree$tip.label,]
dim(sebdata)
tree$tip.label
library(ape);library(geiger);library(vegan)#
#
litdata<-read.csv("litdata_mar10.csv",row.names=1)#
#tree in newick format#
tree<-read.tree("rockfish.phy")#
#file with trait data for each species (rownames are species names, same as tree tip labels)#
sebdata<-read.csv("rockfish_traits.csv",row.names=1)#
#file with community data: rownames are species, column names are different communities, species presence/absence coded as 1/0#
comdata<-read.csv("community_presabs.csv",row.names=1)#
#file with additional community info (mostly depth and latitude)#
comnotes<-read.csv("community_info.csv",row.names=1)
tree$tip.label%in%rownames(sebdata)==FALSE
drop.tip(tree,c("Sebastes_melanostictus","Sebastes_variabilis"))
tree<-drop.tip(tree,c("Sebastes_melanostictus","Sebastes_variabilis"))
sebdata<-sebdata[tree$tip.label,]#
comdata<-comdata[tree$tip.label,]#
litdata<-litdata[tree$tip.label,]
dim(sebdata)
dim(litdata)
dim(comdata)
rownames(comdata)
dim(comdata)
apply(comdata,2,sum)
comlats<-comnotes$latitude#
pooldata<-comdata#
#add species whose lat. ranges overlap the study area#
for(j in 1:dim(comdata)[2]){#
	for(i in 1:dim(comdata)[1]){#
		if(litdata$max_lat[i]>=comlats[j]&litdata$min_lat[i]<=comlats[j])pooldata[i,j]<-1#
		}#
	}
pooldata
calc.comstruct<-function(comdata,pooltree,pooltrait,nsims){#
	com<-which(comdata==1);n<-length(com)#
#patristic (branch length) distances between species#
	treedist<-cophenetic(pooltree)#
	comtreedist<-treedist[com,com];diag(comtreedist)<-NA#
#mean nearest neighbor distance	(closest relative only)#
	MNND<-mean(apply(comtreedist,1,min,na.rm=T))#
#mean phylogenetic distance (between all species)#
	MPD<-mean(comtreedist,na.rm=T)#
#trait data#
	pooltrait<-as.matrix(pooltrait);ntrait<-dim(pooltrait)[2]#
	simrangetrait<-rangetrait<-simSRtrait<-SRtrait<-numeric(ntrait)#
for(m in 1:ntrait){#
#sort traits for calculating neighbor distances#
	comtrait<-sort(pooltrait[com,m])#
#range of trait values#
	rangetrait[m]<-max(comtrait)-min(comtrait)#
#neighbor distances (ND - should all be positive)#
	traitdist<-diff(comtrait)#
#sd(ND)/range as described in paper#
	SRtrait[m]<-sd(traitdist)/(max(comtrait)-min(comtrait))#
}#
#initiate matrix for output of function#
sims<-matrix(NA,nrow=(nsims+1),ncol=(2+2*ntrait))#
	colnames(sims)<-c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1:ntrait,sep=""))#
#first row is observed values: phylogenetic metrics, then range and sd(ND)/range for each trait#
	sims[1,]<-c(MNND,MPD,rangetrait,SRtrait)#
#simulate communities by sampling equal numbers of species as in the original community from whatever regional pool is being used#
for(k in 2:(nsims+1)){#
	simcom<-sample(1:length(comdata),n,replace=F)#
#tree#
	simtreedist<-treedist[simcom,simcom];diag(simtreedist)<-NA#
	simMNND<-mean(apply(simtreedist,1,min,na.rm=T))#
	simMPD<-mean(simtreedist,na.rm=T)#
#traits	#
for(m in 1:ntrait){#
	simtrait<-sort(pooltrait[simcom,m])#
	simrangetrait[m]<-max(simtrait)-min(simtrait)#
	simtraitdist<-diff(simtrait)#
	simSRtrait[m]<-sd(simtraitdist)/(max(simtrait)-min(simtrait))#
	}#
	sims[k,]<-c(simMNND,simMPD,simrangetrait,simSRtrait)#
}#
#the matrix of observed and simulated metrics is returned by the function#
return(sims)#
}
indices<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=8,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:3,sep=""),paste("SRtrait",1:3,sep="")))))
dim(sebdata)[2]
ntrait=4
com_out<-list()#
indices<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))
2+ntrait
paste("SRtrait",1: ntrait,sep="")
com_out<-list()#
indices<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))
indices
for(i in 1:dim(comdata)[2]){#
#save the output matrix for each community as an element in a list#
	com_out[[i]]<-data.frame(calc.comstruct(comdata[,i],pooltree=tree,pooltrait=sebdata[,1:ntrait],nsims=99))#
#calculate the index for each metric (check that sign is correct - as set up, positive values indicate lower range or lower SD(nd)/range#
	for(j in 1:dim(indices)[2]){#
		indices[i,j]<-(-1)*(com_out[[i]][1,j]-mean(com_out[[i]][-1,j]))/sd(com_out[[i]][-1,j])#
	}#
}
indices
plot(indices)
hist(indices$MNND)
t.test(indices$MNND)
	print(names(indices)[i])
for(i in 1:dim(indices)[2]){#
	print(names(indices)[i])#
	t.test(indices[,i])#
}
for(i in 1:dim(indices)[2]){#
	print(names(indices)[i])#
	print(t.test(indices[,i]))#
}
p_matrix<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))
for(i in 1:dim(comdata)[2]){#
	for(j in 1:dim(indices)[2]){#
		p_matrix[i,j]<-abs((sum(com_out[[i]][-1,j]<com_out[[i]][1,j])/length(com_out[[i]][,j]))-0.5)>0.475	#
	}#
}
p_matrix
indices
for(i in 1:dim(indices)[2]){#
	print(names(indices)[i])#
	print(t.test(indices[,i]))#
}
p_matrix
which(p_matrix[,8])
com_out[[22]]
com_out<-list()#
indices<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))#
for(i in 1:dim(comdata)[2]){#
#save the output matrix for each community as an element in a list#
	com_out[[i]]<-data.frame(calc.comstruct(comdata[,i],pooltree=tree,pooltrait=sebdata[,1:ntrait],nsims=999))#
#calculate the index for each metric (check that sign is correct - as set up, positive values indicate lower range or lower SD(nd)/range#
	for(j in 1:dim(indices)[2]){#
		indices[i,j]<-(-1)*(com_out[[i]][1,j]-mean(com_out[[i]][-1,j]))/sd(com_out[[i]][-1,j])#
	}#
}
for(i in 1:dim(indices)[2]){#
	print(names(indices)[i])#
	print(t.test(indices[,i]))#
}
p_matrix<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))#
for(i in 1:dim(comdata)[2]){#
	for(j in 1:dim(indices)[2]){#
		p_matrix[i,j]<-abs((sum(com_out[[i]][-1,j]<com_out[[i]][1,j])/length(com_out[[i]][,j]))-0.5)>0.475	#
	}#
}
p_matrix
which(p_matrix[,8])
hist(com_out[[22]][,8])
abline(com_out[[22]][1,8])
abline(v=com_out[[22]][1,8])
hist(com_out[[30]][,7])
abline(v=com_out[[30]][1,7])
plot(indices[,c(3,7)])
plot(indices[,c(3,7)]);abline(h=0,v=0)
plot(indices[,c(6,10)]);abline(h=0,v=0)
plot(indices[,c(4,8)]);abline(h=0,v=0)
p_matrix<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))#
for(i in 1:dim(comdata)[2]){#
	for(j in 1:dim(indices)[2]){#
		p_matrix[i,j]<-abs((sum(com_out[[i]][-1,j]<com_out[[i]][1,j])/length(com_out[[i]][,j]))-0.5)#>0.475	#
	}#
}
p_matrix
p_matrix<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))#
for(i in 1:dim(comdata)[2]){#
	for(j in 1:dim(indices)[2]){#
		p_matrix[i,j]<-sum(com_out[[i]][-1,j]<com_out[[i]][1,j])/length(com_out[[i]][,j])#
#		p_matrix[i,j]<-abs((sum(com_out[[i]][-1,j]<com_out[[i]][1,j])/length(com_out[[i]][,j]))-0.5)>0.475	#
	}#
}
p_matrix
for(i in 1:dim(indices)[2]){#
	print(names(indices)[i])#
	print(t.test(indices[,i]))#
}
i=0#
i=i+1#
hist(com_out[[i]][,6]);abline(v=com_out[[i]][1,6],col="red")
i=i+1#
hist(com_out[[i]][,6]);abline(v=com_out[[i]][1,6],col="red")
i=0
i=i+1#
hist(com_out[[i]][,8]);abline(v=com_out[[i]][1,8],col="red")
t.test(p_matrix[,8])
t.test(p_matrix[,8],null=0.5)
?t.test
t.test(p_matrix[,8],mu=0.5)
t.test(p_matrix[,6],mu=0.5)
p_matrix<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))#
for(i in 1:dim(comdata)[2]){#
	for(j in 1:dim(indices)[2]){#
		p_matrix[i,j]<-sum(com_out[[i]][-1,j]>com_out[[i]][1,j])/length(com_out[[i]][,j])#
	}#
}
t.test(p_matrix[,6],mu=0.5)
t.test(p_matrix[,8],mu=0.5)
for(i in 1:dim(indices)[2]){#
	print(names(indices)[i])#
	print(t.test(indices[,i]))#
}
mean(sebdata[comdata[,1],4])
range(sebdata[comdata[,1],4])
comdata[,1]
sebdata[comdata[,1],4]
range(sebdata[which(comdata[,1]),4])
which(comdata[,1])
range(sebdata[which(comdata[,1]==1),4])
range(sebdata[which(comdata[,1]==1),4])#
null_ranges<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		x<-x+diff(range(sebdata[sample(1:dim(sebdata)[1],i),4]))#
		}#
	x<-x/50#
}
#
range(sebdata[which(comdata[,1]==1),4])#
null_ranges<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		x<-x+diff(range(sebdata[sample(1:dim(sebdata)[1],i),4]))#
		}#
	null_ranges[i]<-x/50#
}
null_ranges
plot(null_ranges)
Nsp<-apply(comdata,2,sum)
for(i in 1:30){#
	points(Nsp[i],diff(range(sebdata[which(comdata[,i]==1),4])),col="red")#
}
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),4]#
		x<-sd(y)/diff(range(y))#
		}#
	null_even[i]<-x/50#
}
plot(null_even)
for(i in 1:30){#
	points(Nsp[i],sd(diff(sebdata[which(comdata[,i]==1),4]))/diff(range(sebdata[which(comdata[,i]==1),4])),col="red")#
}
sd(diff(sebdata[which(comdata[,i]==1),4]))
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),4])))/diff(range(sebdata[which(comdata[,i]==1),4])),col="red")#
}
sd(diff(sort(sebdata[which(comdata[,i]==1),4])))/diff(range(sebdata[which(comdata[,i]==1),4]))
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),8]#
		x<-sd(diff(y))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}
sebdata[sample(1:dim(sebdata)[1],i),8]
sebdata[sample(1:dim(sebdata)[1],i),4]
		y<-sebdata[sample(1:dim(sebdata)[1],i),4]
y
sd(diff(y))/diff(range(y))
diff(range(y))
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),4]#
		x<-sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),4])))/diff(range(sebdata[which(comdata[,i]==1),4])),col="red")#
}
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),8]#
		x<-sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}		#
#
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),4])))/diff(range(sebdata[which(comdata[,i]==1),8])),col="red")#
}
null_even
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),8]#
		x<-sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}
null_even<-numeric(40)#
for(i in 5:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),8]#
		x<-sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}
y
sebdata[sample(1:dim(sebdata)[1],i),8]
null_even<-numeric(40)#
for(i in 5:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),2]#
		x<-sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}		#
#
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2])),col="red")#
}
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),2]#
		x<-sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}		#
#
plot(null_even)
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2])),col="red")#
}
sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2]))
diff(sort(sebdata[which(comdata[,i]==1),2]))
sort(sebdata[which(comdata[,i]==1),2])
diff(range(sebdata[which(comdata[,i]==1),2]))
sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2]))
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),2]#
		x<-x+sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}
plot(null_even)
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2])),col="red")#
}
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),3]#
		x<-x+sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),3])))/diff(range(sebdata[which(comdata[,i]==1),3])),col="red")#
}
names(sebdata)
null_ranges<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		x<-x+diff(range(sebdata[sample(1:dim(sebdata)[1],i),4]))#
		}#
	null_ranges[i]<-x/50#
}		#
		#
plot(null_ranges)#
#
for(i in 1:30){#
	points(Nsp[i],diff(range(sebdata[which(comdata[,i]==1),4])),col="red")#
}
null_even<-numeric(40)#
for(i in 2:40){#
	x<-0#
	for(j in 1:50){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),2]#
		x<-x+sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}		#
#
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2])),col="red")#
}
null_ranges<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		x<-x+diff(range(sebdata[sample(1:dim(sebdata)[1],i),4]))#
		}#
	null_ranges[i]<-x/50#
}		#
		#
plot(null_ranges)#
#
for(i in 1:30){#
	points(Nsp[i],diff(range(sebdata[which(comdata[,i]==1),4])),col="red")#
}
#
null_ranges<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		x<-x+diff(range(sebdata[sample(1:dim(sebdata)[1],i),4]))#
		}#
	null_ranges[i]<-x/100#
}		#
		#
plot(null_ranges)#
#
for(i in 1:30){#
	points(Nsp[i],diff(range(sebdata[which(comdata[,i]==1),4])),col="red")#
}
null_even<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),2]#
		x<-x+sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/50#
}		#
#
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2])),col="red")#
}
null_even<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),2]#
		x<-x+sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/100#
}		#
#
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2])),col="red")#
}
library(ape);library(geiger);library(vegan)#
#
#tree in newick format#
tree<-read.tree("rockfish.phy")#
#file with trait data for each species (rownames are species names, same as tree tip labels)#
sebdata<-read.csv("Sebastes_PCA_scores_for_comphy.csv",row.names=1)
comdata<-read.csv("community_presabs.csv",row.names=1)#
#optional file with info on communities (e.g. depth and latitude)#
comnotes<-read.csv("community_info.csv",row.names=1)
which(tree$tip.label%in%rownames(sebdata)==FALSE)
drop.tip(tree,which(tree$tip.label%in%rownames(sebdata)==FALSE))
tree<-drop.tip(tree,which(tree$tip.label%in%rownames(sebdata)==FALSE))
rownames(sebdata)
library(ape);library(geiger);library(vegan)#
#
#tree in newick format#
tree<-read.tree("rockfish.phy")#
#file with trait data for each species (rownames are species names, same as tree tip labels)#
sebdata<-read.csv("rockfish_PC_traits.csv",row.names=1)#
#file with community data: rownames are species, column names are different communities, species presence/absence coded as 1/0#
comdata<-read.csv("community_presabs.csv",row.names=1)#
#optional file with info on communities (e.g. depth and latitude)#
comnotes<-read.csv("community_info.csv",row.names=1)
tree<-drop.tip(tree,which(tree$tip.label%in%rownames(sebdata)==FALSE))
tree
tree$tip.label
sebdata<-sebdata[tree$tip.label,]#
comdata<-comdata[tree$tip.label,]#
litdata<-litdata[tree$tip.label,]
ntrait<-dim(sebdata)[2]
ntrait
Nsp<-apply(comdata,2,sum)
Nsp
calc.comstruct<-function(comdata,pooltree,pooltrait,nsims){#
	com<-which(comdata==1);n<-length(com)#
#patristic (branch length) distances between species#
	treedist<-cophenetic(pooltree)#
	comtreedist<-treedist[com,com];diag(comtreedist)<-NA#
#mean nearest neighbor distance	(closest relative only)#
	MNND<-mean(apply(comtreedist,1,min,na.rm=T))#
#mean phylogenetic distance (between all species)#
	MPD<-mean(comtreedist,na.rm=T)#
#trait data#
	pooltrait<-as.matrix(pooltrait);ntrait<-dim(pooltrait)[2]#
	simrangetrait<-rangetrait<-simSRtrait<-SRtrait<-numeric(ntrait)#
for(m in 1:ntrait){#
#sort traits for calculating neighbor distances#
	comtrait<-sort(pooltrait[com,m])#
#range of trait values#
	rangetrait[m]<-max(comtrait)-min(comtrait)#
#neighbor distances (ND - should all be positive)#
	traitdist<-diff(comtrait)#
#sd(ND)/range as described in paper#
	SRtrait[m]<-sd(traitdist)/(max(comtrait)-min(comtrait))#
}#
#initiate matrix for output of function#
sims<-matrix(NA,nrow=(nsims+1),ncol=(2+2*ntrait))#
	colnames(sims)<-c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1:ntrait,sep=""))#
#first row is observed values: phylogenetic metrics, then range and sd(ND)/range for each trait#
	sims[1,]<-c(MNND,MPD,rangetrait,SRtrait)#
#simulate communities by sampling equal numbers of species as in the original community from whatever regional pool is being used#
for(k in 2:(nsims+1)){#
	simcom<-sample(1:length(comdata),n,replace=F)#
#tree#
	simtreedist<-treedist[simcom,simcom];diag(simtreedist)<-NA#
	simMNND<-mean(apply(simtreedist,1,min,na.rm=T))#
	simMPD<-mean(simtreedist,na.rm=T)#
#traits	#
for(m in 1:ntrait){#
	simtrait<-sort(pooltrait[simcom,m])#
	simrangetrait[m]<-max(simtrait)-min(simtrait)#
	simtraitdist<-diff(simtrait)#
	simSRtrait[m]<-sd(simtraitdist)/(max(simtrait)-min(simtrait))#
	}#
	sims[k,]<-c(simMNND,simMPD,simrangetrait,simSRtrait)#
}#
#the matrix of observed and simulated metrics is returned by the function#
return(sims)#
}
com_out<-list()#
indices<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))
for(i in 1:dim(comdata)[2]){#
#save the output matrix for each community as an element in a list#
	com_out[[i]]<-data.frame(calc.comstruct(comdata[,i],pooltree=tree,pooltrait=sebdata[,1:ntrait],nsims=999))#
#calculate the index for each metric (check that sign is correct - as set up, positive values indicate lower range or lower SD(nd)/range#
for(j in 1:dim(indices)[2]){#
	indices[i,j]<-(-1)*(com_out[[i]][1,j]-mean(com_out[[i]][-1,j]))/sd(com_out[[i]][-1,j])#
	}#
}
plot(indices)
for(i in 1:dim(indices)[2]){#
	print(names(indices)[i])#
	print(t.test(indices[,i]))#
}
p_matrix<-data.frame(matrix(NA,nrow=dim(comdata)[2],ncol=2+2*ntrait,dimnames=list(colnames(comdata),c("MNND","MPD",paste("rangetrait",1:ntrait,sep=""),paste("SRtrait",1: ntrait,sep="")))))#
for(i in 1:dim(comdata)[2]){#
	for(j in 1:dim(indices)[2]){#
		p_matrix[i,j]<-sum(com_out[[i]][-1,j]>com_out[[i]][1,j])/length(com_out[[i]][,j])#
	}#
}
null_ranges<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		x<-x+diff(range(sebdata[sample(1:dim(sebdata)[1],i),4]))#
		}#
	null_ranges[i]<-x/100#
}
null_ranges<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		x<-x+diff(range(sebdata[sample(1:dim(sebdata)[1],i),3]))#
		}#
	null_ranges[i]<-x/100#
}		#
		#
plot(null_ranges)#
#
for(i in 1:30){#
	points(Nsp[i],diff(range(sebdata[which(comdata[,i]==1),3])),col="red")#
}
null_even<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		y<-sebdata[sample(1:dim(sebdata)[1],i),2]#
		x<-x+sd(diff(sort(y)))/diff(range(y))#
		}#
	null_even[i]<-x/100#
}		#
#
plot(null_even)#
for(i in 1:30){#
	points(Nsp[i],sd(diff(sort(sebdata[which(comdata[,i]==1),2])))/diff(range(sebdata[which(comdata[,i]==1),2])),col="red")#
}
null_ranges<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		x<-x+diff(range(traits[sample(1:dim(traits)[1],i),3]))#
		}#
	null_ranges[i]<-x/100#
}		#
		#
plot(null_ranges)#
#
for(i in 1:30){#
	points(Nsp[i],diff(range(traits[which(comdata[,i]==1),3])),col="red")#
}
traits<-read.csv("rockfish_PC_traits.csv",row.names=1)
traits<-traits[tree$tip.label,]
null_ranges<-numeric(25)#
for(i in 2:25){#
	x<-0#
	for(j in 1:100){#
		x<-x+diff(range(traits[sample(1:dim(traits)[1],i),3]))#
		}#
	null_ranges[i]<-x/100#
}
plot(null_ranges)
for(i in 1:30){#
	points(Nsp[i],diff(range(traits[which(comdata[,i]==1),3])),col="red")#
}
