======André Luiz Giles ======
{{:bie5782:01_curso_atual:alunos:trabalho_final:andre.giles.oliveira:giles.jpg?200|}}
Doutorando em ecologia pela UNICAMP-IB. Possuí interesse em Ecologia funcional de plantas e desenvolve projetos relacionados com efeitos da seca no solo em ecossistemas tropicas. Possui enfoque nos efeitos da seca como determinantes de um novo estágio na vegetação e a relação hídrica e de carbono em plantas.
[[.:exec]]
**PROPOSTA A**
/**/Descrição da função:
“str.community”
A função irá calcular parâmetros para análises exploratórias de dados de comunidades vegetais. A função calculará por cada unidade amostral (parcela, ponto quadrante, área) ou pelo total de amostragem os seguintes parâmetros: área basal, densidade, altura máxima, altura média, altura min, número total de espécies, nº de famílias, Riqueza rarefeita para o menor número de indivíduos, diversidade, equabilidade, diâmetro max, diâmetro min, diâmetro médio. A função também calculará os parâmetros por espécies: Frequência absoluta e relativa, dominância absoluta e relativa, densidade absoluta e relativa, diâmetro médio (max e min), altura média (max e min), índice de valor de importância.
**Entrada dos dados:**
A entrada dos dados deverá ser um data frame, contendo as espécies nas linhas e valores de altura, diâmetro e área de amostragem nas colunas.
Os argumentos da função serão: (x)= data.frame, method= (ponto quadrante ou parcela), param= (“total” se calculado como uma única coluna ou “sep” se calculado por unidades distintas descriminados nas colunas do data frame).
A função irá incorporar os argumentos da função “hist.” para realizar o gráfico de distribuição diamétrica e de altura, e da função “plot” para riqueza em espécies.
**Saída da função:** A função irá retornar um data frame, contendo os índices e parâmetros citado acima e dois gráficos representado riqueza de espécies e distribuição diâmétrica.
Olá André,
Interessante sua função, só fiquei com algumas dúvidas. As linhas do df de entrada contém as espécies vegetais, ou um indivíduo? Não faz sentido pra mim que as linhas sejam espécies, sendo que uma linha é uma observação. No caso mais simples, você teria um indivíduo por espécie vegetal. Esclarece isso melhor. Outra coisa, você vai calcular vetores com novas variáveis e diversos parâmetros que não terão o mesmo comprimento, pelo que a saída não pode ser UM data frame. Talvez você pode adicionar as novas variáveis ao df inicial e criar outro com os parâmetros descritivos calculados, e retornar tudo numa lista. Eu aconselho você ir em frente com essa proposta seguindo minhas sugestoes se concordar. Att, --- //[[gustavo.a.agudelo@gmail.com|Gustavo Agudelo]] 2017/06/02 19:13//
**PROPOSTA B**
/**/Descrição da função:
“nsc.test”
A função irá calcular a quantidade de carboidratos não estruturais a partir de data.frames numéricos com valores de massa, absorbância de amostras e absorbância de referência. Esse cálculo é feito baseado na comparação de curvas de absorbância com amostras de referência (apenas com enzimas e agua) e as amostras de interesse.
Eixo x = OD (optical density = absorbância)
Eixo y = [Glucose] mg / mL
Os valores de [glicose] mg / mL para as amostras usando a equação de sua curva padrão
Y = m * x + b
[Glucose] mg / mL = m (OD) + b (b=(intercept))
/**/Após isso é necessária a conversão de unidades para % de peso seco:
{{ :bie5782:01_curso_atual:alunos:trabalho_final:andre.giles.oliveira:aaaa.jpg?nolink |}}
Por fim
as concentrações de açúcares NSC
Glucose / Frutose = Quantidade de glicose da placa de "açúcares livres"
Sacarose = quantidade de glicose da placa "açúcares livres + sacarose", menos a quantidade de glicose da placa de "açúcares livres"
Amido = quantidade de glicose da placa "NSC total", menos a quantidade de glicose da placa "açúcares livres + sacarose"
NSC = Quantidade de glicose da placa "NSC total"
**Entrada dos dados:** A entrada dos dados deverá ser três data frame ou três matrizes. A primeira contendo os valores de absorbância de cada amostra e respectivas enzimas, o segundo contendo a massa (pesagem previa) das amostras.
Os argumentos da função serão: (x)= data.frame ou matrix da amostra, (y)= data.frame ou matrix da amostra de referência, (z)= data.frame ou matrix com massa das amostras, enzima= (GHK-PGI, Invertase, Amyloglucosidas).
**Saída da função:** A função ira retornar um data frame, contendo os valores de Amido, NSC total, sacarose, glucose e frutose.
[[.:Consulte aqui o documento referente a função da proposta B]]
André,
Pelo que entendi, você pretende calcular os valores de Amido, NSC total, sacarose, glucose e frutose a partir dos valores preditos por um modelo linear que incluiria as absorbâncias das amostras e dos controles, aplicando depois uma conversão usando a variável massa. É isso? Se for, você pode colocar todas esas variáveis em um só df de entrada e não precisaria de três. Depois de ajustar o modelo, você pode extrair os valores preditos pelo modelo e adicionar colunas ao df inicial que contenham os valores corrigidos pela massa. Seria legal que a função retornasse um diagnóstico gráfico desse modelo para o usuário avaliar se precisa transformar as variáveis (seria viável colocar um argumento de transformação?), e assim (des)transformar de novo ao se calcular os valores reais das variáveis de interesse. --- //[[gustavo.a.agudelo@gmail.com|Gustavo Agudelo]] 2017/06/02 19:24//
====TRABALHO FINAL=====
====Código da Função====
/**/Função:
“str.community”
str.community=function(dados, method, estimativa="CAP", dim.plot)
{
if(class(dados) != "data.frame")
{
stop( "o objeto não é um dataframe")
}
else
if(method=="parcela")
{
###### Garantindo que o R irá ler corretamente os dados####
dados[,1]= as.factor(dados[,1])
dados[,5]= as.numeric(dados[,5])
dados[,6]=as.numeric(dados[,6])
#########################
n.individuos.plot= table(dados[ ,1]) ## numero de individuos por unidade amostral
nplot=levels(dados[,1]) ## captando a variação das parcelas
nplot=length(nplot) ##
nplot.total= dim.plot*length(nplot) ## numero total da área amostral parcelas
density.tot= (length(dados[,1])/nplot.total) * (10000) ## densidade total
alt.max= max(dados[,6]) # altura máxima
alt.min= min(dados [,6])# altura mínima
alt.mean= mean(dados[,6]) # media da altura
n.sp=length(table(dados[,4])) # numero de espécies total
n.ind.total= sum(length(dados[,3])) # numero total de individuos
n.ind.sp= table(dados[ ,4]) ## numero de individuos por espécie
n.sp.fam= table(dados[,3]) ## numero de espécies por família
n.fam.total= length(n.sp.fam) ## numero total de família
##diversidade e equabilidade
## div shannon total
prop.i= n.ind.sp/n.ind.total
h.linha.total= -sum(prop.i*log(prop.i))
## div de simpson
simpson.d.total= sum((prop.i)^2)
### Equabilidade de pielou
pielou.j= h.linha.total/log(n.sp)
### Riqueza rarefeita
### diametro e área basal
if(estimativa=="CAP") # se estimativa for circuferência a altura do peito
{
dados[ ,5]= dados[ ,5]/ pi # calculando DAP apartir do CAP
AB= (pi*(2*(dados[ ,5])^2)) # Calculo da área basal total
AB.media= (pi*(2*(dados[ ,5])^2))/length(dados[ ,5]) #Calculo da área basal me´dia
diam.mean= mean(dados[,5]) # Calculo do diâmetro médio
diam.min= min(dados[,5])# Calculo do diamentro mínimo
diam.max= max(dados[,5])# Calculo do diâmetro máximo
diam.plot.max= aggregate(dados[ ,5], list(dados[ ,1]), max) # diametro maximo por plot
diam.plot.min= aggregate(dados[ ,5], list(dados[ ,1]), min) #diametro minimo por plot
diam.plot.mean= aggregate(dados[ ,5], list(dados[ ,1]), mean) # dimatro medio por plot
##Fazendo os plots
x11() ## Abrindo novo dispositivo gráfico
plot.dist.diam= hist(dados[,5], breaks= 10, freq=T ,col="gray", ylab="Frequência", xlab= "Diâmetro", main=" Distribuição diâmetrica", las=1, cex.axis=1.5, cex.lab=1.5) ## plotando distribuição diamétrica dos indivíduos
}
if(estimativa== "DAP") # se a estimativa for diâmetro a altura do peito
{
AB= (pi*(2*(dados[ ,5])^2))# Calculo da área basal total
AB.media= (pi*(2*(dados[ ,5])^2))/length(dados[ ,5])#Calculo da área basal me´dia
diam.mean= mean(dados[,5])# Calculo do diâmetro médio
diam.min= min(dados[,5])# Calculo do diamentro mínimo
diam.max= max(dados[,5])# Calculo do diâmetro máximo
diam.plot.max= aggregate(dados[ ,5], list(dados[ ,1]), max) # diametro maximo por plot
diam.plot.min= aggregate(dados[ ,5], list(dados[ ,1]), min) #diametro minimo por plot
diam.plot.mean= aggregate(dados[ ,5], list(dados[ ,1]), mean)#diametro mediopor plot
### Fazendo o plot da distribuição diâmetrica
x11() # novo dispositivo gráfico
plot.dist.diam= hist(dados[,5], breaks= 10, freq=T ,col="gray", ylab="Frequência", xlab= "Diâmetro", main=" Distribuição diâmetrica", las=1, cex.axis=1.5, cex.lab=1.5) ## Fazendo o plot da distribuição diâmetrica dos individuos
}
########################################
########Calculando por plots#########
####################################
### nº de indivíduos por parcela
n.individuos.plot= table(dados[ ,1])
## ## densidade por plot
density.plot= n.individuos.plot/dim.plot
### Por plots
tabela.especie.parcela= table(dados[ ,4], dados[ ,1]) ## selecionando numero de individuos por espécie em cada parcela
dimensao=dim(tabela.especie.parcela)## calculando dimensão para montar matrix
matrix.especie.parcela= matrix(tabela.especie.parcela, ncol=dimensao[2], nrow = dimensao[1]) ## motando matrix
matrix.especie.parcela.S.rar= matrix.especie.parcela # guardando a matrix em um novo objeto para o calculod e riqueza estimada psoteriormente
matrix.especie.parcela[(matrix.especie.parcela)==0] = NA ## transformando valores em NA
## Nº de familias por plot
n.sp.fam.plot= table(dados[,3], dados[,1]) ## numero de espécies por família em cada plot
#######
n.especie.parcela= matrix(tabela.especie.parcela, ncol=dimensao[2], nrow = dimensao[1]) ## numero espécie por parcela
n.especie.parcela[(matrix.especie.parcela)>1] = 1 ##transformando em 0 e 1 para somar
n.total.sp.plot= apply(n.especie.parcela,2, sum) ## usando apply para calcular n total de sp por plot
names(n.total.sp.plot)= c(levels(dados[ ,1])) # renomeando o vetor
n.total.sp.plot
################Criando função para diversidade de Shannon e Simpson ##########################
shannon= function(y)
{
if (sum(is.na(y)>0))
{dados.div=(na.omit(y))}
else
{dados.div=y}
prop.i= dados.div/sum(dados.div)
h.linha= -sum(prop.i*log(prop.i))
}
simpson= function(x)
{
if (sum(is.na(x)>0))
{dados=(na.omit(x))}
else
{dados=x}
prop.i= dados/sum(dados)
simp= sum((prop.i)^2)
}
####################################################################
########Calculando diverisdade, equabilidade por plot###########
##############################################################
div.plot.shannon= apply(matrix.especie.parcela,2,shannon) ## Calculando Shannon por plot
names(div.plot.shannon)= c(levels(dados[,1]))
div.plot.simpson= apply(matrix.especie.parcela,2,simpson) ## Calculando Simpson por plot
names(div.plot.simpson)= c(levels(dados[,1]))
###Calculando equabilidade por plot
pielou.j.plot= div.plot.shannon/ log(n.total.sp.plot)
########################################################
##### Calculando densidade e altura e diametro por plot######
######################################################
### densidade por plot
n.individuos.plot= table(dados[ ,1])
density.plot= (n.individuos.plot/dim.plot) * 10000 # individuos por hectate
density.plot=as.vector(density.plot)
## altura por plot
alt.plot.max= aggregate(dados[ ,6], list(dados[ ,1]), max) # alt max
alt.plot.min= aggregate(dados[ ,6], list(dados[ ,1]), min) # alt min
alt.plot.mean= aggregate(dados[ ,6], list(dados[ ,1]), mean) # alt media
#############################################################################################################################################################################################################################
###############################################################################
##calculo da riqueza rarefeita ////
##############################################################
matrix.especie.parcela.2=matrix.especie.parcela.S.rar ## renomeando a matrix
matrix.especie.parcela.2[(matrix.especie.parcela.2)>1] = 1 ## colocando matriz de prensença e ausendia
matrix.especie.parcela.rarefacao= apply(matrix.especie.parcela.2,1,sum) ## aplicando somatoria para detectar espécies que ocorrem apenas em uma amostra, e que ocorrem duas (singletons e doubletons)
n.sp.ocurr.1sample=length(matrix.especie.parcela.rarefacao[(matrix.especie.parcela.rarefacao==1)])##detectando espécies que ocorrem apenas em uma amostra
n.sp.ocurr.2sample=length(matrix.especie.parcela.rarefacao[(matrix.especie.parcela.rarefacao==2)])##detectando espécies que em duas amostras
n.sample= length(n.total.sp.plot) # tamanho da amostra
#########################################################################
######### Riqueza estimada pela rarefação Colwel, et al 2012##############
###########################################################################
S.estimate= n.sp + (((n.sample-1)/(n.sample)) * ((n.sp.ocurr.1sample*(n.sp.ocurr.1sample-1))/(2*(n.sp.ocurr.2sample+1)))) ##Riqueza estimada baseada em amostra que ocorrem apenas 1 individuo =
###################################################################
############### Riqueza estimada por plot CHAO 1##################
##################################################################
matrix.especie.parcela.S.rar.1= matrix.especie.parcela.S.rar ## atribuindo novo nome para selecionar apenas especies que possuem 1 individuo por parcela
matrix.especie.parcela.S.rar.2= matrix.especie.parcela.S.rar ## atribuindo novo nome para selecionar apenas especies que possuem 2 individuos por parcela
n.individuos.plot= as.numeric(n.individuos.plot) ## transformando o vetor de numero de individuos por plot em um vetor numerico
matrix.especie.parcela.S.rar.1[(matrix.especie.parcela.S.rar.1)>1]=0 ## transformando em 0 e 1 para calculo de especie que ocorrem com apenas um individuo
matrix.especie.parcela.S.rar.2[(matrix.especie.parcela.S.rar.2)!=2]=0## excluindo tudo que é diferente de 2
matrix.especie.parcela.S.rar.2[(matrix.especie.parcela.S.rar.2)==2]=1 ## transformando em 0 e 1 para calculo das espécies que ocorrem com 2 individuos
f1=apply(matrix.especie.parcela.S.rar.1,2,sum) #utilizando apply para quantificar espécies que possuem apenas 1 indivíduo por amostra
f2=apply(matrix.especie.parcela.S.rar.2,2,sum) # renomeando para a fórmula
### calculando Riqueza rafeita pelo Chao 1, por parcelas ( mesma base para construção do gráfico de riqueza)
s.estimate.plot= n.sp +(((n.ind.total-1)/(n.ind.total))*(f1*(f1-1))/(2*(f2+1))) ## Riqueza de espécie estimada por plot
##########################################################################################################
## Calculo dFrequência absoluta e relativa, dominância absoluta e relativa, densidade absoluta e relativa, diâmetro médio (max e min), altura média (max e min), índice de valor de importância, por espécie
###########################################################################################################
tabela.par.diam.sp= aggregate(dados[,5], list(dados[,4]), mean) ## calculo do diâmetro médio
tabela.par.alt.sp=aggregate(dados[,6], list(dados[,4]), mean) ## calcula da altura média
## Densidade absoluta das espécies DeAbi = ni x 1ha/A
n.ind.sp=data.frame(n.ind.sp)
dens.abs.sp=n.ind.sp
dens.abs.sp[,3]= (n.ind.sp[,2]/nplot.total) * 10000 ## densidade absoluta por hectare
dens.abs.sp[ ,4]= (n.ind.sp[,2]/n.ind.total)*100 ## densidade relativa em %
matrix.sp.param=matrix.especie.parcela.S.rar ## renomeando a matrix
matrix.sp.param[(matrix.sp.param)>1] = 1 ## criando ua matrix de presença e ausência
dimnames(matrix.sp.param)= list(levels(dados[,4]),levels(dados[,1])) # renomenado a matrix
#Frequencia
dens.abs.sp[ ,5]= (apply(matrix.sp.param,1,sum)/ length(nplot)) * 100 # Em porcentagem afrequencia absoluta
dens.abs.sp[,6]=(dens.abs.sp[,5]/(sum(dens.abs.sp[,5]))) * 100 # frequência relativa
## dominancia
dados[,7]= (((dados[ ,5])^2)*pi)/4 ## criando uma nova coluna no date frame original para área basal
############################ Parenteses para calcuo da área basal por plot ( aproveitando a nova coluna)
AB.plot= aggregate(dados[,7], list(dados[,1]), sum)###calculando área Basal por plot
AB.plot.media= aggregate(dados[,7], list(dados[,1]), mean) ## Area basal média por plot
###################################################################
#######
##
dominancia.abs= aggregate(dados[,7], list(dados[,4]), sum)## usando aggregante para juntar dados de area basal por espécie dominancia absoluta
dens.abs.sp[,7]= dominancia.abs[,2] ## dominancia absoluta
dens.abs.sp[,8]=(dens.abs.sp[,7]/sum(dens.abs.sp[,7])) *100 ### dominancia relativa
##IVI
dens.abs.sp[,9]= dens.abs.sp[,4] + dens.abs.sp[,6] + dens.abs.sp[,8]
##################################################################################################
##### Motando a tabela dos parâmetros por espécie##################
##############################################################################################
tabela.param.sp= dens.abs.sp
tabela.param.sp[,10]= tabela.par.diam.sp[ ,2]
tabela.param.sp[,11]= tabela.par.alt.sp[ ,2]
names(tabela.param.sp)= c("Espécie","Nº de indivíduos", "Densidade","Densidade relativa"," Frequência","Frequência relativa", "Dominância", "Dominância relativa", "IVI", "Diâmetro médio", "Altura média")
#################
tabela.param.sp
##############
####### ##################################################################################################
####Tabela parametros totais###
tabela.parametro.total= data.frame (
nplot,
density.tot,
n.sp,
n.ind.total,
n.fam.total,
alt.max,
alt.min,
alt.mean,
AB,
AB.media,
diam.max,
diam.min,
diam.mean,
h.linha.total,
simpson.d.total,
pielou.j,
S.estimate)
tabela.parametro.total= tabela.parametro.total[1,]
names(tabela.parametro.total)= c( "número de parcelas","Densidade", "Nº de espécies", "Nº de indivíduos", "N de famílias", "Altura máxima","Altura mínina","Altura média", "Área basal","Área basal média","Diâmetro máximo", "Diâmetro mínimo","Diâmetro médio", "Shannon", "Simpson", "Pielou","Riqueza estimada")
###########################################################################################################
## Fazendo data frame com parametros por parcela
tabela.parametro.plot= data.frame(n.individuos.plot, n.total.sp.plot, density.plot,div.plot.shannon,div.plot.simpson,pielou.j.plot,s.estimate.plot, alt.plot.max[,2],alt.plot.min[,2],alt.plot.mean[,2], diam.plot.max[,2], diam.plot.min [,2], diam.plot.mean[,2], AB.plot[,2], AB.plot.media[,2]) ## Juntando os dados
names(tabela.parametro.plot)= c("Nº de individuos", "Nº de espécies","Densidade", "Shannon", "Simpson", "Pielou","Riqueza estimada", "Altura máxima","Altura mínima", "Altura média","Diâmetro máximo","Diâmetro mínimo", "Diâmetro médio", "Área basal", "Área basal média") ## Renomeando as colunas
##########################
n.sp.fam=data.frame(n.sp.fam) ## criando um data frame com numero de espécies por família
names(n.sp.fam)= c("Família","Nº de espécie") ####
########## Retornando lista final
list.final= list(tabela.parametro.total,tabela.param.sp,n.sp.fam,tabela.parametro.plot)
names(list.final) = c("Tabela total", "Tabela de espécies","Nº de espécies por família","Tabela por Parcela")
##############parametro.plot
##################################################################
###retornando o plot de altura
plot.dist= hist(dados[,6], breaks= 10, freq=T ,col="gray", ylab="Frequência", xlab= "Altura", main=" Distribuição de altura", las=1, cex.axis=1.5, cex.lab=1.5)
### retornando o plot de riqueza estimada pela rarefação
tabela.especie.parcela.plot= table(dados[ ,1], dados[ ,4]) ## selecionando numero de individuos por espécie em cada parcela
dimensao=dim(tabela.especie.parcela.plot)## calculando dimensão para montar matrix
matrix.especie.parcela.plot= matrix(tabela.especie.parcela.plot, ncol=dimensao[2], nrow = dimensao[1])
## Instalando pacote necessário para calculo de Riqueza acmulada
library(vegan) ## Carregando o pacote
matrix.plot=specaccum(matrix.especie.parcela.plot, "rarefaction",gamma="chao2",permutations = 1000) ## Calculando riqueza rarefeita pelo chao 2 e permutando 1000 vezes
x11()
plot(matrix.plot, ci.type="poly", col="black", lwd=2, ci.lty=0, ci.col="gray", las=1, ylab="Número de espécies", xlab="Número de parcelas", cex.lab=1.5, cex.axis=1.5, bty="l")
## Plotando curva de acumulação de espécies
return(list.final)}
if (method=="quadrante") ## Controle de fluxo para estimativa de quadrante que o dim.plot é diferente de 0.
if(dim.plot != 0)
{
stop( "Valor errado no argumento dim.plot. Colocar dim.plot= 0")
}
else
{
###### Garantindo que o R irá ler corretamente os dados####
dados[,1]= as.factor(dados[,1])
dados[,5]= as.numeric(dados[,5])
dados[,6]=as.numeric(dados[,6])
#########################
n.individuos= length(dados[,1])
n.individuos.plot= table(dados[ ,1]) ## numero de individuos por unidade amostral
nplot=levels(dados[,1]) ## captando a variação dos quadratntes
nplot=length(nplot) ## numero de quadrantes
if(estimativa=="CAP") # se estimativa for circuferência a altura do peito
{
dados[ ,5]= dados[ ,5]/ pi # calculando DAP apartir do CAP
AB= (pi*(2*(dados[ ,5])^2)) # Calculo da área basal total
AB.media= (pi*(2*(dados[ ,5])^2))/length(dados[ ,5]) #Calculo da área basal me´dia
diam.mean= mean(dados[,5]) # Calculo do diâmetro médio
diam.min= min(dados[,5])# Calculo do diamentro mínimo
diam.max= max(dados[,5])# Calculo do diâmetro máximo
diam.plot.max= aggregate(dados[ ,5], list(dados[ ,1]), max) # diametro maximo por plot
diam.plot.min= aggregate(dados[ ,5], list(dados[ ,1]), min) #diametro minimo por plot
diam.plot.mean= aggregate(dados[ ,5], list(dados[ ,1]), mean)
x11()
plot.dist.diam= hist(dados[,5], breaks= 10, freq=T ,col="gray", ylab="Frequência", xlab= "Diâmetro", main=" Distribuição diâmetrica", las=1, cex.axis=1.5, cex.lab=1.5)
}
if(estimativa== "DAP")# se a estimativa for diâmetro a altura do peito
{
AB= (pi*(2*(dados[ ,5])^2))# Calculo da área basal total
AB.media= (pi*(2*(dados[ ,5])^2))/length(dados[ ,5])#Calculo da área basal me´dia
diam.mean= mean(dados[,5])# Calculo do diâmetro médio
diam.min= min(dados[,5])# Calculo do diamentro mínimo
diam.max= max(dados[,5])# Calculo do diâmetro máximo
diam.plot.max= aggregate(dados[ ,5], list(dados[ ,1]), max) # diametro maximo por plot
diam.plot.min= aggregate(dados[ ,5], list(dados[ ,1]), min) #diametro minimo por plot
diam.plot.mean= aggregate(dados[ ,5], list(dados[ ,1]), mean)
x11()
plot.dist.diam= hist(dados[,5], breaks= 10, freq=T ,col="gray", ylab="Frequência", xlab= "Diâmetro", main=" Distribuição diâmetrica", las=1, cex.axis=1.5, cex.lab=1.5) ## Fazendo o plot da distribuição diâmetrica
}
########################
alt.max= max(dados[,6]) # altura máxima
alt.min= min(dados [,6])# altura mínima
alt.mean= mean(dados[,6]) # media da altura
n.sp=length(table(dados[,4])) # numero de espécies total
n.ind.total= sum(length(dados[,3])) # numero total de individuos
n.ind.sp= table(dados[ ,4]) ## numero de individuos por espécie
n.sp.fam= table(dados[,3]) ## numero de espécies por família
n.fam.total= length(n.sp.fam) ## numero total de família
##diversidade e equabilidade
## div shannon total
prop.i= n.ind.sp/n.ind.total
h.linha.total= -sum(prop.i*log(prop.i))
## div de simpson
simpson.d.total= sum((prop.i)^2)
### Equabilidade de pielou
pielou.j= h.linha.total/log(n.sp)
###Calculando densidade total
dist.corr= (dados[,5]/200)+(mean(dados[,2])) ## Calculando a distancia corrigida do ponto
A=nplot*(dist.corr/n.individuos) ## calculando a área media de cada ponto quadrante
B= sum(dados[,2]/n.individuos) ## calculando a distancia média
DTA= sum((A)/(B^2)) ## densidade total
density.tot= DTA* (10000) # densidade toal = individuos por hectare
########################################
########Calculando por ponto quadrante#########
####################################
### nº de indivíduos por parcela
n.individuos.plot= table(dados[ ,1])
### Por plots
tabela.especie.parcela= table(dados[ ,4], dados[ ,1]) ## selecionando numero de individuos por espécie em cada parcela
dimensao=dim(tabela.especie.parcela)## calculando dimensão para montar matrix
matrix.especie.parcela= matrix(tabela.especie.parcela, ncol=dimensao[2], nrow = dimensao[1]) ## motando matrix
matrix.especie.parcela.S.rar= matrix.especie.parcela # guardando a matrix em um novo objeto para o calculod e riqueza estimada psoteriormente
matrix.especie.parcela[(matrix.especie.parcela)==0] = NA ## transformando valores em NA
## Nº de familias por plot
n.sp.fam.plot= table(dados[,3], dados[,1]) ## numero de espécies por família em cada plot
#######
n.especie.parcela= matrix(tabela.especie.parcela, ncol=dimensao[2], nrow = dimensao[1]) ## numero espécie por parcela
n.especie.parcela[(matrix.especie.parcela)>1] = 1 ##transformando em 0 e 1 para somar
n.total.sp.plot= apply(n.especie.parcela,2, sum) ## usando apply para calcular n total de sp por plot
names(n.total.sp.plot)= c(levels(dados[ ,1])) # renomeando o vetor
################Criando função para diversidade de Shannon e Simpson ##########################
shannon= function(y)
{
if (sum(is.na(y)>0))
{dados.div=(na.omit(y))}
else
{dados.div=y}
prop.i= dados.div/sum(dados.div)
h.linha= -sum(prop.i*log(prop.i))
}
simpson= function(x)
{
if (sum(is.na(x)>0))
{dados=(na.omit(x))}
else
{dados=x}
prop.i= dados/sum(dados)
simp= sum((prop.i)^2)
}
####################################################################
########Calculando diverisdade, equabilidade por plot###########
##############################################################
div.plot.shannon= apply(matrix.especie.parcela,2,shannon) ## Calculando Shannon por plot
names(div.plot.shannon)= c(levels(dados[,1]))
div.plot.simpson= apply(matrix.especie.parcela,2,simpson) ## Calculando Simpson por plot
names(div.plot.simpson)= c(levels(dados[,1]))
###Calculando equabilidade por plot
pielou.j.plot= div.plot.shannon/ log(n.total.sp.plot)
########################################################
##### Calculando densidade e altura e diametro por plot######
######################################################
# dimatro medio por plot
###Correção da distancia pelo DAP para calculo de densidade
#### Calculando a densidade por ponto
####
dados[,7]= (dados[,5]/200) ## nova coluna con distância corrigida
dados[,7]= dados[,5]+(mean(dados[,2])) ## nova coluna com a distância corrigida
density.plot.P=tapply(dados[,7], list(dados[,1]), sum) ## calculando distancia corrigida por plot
A.plot= density.plot.P/n.individuos ## calculando valor de A
dados[,8]= dados[,2]/n.individuos ## coluna considerando a distância do ponto central divida pelo numero de individuos
B.plot= tapply(dados[,8], list(dados[,1]), sum) ###
DTA.plot= ((A.plot)/(B.plot^2)) ###
density.plot= DTA.plot* (10000) # densidade toal = individuos por hectare
## altura por plot
alt.plot.max= aggregate(dados[ ,6], list(dados[ ,1]), max) # alt max
alt.plot.min= aggregate(dados[ ,6], list(dados[ ,1]), min) # alt min
alt.plot.mean= aggregate(dados[ ,6], list(dados[ ,1]), mean) # alt media
#############################################################################################################################################################################################################################
###############################################################################
##calculo da riqueza rarefeita ////
##############################################################
matrix.especie.parcela.2=matrix.especie.parcela.S.rar ## renomeando a matrix
matrix.especie.parcela.2[(matrix.especie.parcela.2)>1] = 1 ## colocando matriz de prensença e ausendia
matrix.especie.parcela.rarefacao= apply(matrix.especie.parcela.2,1,sum) ## aplicando somatoria para detectar espécies que ocorrem apenas em uma amostra, e que ocorrem duas (singletons e doubletons)
n.sp.ocurr.1sample=length(matrix.especie.parcela.rarefacao[(matrix.especie.parcela.rarefacao==1)])##detectando espécies que ocorrem apenas em uma amostra
n.sp.ocurr.2sample=length(matrix.especie.parcela.rarefacao[(matrix.especie.parcela.rarefacao==2)])##detectando espécies que em duas amostras
n.sample= length(n.total.sp.plot) # tamanho da amostra
#########################################################################
######### Riqueza estimada pela rarefação Colwel, et al 2012##############
###########################################################################
S.estimate= n.sp + (((n.sample-1)/(n.sample)) * ((n.sp.ocurr.1sample*(n.sp.ocurr.1sample-1))/(2*(n.sp.ocurr.2sample+1)))) ##Riqueza estimada baseada em amostra que ocorrem apenas 1 individuo =
###################################################################
############### Riqueza estimada por plot CHAO 1##################
##################################################################
matrix.especie.parcela.S.rar.1= matrix.especie.parcela.S.rar ## atribuindo novo nome para selecionar apenas especies que possuem 1 individuo por parcela
matrix.especie.parcela.S.rar.2= matrix.especie.parcela.S.rar ## atribuindo novo nome para selecionar apenas especies que possuem 2 individuos por parcela
n.individuos.plot= as.numeric(n.individuos.plot) ## transformando o vetor de numero de individuos por plot em um vetor numerico
matrix.especie.parcela.S.rar.1[(matrix.especie.parcela.S.rar.1)>1]=0 ## transformando em 0 e 1 para calculo de especie que ocorrem com apenas um individuo
matrix.especie.parcela.S.rar.2[(matrix.especie.parcela.S.rar.2)!=2]=0## excluindo tudo que é diferente de 2
matrix.especie.parcela.S.rar.2[(matrix.especie.parcela.S.rar.2)==2]=1 ## transformando em 0 e 1 para calculo das espécies que ocorrem com 2 individuos
f1=apply(matrix.especie.parcela.S.rar.1,2,sum) #utilizando apply para quantificar espécies que possuem apenas 1 indivíduo por amostra
f2=apply(matrix.especie.parcela.S.rar.2,2,sum) # renomeando para a fórmula
### calculando Riqueza rafeita pelo Chao 1, por parcelas ( mesma base para construção do gráfico de riqueza)
s.estimate.plot= n.sp +(((n.ind.total-1)/(n.ind.total))*(f1*(f1-1))/(2*(f2+1))) ## Riqueza de espécie estimada por plot
##########################################################################################################
## Calculo dFrequência absoluta e relativa, dominância absoluta e relativa, densidade absoluta e relativa, diâmetro médio (max e min), altura média (max e min), índice de valor de importância, por espécie
###########################################################################################################
tabela.par.diam.sp= aggregate(dados[,5], list(dados[,4]), mean) ## calculo do diâmetro médio
names(tabela.par.diam.sp)= c("espécie","diâmetro médio")
tabela.par.alt.sp=aggregate(dados[,6], list(dados[,4]), mean) ## calcula da altura média
names(tabela.par.alt.sp)= c("espécie","altura média")
#### Densidade absoluta das espécies metodo ponto quadrante
n.ind.sp=data.frame(n.ind.sp)
dens.abs.sp=n.ind.sp
dens.abs.sp[,3]= density.tot*(n.ind.sp[,2]/n.individuos) ## densidade absoluta por hectare
dens.abs.sp[ ,4]= (dens.abs.sp[,3]/sum(dens.abs.sp[,3]))*100 ## densidade relativa em % densidade absoluta de cada espécie dividio pela somatario da densidade total
matrix.sp.param=matrix.especie.parcela.S.rar ## renomeando a matrix
matrix.sp.param[(matrix.sp.param)>1] = 1 ## criando ua matrix de presença e ausência
dimnames(matrix.sp.param)= list(levels(dados[,4]),levels(dados[,1])) # renomenado a matrix
#Frequencia
dens.abs.sp[ ,5]= (apply(matrix.sp.param,1,sum)/ length(nplot)) * 100 # Em porcentagem afrequencia absoluta
dens.abs.sp[,6]=(dens.abs.sp[,5]/(sum(dens.abs.sp[,5]))) * 100 # frequência relativa
## dominancia
dados[,9]= (((dados[ ,5])^2)*pi)/4 ## criando uma nova coluna do date frame original para área basal
############################ Parenteses para calcuo da área basal por plot ( aproveitando a nova coluna)
AB.plot= aggregate(dados[,9], list(dados[,1]), sum)###calculando área Basal por plot
AB.plot.media= aggregate(dados[,9], list(dados[,1]), mean) ## Area basal média por plot
###################################################################
#######
##
dominancia.abs= aggregate(dados[,9], list(dados[,4]), sum)## usando aggregante para juntar dados de area basal por espécie
dens.abs.sp[,7]= dominancia.abs[,2] ## dominancia absoluta por especie
dens.abs.sp[,8]=(dens.abs.sp[,7]/sum(dens.abs.sp[,7])) *100 ### dominancia relativa por especie
##IVI
dens.abs.sp[,9]= dens.abs.sp[,4] + dens.abs.sp[,6] + dens.abs.sp[,8]
##################################################################################################
##### Motando a tabela dos parâmetros por espécie##################
##############################################################################################
tabela.param.sp= dens.abs.sp
tabela.param.sp[,10]= tabela.par.diam.sp[ ,2]
tabela.param.sp[,11]= tabela.par.alt.sp[ ,2]
names(tabela.param.sp)= c("Espécie","Nº de indivíduos", "Densidade","Densidade relativa"," Frequência","Frequência relativa", "Dominância", "Dominância relativa", "IVI", "Diâmetro médio", "Altura média")
#################
##############
####### ##################################################################################################
####Tabela parametros totais###
tabela.parametro.total= data.frame (
nplot,
density.tot,
n.sp,
n.ind.total,
n.fam.total,
alt.max,
alt.min,
alt.mean,
AB,
AB.media,
diam.max,
diam.min,
diam.mean,
h.linha.total,
simpson.d.total,
pielou.j,
S.estimate)
tabela.parametro.total= tabela.parametro.total[1,]
names(tabela.parametro.total)= c( "número de parcelas","Densidade", "Nº de espécies", "Nº de indivíduos", "N de famílias", "Altura máxima","Altura mínina","Altura média", "Área basal","Área basal média","Diâmetro máximo", "Diâmetro mínimo","Diâmetro médio", "Shannon", "Simpson", "Pielou","Riqueza estimada")
###########################################################################################################
## Fazendo data frame com parametros por parcela
tabela.parametro.plot= data.frame(n.individuos.plot, n.total.sp.plot, density.plot,div.plot.shannon,div.plot.simpson,pielou.j.plot,s.estimate.plot, alt.plot.max[,2],alt.plot.min[,2],alt.plot.mean[,2], diam.plot.max[,2], diam.plot.min [,2], diam.plot.mean[,2], AB.plot[,2], AB.plot.media[,2]) ## Juntando os dados
names(tabela.parametro.plot)= c("Nº de individuos", "Nº de espécies","Densidade", "Shannon", "Simpson", "Pielou","Riqueza estimada", "Altura máxima","Altura mínima", "Altura média","Diâmetro máximo","Diâmetro mínimo", "Diâmetro médio", "Área basal", "Área basal média") ## Renomeando as colunas
##########################
n.sp.fam=data.frame(n.sp.fam) ## criando um data frame com numero de espécies por família
names(n.sp.fam)= c("Família","Nº de espécie") ####
##########
list.final= list(tabela.parametro.total,tabela.param.sp,n.sp.fam,tabela.parametro.plot)
names(list.final) = c("Tabela total", "Tabela de espécies","Nº de espécies por família","Tabela por Parcela")
##############parametro.plot
##################################################################
###retornando o plot de altura
plot.dist= hist(dados[,6], breaks= 10, freq=T ,col="gray", ylab="Frequência", xlab= "Altura", main=" Distribuição de altura", las=1, cex.axis=1.5, cex.lab=1.5)
### retornando o plot de riqueza estimada pela rarefação
tabela.especie.parcela.plot= table(dados[ ,1], dados[ ,4]) ## selecionando numero de individuos por espécie em cada parcela
dimensao=dim(tabela.especie.parcela.plot)## calculando dimensão para montar matrix
matrix.especie.parcela.plot= matrix(tabela.especie.parcela.plot, ncol=dimensao[2], nrow = dimensao[1])
## Instalando pacote necessário para calculo de Riqueza acmulada
library(vegan) ## Carregando o pacote
matrix.plot=specaccum(matrix.especie.parcela.plot, "rarefaction",gamma="chao2",permutations = 1000) ## Calculando riqueza rarefeita pelo chao 2 e permutando 1000 vezes
x11()
plot(matrix.plot, ci.type="poly", col="black", lwd=2, ci.lty=0, ci.col="gray", las=1, ylab="Número de espécies", xlab="Número de quadrantes", cex.lab=1.5, cex.axis=1.5, bty="l")
## Plotando curva de acumulação de espécies
return(list.final)
}
} ###Selecionar o ultimo parênteses para finalizar a função!
====Help====
str.community package: unknown R Documentation
Estrutura da comunidade vegetal lenhosa
Description:
A função para estimar parâmetros para análises exploratórias de dados
de comunidades vegetais a partir de um data.frame de levantamento da
vegetação utilizando método de parcelas ou quadrantes.
Usage:
str.community (dados, method, estimativa="CAP", dim.plot)
Arguments:
dados data.frame composto por seis colunas. A primeira coluna
(dados[,1]) contendo o fator unidade amostral
(“parcela” ou “quadrante”), a segunda coluna (dados[,2])
contendo o número de indivíduos para o
“method= “parcela”” e contendo a distância do indivíduo
até o ponto central do quadrante para o “method= “quadrante’.
A terceira e a quarta coluna (dados[,3] & (dados[,4]) contendo
família botânica e espécie, respectivamente. A quinta coluna
(dados[,5]) contendo diâmetro a altura do peito (DAP)
ou circunferência a altura do peito (CAP) e na última
coluna (dados[,6]) contendo os valores de altura.
method Método de levantamento de dados da vegetação.
Para método de parcelas, method= “parcela”,
para método de ponto quadrante
method=”ponto quadrante”.
estimativa Estimativa utilizada para cálculo de parâmetros
como dominância e área basal. Esse argumento deve estar de acordo
com os dados da quinta coluna (dados[,5]). Argumento estimativa= “DAP”,
para dados de circunferência a altura do peito (DAP) ou estimativa= “CAP”
para circunferência a altura do peito (CAP). Para dados de circunferência
e diâmetro a altura do solo vale a mesma notação, apenas discriminando
se a medida foi perímetro (CAP) ou diâmetro (DAP).
dim.plot Tamanho da unidade amostral quando método é
de parcelas method= “parcela”.
Quando método utilizado forponto quadrante,
method= “quadrante”, entrar com dim.plot= 0 .
Detalhes:
A função calcula por cada unidade amostral (parcela, ponto quadrante, área) e pelo total de amostragem os seguintes parâmetros: área basal, densidade, altura mínima, altura máxima, altura média, diâmetro máximo, diâmetro mínimo, diâmetro média, número de indivíduos, número total de espécies, número de famílias, número de espécies pro família, riqueza rarefeita para o menor número de indivíduos (CHAO 1 para área total e CHAO 2 para plots) que retorna o número absoluto estimado de espécie, diversidade de Shannon e Simpson e equabilidade de Pielou.
A função também calcula os parâmetros por espécies: número de indiíduos, frequência absoluta e relativa, dominância absoluta e relativa, densidade absoluta e relativa, diâmetro, altura média, índice de valor de importância. A função também incorpora função “hist” e “plot” do pacote básico e função “specaccum” do pacote “vegan”. É necessário ter pacote “vegan” instalado previamente (install.packages(“vegan”)).
A função possuí opções de entrar com dados levantados pelo método de quadrante e método de parcelas. Também permite entra com dados de perímetro do tronco (CAP), pois ela calcula e retorna valores de diâmetro. Para que a função realize os cálculos de densidade é necessário entrar com as dimensões da parcela no argumento dim.plot. As dimensões das parcelas devem estar multiplicando os valores em metros de cada lado da parcela (ex, dim.plot=10*10). Se o método utilizado for o método de quadrante, utilizar dim.plot=0. Isso devido a cada ponto quadrante possuir valores diferentes de dimensões para os cálculos de densidade. A densidade de cada ponto quadrante leva em consideração a distância dos indivíduos até o ponto central e a área ocupada por cada indivíduo.
Value:
A função retorna um objeto list contendo quatro data.frame: “Tabela total”, “Tabela de espécies”, “Nº de espécies por família”, “Tabela por unidade amostral”. Tabelas total contém estimativas para toda a comunidade. Tabela de espécies contém os parâmetros para todas as espécies amostradas na comunidade. Nº de espécies por família, contém número de espécies por família em toda comunidade amostrada. Tabela por unidade amostral contém as estimativas por unidades amostrais contidas no data.frame inicial (dados).
A função também retorna dois parâmetros gráficos, primeiro referente a distribuição diâmétrica e segundo referente a curva de acumulação de espécie pelo método de rarefação utilizando 1000 permutações.
Warning:
A função aceita como dados apenas objetos da classe "data.frame".
Se method= “quadrante” a função só aceita o argumento dim.plot= 0.
Note:
.....
Author(s):
André Luiz Giles
Giles, A.L. (andregiles74@yahoo.com.br)
References:
Coleman, B.D. 1981. On random placement and species-area relations. Mathematical Biosciences 54, 191-215.
Coleman, B.D., Mares, M.A., Willig, M.R. & Hsieh, Y.-H. 1982. Randomness, area, and species richness. Ecology 63, 1121-1133.
Colwell, R. K., A. Chao, N. J. Gotelli, S.-Y. Lin, C. X. Mao, R. L. Chazdon, and J. T. Longino. 2012. Models and estimators linking individual-based and sample-based rarefaction, extrapolation, and comparison of assemblages. Journal of Plant Ecology 5:3-21.
Moro, M.F. & Martins F.R. 2011. Métodos de levantamento do componente arbóreo-arbustivo. In Fitossociologia no Brasil: métodos e estudos de casos (J.M. Felfili, P.V. Eisenlohr, M.M.R.F Melo, L.A. Andrade & Neto J.A.A.M., eds.). Editora UFV, Viçosa, p.174-212.
See Also:
……..
Examples:
### Criando vetores para exemplo
ponto.quadrante= rep(1:10, each= 4)
distancia.do.ponto= seq(from=5,to=200, by=5)
familia= c ("Rubiaceae," , "Lauraceae" , "Chrysobalanaceae" ,"Polygonaceae" , "Fabaceae",
"Flacourtiaceae" , "Flacourtiaceae", "Rubiaceae" , "Lauraceae" , "Euphorbiaceae",
"Rubiaceae" , "Euphorbiaceae" , "Rubiaceae" , "Sapindaceae" , "Arecaceae" ,
"Sapindaceae" , "Sapindaceae" , "Rubiaceae" , "Rubiaceae" , "Elaeocarpaceae" ,
"Lauraceae" , "Phyllanthaceae" , "Rubiaceae" , "Annonaceae" , "Myrtaceae",
"Euphorbiaceae" , "Phyllanthaceae", "Arecaceae" , "Myrtaceae" , "Sapindaceae",
"Phyllanthaceae", "Phyllanthaceae" , "Elaeocarpaceae", "Phyllanthaceae" , "Arecaceae",
"Elaeocarpaceae" , "Arecaceae", "Fabaceae", "Rubiaceae", "Sapindaceae")
especie= c ("Psychotria nuda" , "Ocotea silvestris" , "Licania octandra" ,
"Coccoloba sp." , "Sclerolobium denudatum" , "Casearia obliqua" ,
"Casearia obliqua" , "Psychotria mapoureoides", "Ocotea dispersa" ,
"Pera glabrata" , "Psychotria nuda" , "Pera glabrata" ,
"Psychotria nuda" , "Cupania oblongifolia", "Euterpe edulis" ,
"Cupania oblongifolia" , "Cupania oblongifolia" , "Psychotria mapoureoides",
"Psychotria nuda", "Sloanea guianensis" , "Aniba viridis",
"Hyeronima alchorneoides" , "Psychotria nuda" , "Xylopia langsdorffiana",
"Myrcia pubipetala" , "Pera glabrata" , "Hyeronima alchorneoides" ,
"Astrocaryum aculeatissimum", "Eugenia catharinensis" , "Cupania oblongifolia",
"Hyeronima alchorneoides" , "Hyeronima alchorneoides", "Sloanea guianensis",
"Hyeronima alchorneoides" , "Euterpe edulis" , "Sloanea guianensis" ,
"Attalea dubia" , "Sclerolobium denudatum" , "Psychotria mapoureoides" ,
"Cupania oblongifolia")
CAP= c(18 , 41 , 73 ,38 ,145 , 19 , 18 , 56 , 38, 85, 19, 21 , 22, 22 , 29, 35, 25, 85, 24, 28, 22, 68, 15, 16, 71, 33, 61 ,25 , 18 , 12, 51 , 58, 59, 40 , 20 , 35 , 72, 112, 40 , 12)
altura= c(3, 12, 15, 8, 20, 4, 6, 12, 7, 12, 4, 6, 4, 6, 6, 8 , 5 ,12 , 4, 7 , 7 ,20, 3 , 4, 20 ,11, 15 , 3 , 4 , 7 ,12, 14 ,10 , 8 , 3, 9, 7 ,17 , 3 ,10)
##Exemplo de quadrante
dados.exemplo.quadrante= data.frame (ponto.quadrante,distancia.do.ponto, familia,especie,CAP,altura) ## Concatenando os vetores
## Rodando a função para quadrante
str.community(dados = dados.exemplo.quadrante, estimativa = "CAP", method="quadrante", dim.plot=0)
### Exemplo de parcelas
n.individuos= seq(from=1, to=40, by=1)
parcela= rep(1:4, each= 10)
dados.exemplo.parcela = data.frame (parcela,n.individuos, familia,especie,CAP,altura) #Concatenando os vetores
## roando a função para dados de parcela
str.community(dados = dados.exemplo.parcela, estimativa = "CAP", method="parcela", dim.plot=10*10)
###############
**Código da função**
{{:bie5782:01_curso_atual:alunos:trabalho_final:andre.giles.oliveira:funcao_str_community_final_giles.r|str_community}}