\documentclass[a4paper, oneside, 10pt]{article}
\usepackage[unicode]{hyperref}
\usepackage[english]{babel}
\usepackage[normalem]{ulem}
\usepackage[utf8x]{inputenc}
\usepackage{listings}
\date{\today}
\title{}
\author{}
\begin{document}



\textbf{Trabalho final: Milena de Godoy-Veiga}\\

\begin{center}
\line(1,0){250}
\end{center}



\textbf{Proposta entregue: Proposta A, com justificativas e alterações destacadas}

tree.gRowth  (\texttt{data}, \texttt{year}, \texttt{hm}, \texttt{histogram}, \texttt{retornar} = TRUE, \texttt{file} = TRUE) 

\textbf{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). 

\textbf{Entrada:}\\

\textbf{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 \texttt{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 \texttt{return} passou para \texttt{retornar}, visando evitar confusão com outros com outros comandos já existentes no sistema do R.

\texttt{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.\\
\texttt{year} = um vetor com dois valores, de mês e ano em que a coleta foi feita ( ex. c(6, 2018) )\\
\texttt{hm} = em qual hemisfério a coleta foi feita ( “south” ou “north” )\\
\texttt{histogram} = um vetor com a idade inicial, final e o intervalo desejado no histograma (ex. c(0, 300, 25) \\
\textbf{\texttt{retornar}} = TRUE retorna os data.frames gerados\\
\textbf{\texttt{file}} = o radical para nome dos arquivos retornados

\textbf{Testando entradas:}\\

\texttt{data} \textbf{Existe?}\sout{é um arquivo .txt ou .csv igual ao especificado (ver se primeira linha tem nomes e segunda números)?} Se não, retorna \emph{“Check your data \textbf{name}\sout{. Should be something like this: escrever um exemplo de data frame}”}\\
\texttt{year} é um vetor com duas posições, e onde a primeira é um número entre 1 e 12? Se não, retorna \emph{“Check your year. Should be something like this: my.year $\leftarrow$ c (4,2018)”}\\
\texttt{hm} é igual a “sul” ou “norte”? Se não, retorna \emph{“Check parameter hm. Should be south or north“} \\
\texttt{histogram} é um vetor com \textbf{mais de}três valores numéricos \sout{e a divisão do segundo pelo terceiro é um número inteiro}? Se não, retorna \emph{“Check parameter histogram. Should be something like this: my.histogram $\leftarrow$ c(0, 300, 25)”}\\

\textbf{Pseudo-código:}\\

\#Arrumando as planilhas\\
\begin{enumerate}
  \itemA partir de \texttt{data}, criar um data.frame \emph{“growth”}\\
\end{enumerate}


                  \sout{-If \texttt{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\textbackslash{}\textbackslash{}}
\begin{enumerate}
  \itemif (\texttt{hm} == ”sul” e \texttt{year} [1] \textgreater  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.\\
                  \item\textbf{Corrindo a planilha com while}

                                  \begin{enumerate}
                      \itemAdicionar uma coluna \emph{“Years”} com valores decrescentes, começando com \texttt{year} [2] – 1, \textbf{e depois arrumar os nomes dos indivíduos} \\
                    \end{enumerate}
                  \itemelse \\
                  \itemAdicionar uma coluna \emph{“Years”} com valores decrescentes, começando com \texttt{year} [2]\\
                \end{enumerate}


\#Análises\\
                                  \begin{enumerate}
  \item\sout{for.}\textbf{while} Para cada coluna de \emph{“growth”} será calculado:\\

  \begin{enumerate}
                  \itemComprimento (length). Guardar esse valor em um vetor numérico \emph{“ages”}  \#Esse comprimento é igual a idade \\
                  \itemCrescimento 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 \emph{“accumulated.growth”}, onde a primeira coluna será igual a primeira coluna de \emph{“growth”}. \textbf{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 \textbackslash{}\textbackslash{}}
                \end{enumerate}
              \itemCriar um segundo data frame \emph{“lifetime.growth.pattern”} $\leftarrow$ \emph{“growth”}\\

                          \begin{enumerate}
                  \itemA primeira coluna será \emph{“cambial age”}, começando do 0 e irá até a idade da árvore mais velha. \\
                  \item\textbf{com while}, inverter todos os valores, retira os Nas \# todos os anos 0 das árvores deverão estar na segunda linha agora. \\
                  \itemPreencher com NA o final das colunas \\
                \end{enumerate}
                \end{enumerate}


\#Resultados\\
                                  \begin{enumerate}
  \itemConstruir um histograma da frequência das idades, calculado a partir de \emph{“ages”}, pelo intervalo indicado em \texttt{histogram}\\
  \itemConstruir um boxplot com \emph{“ages”}\\
  \itemCriar um gráfico de crescimento acumulado de \emph{“accumulated growth”} mostrando todas as amostras como linhas. Adicionar uma linha de crescimento médio e o valor da inclinação.\\
  \itemConstruir um scatterplot com os valores de \emph{“lifetime.growth.pattern”} (crescimento por \emph{“cambial age”}) Adicionar uma linha de média suavizada (LOESS).\\
\end{enumerate}


\textbf{Saída:}\\

\# \textbf{Salvar em pdf,}\sout{mostrar} em um painel (2,2)\\
\begin{enumerate}
  \itemHistograma com distribuição de idades\\
  \itemBoxplot das idades\\
  \itemGráfico de crescimento acumulado de todas as amostras\\
  \itemScatterplot do padrão de crescimento de todas as amostras\\
  \itemSe return = TRUE, retorna os data.frames \textbf{\emph{“growth”}}, \emph{“accumulated growth”} e \emph{“lifetime.growth.pattern”} \textbf{salvos em .txt no diretório do usuário}\\
\end{enumerate}


\\

\begin{center}
\line(1,0){250}
\end{center}



\textbf{Código da função}\\\lstset{frame=single}
\begin{lstlisting}
  

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")
  
  
  }
\end{lstlisting}



\begin{center}
\line(1,0){250}
\end{center}



\textbf{Página de help} \\\lstset{frame=single}
\begin{lstlisting}


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")
\end{lstlisting}



\begin{center}
\line(1,0){250}
\end{center}



\\
\textbf{Arquivo da função:} \href{media/bie5782/01_curso_atual/alunos/trabalho_final/milena.veiga/treegrowthfim.r}{tReegrowth}\\
\\
\textbf{Página de HELP}: \href{media/bie5782/01_curso_atual/alunos/trabalho_final/milena.veiga/treegrwoth_help.txt}{Help}

\end{document}
