**Trabalho final: Milena de Godoy-Veiga**\\
----
**Proposta entregue: Proposta A, com justificativas e alterações destacadas**
tree.gRowth (''data'', ''year'', ''hm'', ''histogram'', ''retornar'' = TRUE, ''file'' = TRUE)
**Descrição:** \\
Uma função para análise exploratória de medidas de anéis de crescimento. A partir de data frames com as amostras distribuídas por colunas, a função entrega análises básicas da estrutura etária da população (histograma de idades e boxplot), taxa de crescimento (gráfico de crescimento acumulado) e padrão de crescimento (scatterplot de crescimento por idade).
**Entrada:**\\
**Justificativa**: foi sugerido adicionar um argumento para a análise de todas as planilhas dentro de um diretório. Tal sugestão não foi cumprida, não houve tempo hábil para aprender essa parte. Preferi entregar a função com todas as outras partes funcionando corretamente. Para facilitar a análise de vários arquivos, foi adicionado o argumento ''file'', para o usuário poder controlar o nome dos arquivos gerados de acordo com suas preferências. O argumento lyr foi removido pois julguei que não havia necessidade, visto que os dados não viriam nesse outro formato. Os outros arugumentos foram mantidos, apenas ''return'' passou para ''retornar'', visando evitar confusão com outros com outros comandos já existentes no sistema do R.
''data'' = nome do documento .txt ou .csv em que os dados de crescimento estão. Aceita data frames que contenham uma amostra por coluna. Primeira linha contendo o nome das amostras. A segunda linha deve conter a medida do último anel formado (lyr = TRUE). Se os valores estiverem invertidos, lyr = FALSE.\\
''year'' = um vetor com dois valores, de mês e ano em que a coleta foi feita ( ex. c(6, 2018) )\\
''hm'' = em qual hemisfério a coleta foi feita ( “south” ou “north” )\\
''histogram'' = um vetor com a idade inicial, final e o intervalo desejado no histograma (ex. c(0, 300, 25) \\
**''retornar''** = TRUE retorna os data.frames gerados\\
**''file''** = o radical para nome dos arquivos retornados
**Testando entradas:**\\
''data'' **Existe?**é um arquivo .txt ou .csv igual ao especificado (ver se primeira linha tem nomes e segunda números)? Se não, retorna //“Check your data **name**. Should be something like this: escrever um exemplo de data frame”//\\
''year'' é um vetor com duas posições, e onde a primeira é um número entre 1 e 12? Se não, retorna //“Check your year. Should be something like this: my.year <- c (4,2018)”//\\
''hm'' é igual a “sul” ou “norte”? Se não, retorna //“Check parameter hm. Should be south or north“// \\
''histogram'' é um vetor com **mais de**três valores numéricos e a divisão do segundo pelo terceiro é um número inteiro? Se não, retorna //“Check parameter histogram. Should be something like this: my.histogram <- c(0, 300, 25)”//\\
**Pseudo-código:**\\
#Arrumando as planilhas\\
-A partir de ''data'', criar um data.frame //“growth”//\\
-If ''lty'' = FALSE inverter os valores das colunas para que a segunda linha contenha os valores dos anéis formados no último ano.\\
-Onde não existem valores (final da coluna, já que as árvores mais velhas terão mais valores do que as mais novas), existem NA ou 0? Preencher tudo com NA\\
-if (''hm'' == ”sul” e ''year'' [1] > 7) #se estivermos no hemisfério sul e a coleta for realizada depois do mês de julho, temos que subtrair um ano já que a estação de crescimento nesse hemisfério começa no meio do ano.\\
-**Corrindo a planilha com while**
-Adicionar uma coluna //“Years”// com valores decrescentes, começando com ''year'' [2] – 1, **e depois arrumar os nomes dos indivíduos** \\
-else \\
-Adicionar uma coluna //“Years”// com valores decrescentes, começando com ''year'' [2]\\
#Análises\\
-for.**while** Para cada coluna de //“growth”// será calculado:\\
-Comprimento (length). Guardar esse valor em um vetor numérico //“ages”// #Esse comprimento é igual a idade \\
-Crescimento acumulado, que será o valor da última posição de cada coluna (ano 1 da árvore) somado a seguinte (ano 2), até o primeiro valor. Guardar estes valores em um data frame //“accumulated.growth”//, onde a primeira coluna será igual a primeira coluna de //“growth”//. **Ao inves de fazer pelo for, a planilha foi invertida, os NA foram removidos e foi feito o cálculo com a função cumsum. Após os calculos a planilha foi restaurada ao formato normal \\**
-Criar um segundo data frame //“lifetime.growth.pattern”// <- //“growth”//\\
-A primeira coluna será //“cambial age”//, começando do 0 e irá até a idade da árvore mais velha. \\
-**com while**, inverter todos os valores, retira os Nas # todos os anos 0 das árvores deverão estar na segunda linha agora. \\
-Preencher com NA o final das colunas \\
#Resultados\\
-Construir um histograma da frequência das idades, calculado a partir de //“ages”//, pelo intervalo indicado em ''histogram''\\
-Construir um boxplot com //“ages”//\\
-Criar um gráfico de crescimento acumulado de //“accumulated growth”// mostrando todas as amostras como linhas. Adicionar uma linha de crescimento médio e o valor da inclinação.\\
-Construir um scatterplot com os valores de //“lifetime.growth.pattern”// (crescimento por //“cambial age”//) Adicionar uma linha de média suavizada (LOESS).\\
**Saída:**\\
# **Salvar em pdf,**mostrar em um painel (2,2)\\
-Histograma com distribuição de idades\\
-Boxplot das idades\\
-Gráfico de crescimento acumulado de todas as amostras\\
-Scatterplot do padrão de crescimento de todas as amostras\\
-Se return = TRUE, retorna os data.frames **//“growth”//**, //“accumulated growth”// e //“lifetime.growth.pattern”// **salvos em .txt no diretório do usuário**\\
\\
----
**Código da função**\\
tReegrowth = function (data, year, hm, histogram, retornar = TRUE, file) # Cria a funcao "tReegrowth" com os argumentos "dim", "data", "year", "hm", "histogram", "lyr", "retornar = TRUE", "file".
{
install.packages ("reshape2")
library ("reshape2") #chamando o pacote necessario para melt
##########################VERIFICANDO PARAMETROS################
if (file.exists(data) == FALSE) # Verifica se nome entrado existe na pasta.
{
stop ("Check your data name.") # Se nao, para e exibe mensagem.
}
if (class(year) != "numeric") #verifica se year eh um numero
{stop ("Check your year, must be numeric") # Se nao, para e exibe mensagem.
}
if (length(year) != 2) #verifica se year tem duas posicoes
{stop ("Check your year, must have two numbers") # Se nao, para e exibe mensagem.
}
if (year[1]>12 | year[1] < 1 ) #verifica mes year
{stop ("Check month inserted in year") # Se nao, para e exibe mensagem.
}
if (hm != "south" && hm != "north") #verifica se hm eh south ou north
{stop ("check your hm, must be north or south") # Se nao, para e exibe mensagem.
}
if (class(histogram) != "numeric") #verifica se histogram eh um numero
{stop ("Check your histogram, must be numeric") # Se nao, para e exibe mensagem.
}
if (length(histogram) < 3) #verifica se histogram tem 3 posicoes
{stop ("Check histogram, must have more than 3 numbers") # Se nao, para e exibe mensagem.
}
if (retornar == TRUE) # Verifica se o usuario quer os arquivos e esta analisando apenas um data frame.
{
if (file == FALSE) # Se sim, verifica se foi entrado valor para file.
{
stop ("If retornar = TRUE you need this name for the dataframes") # Se nao, para e exibe mensagem.
}
}
#############1. Arrumando as planilhas###########################
growth <- read.table (data, header = TRUE, sep = "\t", dec = ".") #lendo a planilha data com cabecalho, separada por tabulacao e ponto como decimal
# Adicionando uma coluna years na primeira posicao com valores decrescentes, comecando com year [2] menos 1
if (hm == "south" && year [1] > 7) # verifica se a coleta foi feita no hemisferio sul e a coleta for realizada depois do mes 7.
{
growth$last <- NaN #criando uma coluna com Nan
Z <- ncol (growth) #criando objeto z com valor do numero de colunas de growth
while (Z>1) { #enquanto z que e igual ao numero de colunas for maior 1, repetir
growth [ ,Z] <- growth [ ,(Z-1)] #atribuindo o valor da penultima coluna para a ultima coluna
Z <- Z-1 #no proximo ciclo sera subtraido 1 de z
}
growth [,1] <- seq (from = year [2] - 1, by = -1, length.out = nrow (growth)) #adicionando na primeira coluna de gorwth essa sequencia, continua a sequencia ate o numero de linhas de growth
x <- names (growth) #criando objeto x com os nomes da primeira colunas de growth
N <- length(x) #criando objeto n com o valor do comprimento de x
while (N>1){ #enquanto N que igual ao comprimento de x for maior 1, repetir
x [N] <- x[N-1] #atribuindo o nome da penultima coluna para a ultima coluna
N = N-1 #no proximo ciclo sera subtraido 1 de
}
}
###########se não precisar subtrair 1 no ano
else {
growth$last <- NaN #criando uma coluna com Nan
Z <- ncol (growth) #criando objeto z com valor do numero de colunas de growth
while (Z>1) { #enquanto z que e igual ao numero de colunas for maior 1, repetir
growth [ ,Z] <- growth [ ,(Z-1)] #atribuindo o valor da penultima coluna para a ultima coluna
Z <- Z-1 #no proximo ciclo sera subtraido 1 de z
}
growth [,1] <- seq (from = year [2], by = -1, length.out = nrow (growth)) #adicionando na primeira coluna de gorwth essa sequencia, continua a sequencia ate o numero de linhas de growth
x <- names (growth) #criando objeto x com os nomes da primeira colunas de growth
N <- length(x) #criando objeto n com o valor do comprimento de x
while (N>1){ #enquanto N que igual ao comprimento de x for maior 1, repetir
x [N] <- x[N-1] #atribuindo o nome da penultima coluna para a ultima coluna
N = N-1 #no proximo ciclo sera subtraido 1 de n
}
}
####arrumando os nomes
x [1] <- "year" #trocando o nome da primeira posicao da variavel
names (growth) <- x #atribuindo o nomes corretos a planilha
#######PREPARANDO OBJETOS PARA OS CICLOS E ANALISES
a = ncol (growth) #criando vetor a com numero de colunas de growth
ages <- rep(0, (ncol(growth))-1) # cria um vetor ages com 0 = numero de colunas menos 1
while (a>1) { #enquanto a foir maior que 1
a.vetor <- growth [,a] #atribuindo o valor da coluna para o vetor
h <- length(a.vetor) #criando objeto h com o comprimento do vetor
while (is.na (a.vetor[h])){ #enquanto encontrar NA
a.vetor <- a.vetor [-h] #remover essa posicao
h= h-1 #no proximo ciclo sera subtraido 1 de h
}
a.tamanho <- length(a.vetor) #calculando o tamanho do a.vetor
ages [a] <- a.tamanho #colocando os dados na posicao a do vetor ages
a = a-1 #no proximo ciclo sera subtraido 1 de a
}
ages <- ages[-1] #removendo 0 que fica na primeira posicao
############# 2. ANALISES ########################
##########crescimento acumulado, que sera o valor da ultima posicao de cada coluna (ano 1 da arvore) somado a seguinte (ano 2), ate o primeiro valor.
accumulated.growth <- rev (growth[nrow(growth):1,]) #invertendo a tabela
accumulated.growth [is.na(accumulated.growth)] <- 0 #trocando na por 0
accumulated.growth <- cumsum (accumulated.growth) #calculo do crescimento acumulado
accumulated.growth [accumulated.growth == 0] <- NA #colocando NA
accumulated.growth <- rev (accumulated.growth[nrow(accumulated.growth):1,]) #invertendo
if (hm == "south" && year [1] > 7){
accumulated.growth$year <- seq (from = year [2]-1, by = -1, length.out = nrow (accumulated.growth)) #colocando os anos na primeira coluna se year estiver nas condicoes esecificidas
} else { accumulated.growth$year <- seq (from = year [2], by = -1, length.out = nrow (accumulated.growth)) #colocando os anos na primeira coluna caso nao precise subtrair 1 de year [2]
}
##########padrao de crescimento
growth2 <- read.table (data, header = TRUE, sep = "\t", dec = ".") #lendo a planilha data com cabecalho, separada por tabulacao e ponto como decimal
lifetime.growth.pattern <- rev (growth2[nrow(growth2):1,]) # Inverter todos os valores
lifetime.growth.pattern$last <- NaN #criando uma coluna com Nan
Y <- ncol (lifetime.growth.pattern) #criando objeto Y com valor do numero de colunas de lifetime.growth.pattern
while (Y>1) { #enquanto Y - numero de colunas - for maior 1, repetir
lifetime.growth.pattern [ ,Y] <- lifetime.growth.pattern [ ,(Y-1)] #atribuindo o valor da penultima coluna para a ultima coluna
Y <- Y-1 #no proximo ciclo sera subtraido 1 de z
}
lifetime.growth.pattern [,1] <- seq (from = 0, by = 1, length.out = nrow (lifetime.growth.pattern)) #colocando as idades das amostras na primeira coluna
nam <- names (lifetime.growth.pattern) #criando objeto nan com os nomes da primeira colunas de lifetime.growth.pattern
n <- length(nam) #criando objeto n com o valor do comprimento de nam
while (n>1){ #enquanto n - comprimento de nam - for maior 1, repetir
nam [n] <- nam[n-1] #atribuindo o nome da penultima coluna para a ultima coluna
n = n-1 #no proximo ciclo sera subtraido 1 de
}
nam [1] <- "CambialAge" #trocando o nome da primeira posicao da variavel
names (lifetime.growth.pattern) <- nam #atribuindo o nomes corretos a planilha
# excluindo NAs
z = ncol (lifetime.growth.pattern) #criando vetor com numero de colunas de lifetime
while (z>1) { #enquanto z for maior que 1
vetor <- lifetime.growth.pattern [,z] #atribui o valor dessa posicao de lifetime para o vetor
i=0 #i gual a 0
while (is.na (vetor[1])){ #enquanto essa posicao do vetor conter na
vetor <- vetor [-1] #retirar essa posicao
i = i+1 #no proximo ciclo sera somado 1 ao valor de 1
}
vetor <- c(vetor, rep(NA,i)) #cria um vetor com na repetindo i vezes
lifetime.growth.pattern [,z] <- vetor #inserindo esse vetor na posicao
z = z-1 #no proximo ciclo sera subtraido 1 de z
}
##############
#############3. SAIDA/GRAFICOS################
pdf(paste (file, "exploratory" , data, ".pdf"), width = 10, height = 8) #cria um pdf com o titulo inserido em file,"exploratory",data
par (mfrow = c (2, 2)) # Dispositivo tera duas linhas e duas colunas.
hist (ages, breaks = histogram, #histograma da frequencia das idades, calculado a partir de ages, pelo intervalo indicado em histogram
xlab = "Age (years)", ylab = "Frequency", main = "Age distribution", #dando nome para eixo x,eixo y e titulo
tcl = -0.3, cex = 0.8, col = "gray")
boxplot (ages, main = "Ages (years)", # boxplot com ages e titulo
cex = 0.8, col = "gray")
accu.grow.plot = melt(accumulated.growth, id.vars="year")
mod <- lm(accu.grow.plot$value~accu.grow.plot$year) # calcula o modelo linear
plot (accu.grow.plot$year, accu.grow.plot$value, col="gray", type="l",main = "Population Growth", cex = 0.8, xlab = "Year (years)", ylab = "Accumulated growth", bty = "l")
abline (coef(mod), lwd = 1.75)
grow.patt.plot = melt(lifetime.growth.pattern, id.vars="CambialAge")
scatter.smooth (grow.patt.plot$CambialAge, grow.patt.plot$value, span = 2/3, degree = 1.5,
xlab = "Cambial age (years)",
ylab = "Annual Increment",
bty = "l", lty = 1, cex = 0.8, main = "Lifetime Growth Pattern") # dando nome para eixo x, eixo y e colocando linhas apenas nas margens 1 e 2.
dev.off() #fecha o dispositivo de tela
write.table(accumulated.growth, (paste (file, "Accumulated.growth.txt")), col.names = TRUE, sep = "\t") #salvando os dataframes gerados com o nome inserido em file seguido do nome do objeto
write.table(lifetime.growth.pattern, (paste (file, "Lifetime.growth.pattern.txt")), col.names = TRUE, sep = "\t")
write.table(growth, (paste (file, "Growth.txt")), col.names = TRUE, sep = "\t")
}
----
**Página de help** \\
tReegrwoth package:unknown R Documentation
Explorando medidas de anéis de crescimento
Description:
Uma função para análise exploratória de medidas de anéis de crescimento. A partir frames com as amostras distribuídas por colunas, a função entrega análises básicas da estrutura etária da população (histograma de idades e boxplot), taxa de crescimento (gráfico de crescimento acumulado) e padrão de crescimento (scatterplot de crescimento por idade).
Usage:
tReegrwoth (data, year, hm, histogram, return = FALSE, file)
Arguments:
data: nome do documento .txt ou .csv em que os dados de crescimento estão. Aceita data frames que contenham uma amostra por coluna.
Primeira linha contendo o nome das amostras.
year: um vetor com dois valores, de mês e ano em que a coleta foi feita.
hm: em qual hemisfério a coleta foi feita ( “south” ou “north” ).
histogram: um vetor com pelo menos a idade inicial, média e final para definir o intervalo desejado no histograma.
return: TRUE retorna os data.frames e um .pdf dos gráficos gerados.
file: o radical para nome dos arquivos retornados
Details:
data é o seu arquivo com cada amostra em uma coluna, onde cada linha é um valor de incremento anual.
year exemplo de entrada: c(6, 2018). Se o argumento hm for igual a “south” e o mês colocado for maior do que 7, será subtraído um no ano. Isso é necessário já que a estação de crescimento no hemisféio sul começa no meio do ano.
histogram exemplo de entrada: seq(0, 300, 25). Esse argumento define o argumento “breaks” na função hist que constrói o histograma com a frequência de idades.
file é indicado para facilitar a manipulação de diversas análises independentes, adicionando um prefixo ao nome do arquivo colocado em data. Quando apenas a pasta é indicada, a função criará uma pasta para cada dataframe, copiando o nome do arquivo.
Os arquivos .txt são retornados para facilitar uma futura análise caso a análise exploratória aponte resultados promissores.
Value:
Histograma com distribuição de idades;
Boxplot da idade das amostras;
Gráfico de crescimento acumulado de todas as amostras, com reta de regressão;
Scatterplot mostrando padrão de crescimento ao longo da vida das amostras e linha LOESS para facilitar a interpretação do comportamento da população;
Se return = TRUE, retorna os data.frames “file, “Growht.txt”” “file, “Accumulated.growth.txt””, “file, “Lifetime.growth.pattern”” e os gráficos acima em um painel (2,2) salvos em um .pdf “file, "exploratory" , data, ".pdf"”.
Warning:
Se a planilha de dados ou alguns dos argumentos não estiverem no formato correto a função não é executada.
Author(s):
Milena de Godoy-Veiga
Milena.gveiga@gmail.com
Example:
exdata <- data.frame(ind1 = c(rnorm(13,3,1.2), rep(NA,54)), ind2 = c(rnorm(45.3,4,1.2), rep(NA,22)), ind3 = c(rnorm(67,3.9,1.2)),ind4 = c(rnorm(23.3,1.1),rep(NA,44)),ind5 = c(rnorm(27,3.3,1.2), rep(NA,40)), stringsAsFactors = FALSE )
write.table(exdata, (paste ("exdata.txt")), col.names = TRUE, sep = "\t")
tReegrowth("exdata.txt", c(10, 2000), "south", seq(0, 100, 10), retornar = TRUE, "TESTE")
----
\\
**Arquivo da função:** {{:bie5782:01_curso_atual:alunos:trabalho_final:milena.veiga:treegrowthfim.r|tReegrowth}}\\
\\
**Página de HELP**: {{:bie5782:01_curso_atual:alunos:trabalho_final:milena.veiga:treegrwoth_help.txt|Help}}