Índice
- O Curso R
-
- Tutoriais
-
- Apostila
-
- 6. Testes de Hipótese (em preparação!)
- Exercícios
-
- Material de Apoio
-
- Área dos Alunos
-
- Cursos Anteriores
-
IBUSP
Outras Insitutições
Linques
Visitantes
Outras Insitutições
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 detrê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
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\\
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.year
[2] – 1, e depois arrumar os nomes dos indivíduos year
[2]
#Análises
#Resultados
histogram
Saída:
# Salvar em pdf,mostrar em um painel (2,2)
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: tReegrowth
Página de HELP: Help