{{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:img_20150810_152830546_hdr.jpg?200|}} ====== Fernando Ravanini Gardon ====== Mestrando em recursos hídricos energéticos e ambientais pela FEC/UNICAMP, orientado pela Profª Drª Rozely Ferreira dos Santos (USP/IB). Título da Dissertação: "Contribuição de restauros florestais para serviços ecossistêmicos hídricos". [[.:exec]] ====== Exercícios ====== {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:exercicio_1.1-1.2-1.3.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:1.5.6.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:2tutor.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:2.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:3f.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:4f.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:5f.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:6.2.r|F}}{{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:tutor6.r|F}}{{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:7.2.r|F}}{{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:7.b.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:8tutor.r|F}} {{:bie5782:01_curso_atual:alunos:trabalho_final:fernandogardon:8.r|F}} ====== Trabalho Final ====== ==== Proposta A ==== ecoh.i (x, suplevel=,resume=,graphics=,na.rm=) Criar uma função (Ecohydrological Index - ecoh.i) que categorize áreas de restauração florestal com base nos aspectos estruturais da vegetação e sua efetividade na manutenção de processos ecohidrológicos que garantem a oferta de serviços ecossistêmicos hídricos para a população. A função gera 2 dataframes com o cálculo do índice, dados resumo (média,mediana, min,max,sd,var) e plota gráficos. A função pode ser aplicada tanto em diferentes parcelas, quanto em uma floresta como um todo. Os parâmetros da estrutura florestal que compõem a função foram selecionados a partir dos protocolos de monitoramento de florestas brasileiras, levando em consideração a influência dos parâmetros sobre os processos do ciclo hidrológico que ocorrem em florestas tropicais. Os parâmetros selecionados como dados de entrada da função são: cobertura de dossel (%), número de estratos e densidade de indivíduos arbóreos (indivíduos/ha). A entrada de dados é feita por um data frame, sendo que podem ser inseridos dados coletados por parcela ou da floresta como um todo. Na função, o usuário deverá indicar qual coluna esta o nível superior dos dados (floresta ou parcela), para que a função calcule dados resumo como média,mediana, etc (arg: suplevel = 1, indica que o level superior esta na coluna 1). O dataframe de entrada está exemplificado abaixo: (concordo com a sugestão da Melina de que não necessariamente o dataframe fornecido pelo usuário deve estar na mesma ordem que o exemplo, porém não sei como fazer isso, se definindo um argumento ou então modificando os dados de entrada, ao invés de inserir um dataframe o usuário poderia inserir vetores com os dados de cada uma das variáveis e então a função montava o dataframe; estou seriamente pensando em inserir os dados como vetores. - ESTE É UM PONTO QUE ME GERA BASTANTE DÚVIDA) ^floresta ^parcela ^ Cobertura de dossel ^ Nº de estratos ^ Densidade de indivíduos ^ | 1 | 1 | 70 |3 | 1052 | | 1 | 2 | 75 |4 | 1200 | | 1 | 3 | 65 |4 | 950 | | 2 | 1 | 65 |4 | 1103 | | 2 | 2 | 50 |2 | 880 | | 2 | 3 | 70 |2 | 900 | | 3 | 1 | 75 |1 | 750 | | 3 | 2 | 80 |3 | 689 | | 3 | 3 | 40 |1 | 500 | Cada um dos parâmetros possui um peso e é valorizado quanto a sua condição levantada em campo (adequado - 1; parcialmente adequado - 0.65; e inadequado - 0). Esta categorização está relacionada aos protocolos de monitoramento florestal que apresentam as características esperadas para florestas restauradas com mais de 5 anos de idade, sendo eles o Pacto pela Restauração da Mata Atlântica (2009) e a publicação do Cadernos da Mata Ciliar - Vol. 4 (2008). A tabela abaixo apresenta os pesos de cada parâmetro e o valor referente a condição observada do parâmetro: ^ Parâmetros ^ adequado (valor-1) ^ parcialmente adequado (valor-0.65) ^ inadequado (valor-0)^ |cobertura de dossel (peso - 0.35)| =>80 | =>50 e <80 | <50 | |nº de estratos (peso - 0.40) | >2 | ==2 | <2 | |densidade (peso - 0.25) | =>1250 | =>880 e <1250 | <880 | Para obter o índice a função multiplica o valor da condição do parâmetro pelo peso do próprio parâmetro e então soma os valores de cada linha do data frame, normalizando-os de 0 a 1. Em seguida gera um novo dataframe (data.frame.ecoh.i) com 7 colunas, que contém os dados fornecidos pelo usuário acrescentado de uma nova coluna com os valores do índice calculado (coluna 6 <- ecoh.i). Os valores de 0 a 1 são divididos em 5 categorias (muito ruim-0 a 0.2; ruim-0.21 a 0.4; intermediário - 0.41 a 0.6; bom - 0.61 a 0.8; e muito bom - 0.81 a 1) e a função acrescenta mais uma coluna ao dataframe contendo a condição da floresta referente ao índice obtido (coluna 7 <- condição ecoh.i). ^floresta ^ parcela ^ Cobertura de dossel ^ Nº de estratos ^ Densidade de indivíduos^ ecoh.i ^ Condição ecoh.i ^ Caso o dataframe seja composto por varias parcelas de diferentes florestas, o usuário poderá pedir a função que gere um segundo dataframe (data.frame.ecoh.i.resume) contendo 8 colunas, que apresenta as diferentes florestas (col 1), os valores de ihev máximo (col 2) e mínimo (col 3), a mediana (col 4), o sd (col 5), a var (col 6), a média (col 7 - ecoh.i média) e a condição média referente ao valor de ihev (col 8 <- Condição ecoh.i média) de cada floresta. Esta opção poderá ser feita indicando no argumento da função determinado "resume=F ou T", sendo o default do argumento FALSE. É muito importante lembrar que o argumento resume= está ligado ao argumento suplevel= que irá dizer para a função em qual coluna que está o nível superior dos dados para o cáculo dos dados resumo. Abaixo é apresentado o cabeçalho do data frame gerado com as colunas com os valores resumo: ^floresta ^ ecoh.i mínimo ^ ecoh.i máximo ^ ecoh.i mediana ^ecoh.i.sd ^ecoh.i.var^ ecoh.i média ^ Condição ecoh.i média^ Por opção do usuário, a função pode plotar 1 boxplot e 2 histogramas (frequência e densidade) referentes aos valores de ecoh.i do dataframe 1). Caso o usuário queira plotar os gráficos isso deve ser indicado pelo argumento graphics=TRUE. Se o usuário não indicar o argumento graphics o default é FALSE e a função não plota os gráficos. Os gráficos resumos possíveis serão 3: 1- histograma de frequência de observações geral, com os dados de ecoh.i de cada linha do dataframe 1; 2- histograma com curva de densidade de probabilidade geral com os dados de ecoh.i de cada linha do dataframe 1; 3- boxplot com a representação dos dados de ecoh.i de cada linha do dataframe 1, sendo cada uma das caixas a representação do dados coletados para determinada floresta. Resumindo, os produtos da função dependem do tipo de entrada de dados pelo usuário, sendo eles o próprio data frame fornecido pelo usuário com novas colunas contendo os valores de ecoh.i e a condição associada a estes valores, e também gráficos que permitem avaliar a variação dos dados com mais clareza. ==== Proposta B ==== O volume de chuva precipitado em superfícies florestais é redistribuído nos ambientes atmosférico e terrestre pelos processos de interceptação pelas copas e infiltração, respectivamente. Em florestas tropicais conservadas o volume interceptado atinge cerca 30% do volume precipitado, ou seja, 1/3 da precipitação incidentes nestas florestas não chega ao solo pois é retido pela estrutura florestal, retornando para a atmosfera e contribuindo para a formação de novas chuvas. Somente os 2/3 restantes atravessam a estrutura e contribuem para a recarga dos reservatórios. No entanto, diferentes estágios de desenvolvimento florestal conferem proporções distantes de interceptação (floresta em estágio inicial – 15%; estágio secundário – 20%; e estágio avançado – 30%), com isso os cálculos envolvendo o balanço hídrico de diferentes regiões podem subestimar ou superestimar estes valores, conduzindo a erros no balanço hídricos e nas tomadas de decisões quanto ao uso dos recursos hídricos. Neste sentido, busca-se criar uma função (hydro.data) que agilize a manipulação de dados pluviométricos e informe o volume de precipitação que efetivamente atinge o solo e contribui para a recarga dos reservatórios em bacias florestais. O dado de entrada da função é composto por um data frame contendo os volumes de chuva em mililitros coletados em pluviômetros durante um período, sendo a primeira coluna referente a identificação da parcela ou da floresta, a segunda coluna com os volumes coletados, a terceira com a área de captação dos pluviômetros e a quarta coluna com o estágio de desenvolvimento da floresta (Inicial-1; secundário-2 ou avançado-3). A função inicialmente acrescenta uma nova coluna ao data frame fornecido pelo usuário contendo o volume precipitado em milímetros de altura (mm)(5ª coluna <- Altura de precipitação). Uma outra coluna é adicionada contendo o volume que em milímetros que efetivamente atinge o solo(mm)(6ª coluna <- Volume de recarga), ou seja, esta coluna apresenta o volume total precipitado descontado do volume interceptado (definido de acordo com o estágio da floresta). Abaixo está apresentado o cabeçalho do data frame final que retornará para o usuário: ^id ^ Volume precipitado (ml) ^ Área de captação do pluviômetros (cm²) ^ Estágio de desenvolvimento florestal ^ Altura de precipitação (mm) ^ Volume de recarga (mm)^ A função gera também 2 gráficos, um boxplot contendo os volumes das chuvas em cada período e suas variações (mm), e um outro gráfico de barras contendo os volumes acumulados em cada floresta ou parcela (mm). ===== COMENTÁRIOS PROPOSTAS MELINA LEITE ===== EM 28/04/2016 ==== PROPOSTA A ==== Achei a proposta simples, factível, e um tanto fácil, acredito que você possa fazer mais por ela. A principal crítica é que a forma com que vc vai tratar a presença de dados hierarquizados (ou seja, parcelas dentro florestas, ou florestas dentro de bacias). Aqui nós temos dois níveis, e acho que vc deveria ter um argumento para que a pessoa possa indicar a coluna que descreve qual o nível hierárquico superior (por exemplo, a floresta), para que possa ser feito os cálculos das médias (e porque não mediana? mínimo? máximo?). Por exemplo: ^ floresta ^ parcela ^ .... ^ |1 | 1 | | |1 | 2 | | |1 | 3 | | Eu acho que argumento "graphics=TRUE", nao deveria ser usado para dizer se o usuário quer ou não calcular médias de grupos de dados, e sim apenas para a pessoa dizer se quer que apareçam gráficos resumo dos dados ou não. Outra coisa, não seria mais interessante a função retornar um outro data.frame (separado do conjunto de dados original) com os resultados sumarizados (media, ..) por floresta? Assim o dados sumarizados por floresta estaria mais facilmente visualizável. E se o meu data.frame estiver com as colunas em alguma ordem diferente da sua coluna de exemplo? isso inviabilizaria o uso da função? como fazer com que isso não aconteça? Eu acho que a pessoa deveria poder colocar seu data frame na ordem de colunas que quiser, e também pode escolher se quer ter medidas resumo (média, mediana, minimo..) para níveis de uma coluna de fator (floresta por exemplo). Fazendo essa opção, ela pessoa poderia ou não querer os gráficos dos dados e das medidas resumo plotados. Eu não entendi os gráficos de dispersão, me pareceu com os gráficos feitos para o cálculo da ANOVA na unha, é isso? Imagine se eu tenho uma tabela com 2000 linhas de dados de parcelas em florestas, você acha que esses gráficos seriam informativos? Haveria outros gráficos mais informativos? Não sei, acho que vc deve pensar nas limitações e utilidade desse tipo de gráfico. ==== PROPOSTA B ==== Você só vai calcular a chuva em mm (vindo da coluna de cm) e depois calcular o volume de recarga a partir da porcentagem referente a cada estágio? Muito pouco para uma função, isso pode ser facilmente feito em duas linhas de comando. Sugiro dar ênfase na proposta 1 e deixar ela redondinha o suficiente, dado o baixou grau de dificuldade. Não se esqueça de um bom HELP! Enfim, mãos à massa! ==== REFORMULAÇÃO DA PROPOSTA A ==== Reescrevi a proposta A modificando alguns pontos sugeridos pela monitora Melina. DÚVIDAS - 1- indicando qual coluna está o nível superior (suplevel=) de dados (floresta ou parcelas), os dados resumo serão calculados de acordo com os levels existentes nesta coluna, certo? 2- caso o usuário não tenha dados de diferentes parcelas para uma floresta, ou seja, somente dados de floresta como um todo (um valor por floresta), e este usuário indicar o argumento resume=T, os dados resumo não serão calculados. Se mesmo assim o usuário quiser os dados resumos referentes ao conjunto de dados total e não para cada floresta, como seria possível isso? indicar em um outro argumento? 3- na situação anterior, se o usuário indicar o argumento graphics=T, como prosseguir com a criação do gráfico boxplot? não da para fazer uma caixa para cada floresta sem diferentes amostragens para uma mesma floresta, e gerar um boxplot com apenas uma caixa não sei se é importante. ==== COMENTÁRIOs 2 MELINA ==== em 06/05/2016 Respondendo primeiro às tuas perguntas pontuais: - sim, essa é a idéia de ter níveis superiores para se ter medidas resumo. nesse caso, se a pessoa já coloca algum número no argumento superlevel (superlevel=1), a função já vai construir o segundo data frame com as medidas resumo. Não precisa e outro argumento pra isso. - bom, o que eu entendi do seu argumento resume=T é que ele retorna as medidas resumo de toda a tabela de dados (ou seja uma linha apenas de informação com min, max, med...). Assim, esse argumento é útil tanto para o usuário que tem nível superior nos dados quanto (superlevel=1 - ou qualquer outra coluna indicando o nivel) para o que não tem (superlevel=Null - esse deveria ser o default da função) e quer a medida resumo da tabela toda. Por exemplo, para o usuário que vai usar superlevel=null, porque tem tabelas separadas para cada floresta, ele pode usar esse argumento para ter as medidas resumo para suas florestas em separado. - acho que nesse caso, você pode ter UM boxplot com os dados de toda a tabela. Comentários da proposta reformulada: sobre os data frames em colunas sem ordem: * fazer em formato de vetores talvez faça o usuário ter um pouco de preguiça de usar sua função. * você pode fixar a ordem das figuras (mas eu não acho nem um pouco elegante, mas é mais fácil) e informar explicitamente no help da função que o data frame precisa estar nesse formato, ou * você pode fazer como fez com o argumento superlevel. Pelo que entendi, nele vc indica em qual coluna estão os dados do nível superior no qual se quer tirar dados de medidas resumo. Você pode ter argumentos que indicam em qual coluna está o dado necessário, por exemplo, cobertura.dossel=3 (os dados de cobertura do dossel estão na coluna 3), n.estratos=2 (os dados de número de estratos na coluna 2). * Eu fiz uma sugestão de incrementar a função, mas se ficar muito difícil, pode fazer a tabela como fixa. sobre os gráficos: * vejo que o histograma 1 e a curva de densidade de probabilidade (hist 2) podem ser desenhados num mesmo plot. Tente fazer assim, pois poupa "tinta" e os dois trazem a mesma informação de forma um pouco diferente. Se você tiver dificuldades (veja na internet, certamente tem roteiros sobre isso), sugiro ficar só com o histograma de frequências. * Com eu disse antes se a pessoa não tiver nivel superior (superlevel=Null), daí pode aparecer um só boxplot com os dados totais. Tudo certo? Mãos à massa! ==== Finalização Proposta A ==== Ok Melina. Consegui plotar os gráficos juntos. Acabei optando por inserir um novo argumento (per.group=TRUE ou FALSE) à função caso o usuário queira fazer os dados resumo por subset ou com todos os dados. Inseri também duas mensagens de erro. Caso o dado de entrada não seja data.frame a função retorna uma mensagem de erro. Caso o usuário queira dados resumo por grupo mas não tenha diferentes grupos no data.frame de entrada(por exemplo parcelas de uma floresta) a função retornará uma mensagem de erro e não rodará. Obrigado pela ajuda e até mais. ==== HELP DA FUNÇÃO A (ecoh.i) ==== ecoh.i package:nenhum R Documentation Cálculo de um Índice Ecohidrológico (Ecohydrological Index – ecoh.i). Description: A função calcula um índice baseado em variáveis da estrutura e composição florestal que determinam a ocorrência de diferentes processos hidrológicos. Os valores de cada variável são multiplicados pelo peso da variável e da condição referente ao valor desta variável. Gráficos boxplot e histogramas de frequência são plotados. Usage: ecoh.i <- function(x, suplevel, fcover, strata, densityh, resume=F, per.group, graphics=FALSE) Arguments: x Um data.frame contendo os valores das variáveis, podendo as colunas estarem em qualquer ordem. Deve haver ao menos uma coluna referente ao nível de análise (floresta, parcela, etc). suplevel Indica em qual coluna do data.frame está o level superior de análise, para que a partir desta coluna sejam feitos os cálculos. fcover Indica qual coluna do data.frame contém os dados de cobertura florestal. strata Indica qual coluna do data.frame contém o número de estratos florestais. densityh Indica qual coluna do data.frame contém os valores de densidade de indivíduos arbóreos. resume Argumento opcional. Opção para calcular dados resumo do índice (max,min,sd,var,média,mediana). per.group Argumento condicionado ao argumento resume. Indica se os dados resumos serão agrupados por level ou calculado a partir dos dados todos. graphics Opção para plotar gráficos dos dados. Details: A função calcula um índice de qualidade hidrológica baseada em variáveis da estrutura e da composição vegetal de restauros florestais, categorizando o índice de acordo com a sua condição (muito bom, bom, regular, ruim, muito ruim). As variáveis utilizadas no índice são os argumentos da função, sendo elas: Cobertura florestal (fcover – valores em porcentagem); Número de estratos (strata – contagem do estratos presentes); e Densidade de indivíduos arbóreos por hectare(densityh – contagem de indivíduos arbóreos - extrapolação para uma área de 1ha se necessário). Para o cálculo do índice os dados são normalizados entre 0 e 1. Pesos são atribuídos a cada variável (fcvoer-0.35; strata-0.40; densityh-0.25) e também a cada valor (cada valor de cada variável é multiplicado por um peso dependendo da sua magnitude (ex: se para a variável fcover um valor maior que 80% de cobertura é considerado uma condição adequada pela literatura, então o peso da variável é multiplicado por 1; um valor intermediário seria multiplicado por 0.65 e um valor inadequado multiplicado por zero). O data.frame de entrada deve conter valores em todas as linhas de cada variável para que seja possível calcular o índice, caso haja NAs a função não roda. Value: Se resume==TRUE, a função calcula dados resumo do índice, porém nesta condição o argumento per.group deve ser especificado para dizer a função para calcular o resumo por subset ou a partir de todos os dados. Se per.group==TRUE, a função calcula o resumo para cada subset do data.frame, caso per.group==FALSE o resumo é calculado para o conjunto geral de dados. Se graphics==TRUE, a função plota um gráfico boxplot (se houver levels inferiores de organização) e um histograma de frequências. Note: Caso o dado de entrada no argumento x não seja um data.frame, a função retorna uma mensagem de erro. Caso seja indicado resume==TRUE e per.group==TRUE mas os dados não apresentarem nenhum subset, a função retorna uma mensagem de erro dizendo exatamente isto e não roda. Author(s): Fernando Ravanini Gardon fernadogardon@hotmail.com References: Rodrigues et al. (2009). Pacto pela restauração da mata atlântica : referencial dos conceitos e ações de restauração florestal. 256p. Gandara, F.B; Uehara, T.H.K. (2011). Monitoramento de áreas em recuperação. Cadernos da mata ciliar. SMA/SP. Vol 4. P68. Examples: plots <-rep(seq(1,15),10) forest.cover <- round(runif(150,0,100)) ind.density <- round(runif(150,0,1666)) number.strata <- round(runif(150,1,5)) forest <- rep(seq(1,15),each=10) dados<-data.frame(plots,forest.cover,ind.density,number.strata,forest) ###com dados resumo por subset indice.ecohidrol <- ecoh.i(x=dados,suplevel = 5,fcover=2,strata=4,densityh = 3, resume=T, per.group=T, graphics=F) ###resumo dos dados em geral indice.ecohidrol <- ecoh.i(x=dados,suplevel = 5,fcover=2,strata=4,densityh = 3, resume=T, per.group=F, graphics=F) ###opção por dados resumo separado por subset retornando erro pois não há subset forest <- seq(1,15) plots <-seq(1,15) forest.cover <- round(runif(15, 0,100),2) number.strata <- round(runif(15,1,5),2) ind.density <- round(runif(15,0,1666),2) dados<-data.frame(plots,forest.cover,ind.density,number.strata,forest) indice.ecohidrol <- ecoh.i(x=dados,suplevel = 5,fcover=2,strata=4,densityh = 3, resume=T, per.group=F, graphics=F) ====CÓDIGO DA FUNÇÃO ECOH.I==== ecoh.i <- function(x, suplevel, fcover, strata, densityh, resume=F, per.group, graphics=FALSE) { if(class(x) != "data.frame"){ ###identificando o tipo de dado de entrada stop("The input data is not a data.frame.") ### caso não seja um data.frame a função retorna a mensgaem de erro } else{} ### caso seja a função continua normalmente na.exclude(x) dataf.var <-data.frame(x[,suplevel],x[,fcover],x[,strata],x[,densityh]) ###lendo os dados indicados pelo usuário e reorganizando-os no data.frame da função colnames(dataf.var)<- c("suplevel", "fcover", "strata", "densityh") ###mudando os nomes das colunas dataf.var$suplevel <- as.factor(dataf.var$suplevel) ###transformando a coluna representativa do nível superior em fator dataf.var[dataf.var$fcover<50,2]<-0.35*0 ###transformando os dados das variáveis pelos valores das variáveis multiplicados pelo seu respectivo peso e condição dataf.var[dataf.var$fcover>=80,2]<-0.35*1 ###idem dataf.var[dataf.var$fcover>=1,2]<-0.35*0.65 ###idem dataf.var[dataf.var$strata<2,3]<-0.40*0 ###idem dataf.var[dataf.var$strata==2,3]<-0.40*0.65 ###idem dataf.var[dataf.var$strata>2,3]<-0.40*1 ###idem dataf.var[dataf.var$densityh<880,4]<-0.25*0 ###idem dataf.var[dataf.var$densityh>=1250,4]<-0.25*1 ###idem dataf.var[dataf.var$densityh>1,4]<-0.25*0.65 ###idem dataf.var$ecoh.i.par <- apply(dataf.var[,2:4],MARGIN=1 ,FUN=sum) ###cria a coluna com o valor do indice (ecoh.i.par) referente a soma dosvalores das variáveis em cada linha dataf.var$ecoh.i.par.cond <- dataf.var$ecoh.i.par ###cria a coluna com os mesmo valores da coluna anterior para transformá-los em condições dataf.var$fcover <- x[,fcover] ### repõe nas colunas de variaveis os valores fornecidos pelo usuário dataf.var$strata <- x[,strata] ###idem dataf.var$densityh <- x[,densityh] ###idem dataf.var[dataf.var$ecoh.i.par.cond >= 0.8 ,6]<- "muito bom" ###transforma os valores da coluna em condição (muito bom, bom, etc...) dataf.var[dataf.var$ecoh.i.par.cond >=0.6 & dataf.var$ecoh.i.par.cond <0.8,6]<-"bom" ###idem dataf.var[dataf.var$ecoh.i.par.cond >= 0.4 & dataf.var$ecoh.i.par.cond <0.6,6]<- "regular" ###idem dataf.var[dataf.var$ecoh.i.par.cond > 0.2 & dataf.var$ecoh.i.par.cond <0.4,6]<-"ruim" ###idem dataf.var[dataf.var$ecoh.i.par.cond < 0.2,6] <-"muito ruim" ###idem if(resume==FALSE) ###caso o usuario não queira dados resumo { if(graphics==TRUE) ###mas queira o gráfico gral dos dados { x11() ###abre janela gráfica hist(dataf.var$ecoh.i.par, main="", xlab="ecoh.i") #### plota o histograma com as frequencias de todos os dados do data.frame de entrada par(new=T) ###condição para plotar no gráfico anterior plot(density(dataf.var$ecoh.i.par),axes=F,ann=F,xlim=c(0,1),col="red") ###plota a linha de densidade em cima do histograma de frequência axis(4) ###adiciona a escala de densidade no eixo 4 mtext("Density", side=4, padj=3, cex=1) ###adiciona nome ao eixo 4 } else{} ###caso o usário não queira gráficos a função segue return(dataf.var) ###retorna o data.frame com os indices e as condições referentes ao índice obtido em cada linha } else ###casoo usuário queiro os dados resumo { if(per.group==TRUE) ###caso queira os dados resumo tem que adicionar este argumento separados indicando se quer os dados resumo referente a todos os dados do data.frame ou por subset (parcelas por exemplo). { dataf.var.med <- data.frame(levels(dataf.var$suplevel)) ###cria data.frame para os dados resumo dataf.var.med$ecoh.i.min <- tapply(dataf.var$ecoh.i.par, dataf.var$suplevel, min) ####cria coluna com o valor mínimo do índice para cada sublevel dataf.var.med$ecoh.i.max <- tapply(dataf.var$ecoh.i.par, dataf.var$suplevel, max) ####cria coluna com o valor máximo dataf.var.med$ecoh.i.sd <- tapply(dataf.var$ecoh.i.par, dataf.var$suplevel, sd) ####cria coluna com o valor de sd dataf.var.med$ecoh.i.var <- tapply(dataf.var$ecoh.i.par, dataf.var$suplevel, var) ####cria coluna com o valor da var dataf.var.med$ecoh.i.median <- tapply(dataf.var$ecoh.i.par, dataf.var$suplevel, median) ######cria coluna com o valor da mediana dataf.var.med$ecoh.i.media <- tapply(dataf.var$ecoh.i.par, dataf.var$suplevel, mean) ####cria coluna com o valor da média dataf.var.med$condicao.ecoh.i.media <- tapply(dataf.var$ecoh.i.par, dataf.var$suplevel, mean) ####cria coluna com o valor damédia do índice para transformar em condição dataf.var.med[dataf.var.med$condicao.ecoh.i.media >= 0.8,8]<- "muito bom" ###muda os valores do índice na coluna para condição dataf.var.med[dataf.var.med$condicao.ecoh.i.media >=0.6 & dataf.var.med$condicao.ecoh.i.media <0.8,8]<-"bom" ###idem dataf.var.med[dataf.var.med$condicao.ecoh.i.media >= 0.4 & dataf.var.med$condicao.ecoh.i.media <0.6,8]<- "regular" ###idem dataf.var.med[dataf.var.med$condicao.ecoh.i.media > 0.2 & dataf.var.med$condicao.ecoh.i.media <0.4,8]<-"ruim" ###idem dataf.var.med[dataf.var.med$condicao.ecoh.i.media < 0.2,8] <-"muito ruim" ###idem colnames(dataf.var.med) <- c("suplevel","ecoh.i.min","ecoh.i.max", "ecoh.i.sd","ecoh.i.var","ecoh.i.median","ecoh.i.media","condicao.ecoh.i.media") ###muda os nomes das colunas do data.frame resume.list <- list(dataf.var,dataf.var.med) ###salva o data.frame com dados geral (dataf.var) e com dados resumo (dataf.var.mee) em um objeto da categoria lista if(!dataf.var[1,1]==dataf.var[2,1]) ###porém, caso a primeira coluna do data.frame fornecido pelo usuário não apresente repetições, ou seja, caso a primeira linha da coluna do level superior indicado pelo usuário não seja igual a segunda linha da mesma coluna { stop("There are no subset levels to resume.") ###a função retorna uma mensagem de erro dizendo que não há como resumir os dados pois não há repetições de uma mesma área (parcela de uma floresta por exemplo, ou florestas de uma mesma bacia) } else{} ###caso haja repetições a função segue if(graphics==TRUE) ###caso o usuário queira gráficos { x11() ###abre janela gráfica par(mfrow=c(1,2), mar=c(5,5,5,5)) ####ajuste da janela gráfica boxplot(dataf.var$ecoh.i.par~dataf.var$suplevel,xlab="Level of analyses", ylab="ecoh.i", cex=1) ###plota boxplot com os dados de cada level abline(h=mean(dataf.var$ecoh.i.par),col="red") ###adiciona uma linha com amédia da variável y text(x=2.5,y=c(mean(dataf.var$ecoh.i.par)+0.05),labels="mean",col="red") ###adiciona o texto na linha da média hist(dataf.var$ecoh.i.par, main="", xlab="ecoh.i") ###plota o histograma com afrequencia de valores par(new=T) ###seleciona para plotar no mesmo gráfico do histograma plot(density(dataf.var$ecoh.i.par),axes=F,ann=F,xlim=c(0,1),col="red") ###plota a inha com a densidade no histograma de frequência axis(4) ###adiciona o eixo 4 mtext("Density", side=4, padj=3, cex=1,col="red") ###adicona texto ao eixo 4 } else{} ###caso não queira gráficos a função não plota nada return(resume.list) ###retorna no console o objeto já criado contendo a lista com os data.frames de dados geral e dados resumo } else ###caso o usuário não queira os dadosdividios por subset a função faz o dado resumo geral { general.resume <- 1 ###cria a primeira coluna do data.frame de dados resumo dataf.var.med1 <- data.frame(general.resume) ###cria o data.frame dedados resumo dataf.var.med1$ecoh.i.min1 <- apply(dataf.var[5],MARGIN=2, FUN=min) ####cria coluna com o valor mínimo do índice para os dados em geral dataf.var.med1$ecoh.i.max1 <- apply(dataf.var[5],MARGIN=2, FUN=max) ####cria coluna com o valor máximo dataf.var.med1$ecoh.i.sd1 <- apply(dataf.var[5],MARGIN=2, FUN=sd) ####cria coluna com o valor de sd dataf.var.med1$ecoh.i.var1 <- apply(dataf.var[5],MARGIN=2, FUN=var) ####cria coluna com o valor de var dataf.var.med1$ecoh.i.median1 <- apply(dataf.var[5],MARGIN=2, FUN=median) ####cria coluna com o valor da mediana dataf.var.med1$ecoh.i.media1 <- apply(dataf.var[5],MARGIN=2, FUN=mean) ####cria coluna com o valor da média dataf.var.med1$condicao.ecoh.i.media1 <- apply(dataf.var[5],MARGIN=2, FUN=mean) ####cria coluna com o valor médio do indice para todo o conjunto de dados dataf.var.med1[dataf.var.med1$condicao.ecoh.i.media1 >= 0.8 ,8]<- "muito bom" ###muda os valores do índice na coluna para condição dataf.var.med1[dataf.var.med1$condicao.ecoh.i.media1 >=0.6 & dataf.var.med1$condicao.ecoh.i.media1 <0.8,8]<-"bom" ###idem dataf.var.med1[dataf.var.med1$condicao.ecoh.i.media1 >= 0.4 & dataf.var.med1$condicao.ecoh.i.media1 <0.6,8]<- "regular" ###idem dataf.var.med1[dataf.var.med1$condicao.ecoh.i.media1 > 0.2 & dataf.var.med1$condicao.ecoh.i.media1 <0.4,8]<-"ruim" ###idem dataf.var.med1[dataf.var.med1$condicao.ecoh.i.media1 < 0.2,8] <-"muito ruim" ###idem general.resume <- list(dataf.var,dataf.var.med1) ###salva os data.frames emum objeto da classe lista if(graphics==TRUE) ###caso usuário queira gráficos { x11() ###abre janela gráfica par(mfrow=c(1,1), mar=c(5,5,5,5)) ####ajusta janela gráfica hist(dataf.var$ecoh.i.par, main="", xlab="ecoh.i") ####plota o histograma de frequência par(new=T) ###seleciona para plotar no mesmo gráfico do histograma plot(density(dataf.var$ecoh.i.par),axes=F,ann=F,xlim=c(0,1),col="red") ###plota a curva de densidade dos dados no gráficod e histograma axis(4) ###adiciona o eixo 4 mtext("Density", side=4, padj=3, cex=1,col="red") ###adicona texto ao eixo 4 } else{} ###caso não queira gráficos a função não plota nada } return(general.resume) ###retorna no console o objeto da classe lista contendo os data.frames com os dados em geral e o resumo destes dados } }