format.function.R 4.51 KiB
###################################################
###################################################
###################################################
##### FUNCTION TO FORMAT DATA FOR THE WORKSHOP ANALYSIS
#########################
## 
##' .. Compute the basal area of competitor in a plot..
##'
##' .. content for \details{} ..
##' @title 
##' @param diam diameters of each individuals in cm
##' @param weights weight to compute the basal area in cm^2/m^2
##' @return basal area in cm^2/m^2 
##' @author Kunstler
BA.fun <- function(diam,weights){
((diam/2)^2)*pi*weights
#### 
##' .. function to compute the basal area of neighborood tree in plots ..
##'
##' .. content for \details{} ..
##' @title 
##' @param id.tree plot identifier
##' @param diam diam of tree in cm
##' @param sp species name or code
##' @param id.plot identifier of the plot
##' @param weights weights to compute basal area in cm^2/m^2 SO THE 1/AREA of teh plot (or subplot) with area in m^2
##' @param weights.full.plot weights for the whole plot to compute basal area in cm^2/m^2 or if NA use weights of the individuals (for simple plots)
##' @return data frame with tree.id and one column per species with basal area of the species (without the target tree)
##' @author Kunstler
BA.SP.FUN <-  function(id.tree,diam,sp,id.plot,weights,weight.full.plot){
# compute BA tot per species per plot
if(!(length(id.tree)==length(diam) & length(id.tree)==length(sp) & length(id.tree)==length(id.plot) & length(id.tree)==length(weights)))
    stop("length of id.tree diam,sp id.plot & weights need to be the same")
sp <- as.character(sp)
BASP <- tapply(BA.fun(diam,weights),INDEX=list(id.plot,sp),FUN=sum,na.rm=T)
print(dim(BASP))
DATA.BASP <-  data.frame(id.plot= rownames(BASP),BASP)
names( DATA.BASP) <- c("id.plot",colnames(BASP)) 
#### MERGE with indivudal tree
data.indiv <- data.frame(id.tree,sp,id.plot,diam,weights)
data.merge <-  merge(data.indiv,DATA.BASP,by="id.plot", sort = FALSE)
## substracte the BA of target species in the column of the good species (with transpose of the matrix )
t.arbre.BASP <- t(as.matrix(data.merge[,-(1:5)]))
if(!is.na(weight.full.plot)){
  t.arbre.BASP[t(outer(data.merge$sp,names(data.merge[,-(1:5)]),FUN="=="))] <-
  t.arbre.BASP[t(outer(data.merge$sp,names(data.merge[,-(1:5)]),FUN="=="))]  -BA.fun(data.merge$diam,rep(weight.full.plot,length(diam)))
  }else{
  t.arbre.BASP[t(outer(data.merge$sp,names(data.merge[,-(1:5)]),FUN="=="))] <-
  t.arbre.BASP[t(outer(data.merge$sp,names(data.merge[,-(1:5)]),FUN="=="))]  -BA.fun(data.merge$diam,data.merge$weights)
data.res <- data.frame(data.merge$id.tree,t(t.arbre.BASP))
names(data.res) <- c("id.tree",colnames(BASP))
return( data.res)
#### function with X Y coordinates based on a neighborhood of radius R
BA.SP.FUN.XY <-  function(id.tree,xy.table,diam,sp,Rlim){
dist.mat <- as.matrix(dist(xy.table,upper=TRUE,diag=TRUE))
dist.mat[dist.mat <Rlim] <- 1
dist.mat[dist.mat >Rlim] <- 0
diag(dist.mat) <- 0
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
BA <- BA.fun(diam,weights=10000/(pi*Rlim^2)) BA.mat <- matrix(rep(BA,length(BA)),nrow=length(BA),byrow=TRUE) fun.sum.sp <- function(x,sp) tapply(x,INDEX=sp,FUN=sum,na.rm=TRUE) return(t(apply(dist.mat*BA.mat,MARGIN=1,FUN=fun.sum.sp ,sp))) } ############################ ## FUNCTION remove trailing white space trim.trailing <- function (x) sub("\\s+$", "", x) ## clean species.tab fun.clean.species.tab <- function(species.tab){ species.tab2 <- species.tab[!is.na(species.tab$Latin_name),] ### species IFN reformat names ## clean species names and synonyme names species.tab2$Latin_name <- (gsub("_", " ", species.tab2$Latin_name)) species.tab2$Latin_name_syn<- (gsub("_", " ", species.tab2$Latin_name_syn)) ## remove trailing white space species.tab2$Latin_name_syn<- trim.trailing(species.tab2$Latin_name_syn) species.clean <- species.tab2[!duplicated(species.tab2$Latin_name), c("code","Latin_name","Exotic_Native_cultivated")] return(species.clean)} ### compute quantile 99% and sd with a bootstrap library(boot) f.quantile <- function (x,ind,probs){quantile(x[ind],probs=probs,na.rm=TRUE)} f.quantile.boot <- function(i,x,fac,R,probs=0.99){ require(boot) if(length(na.exclude(x[fac==i]))>0){ quant.boot <- boot(x[fac==i],f.quantile,R=R,probs=probs) return(as.matrix(c(mean=mean(quant.boot$t),sd=sd(quant.boot$t),nobs=length(na.exclude(x[fac==i]))),ncol=3,nrow=1)) }else{ return(as.matrix(c(mean=NA,sd=NA,nobs=NA),ncol=3,nrow=1)) } } ####################### ### function to compute number of dead per plot function.perc.dead <- function(dead){ sum(dead)/length(dead)}