====== Função final ====== ===== Plano A: Tabela de Vida ===== ==== Página de Ajuda ==== tabvida package:unknown R Documentation CONTRUÇÃO DE TABELAS DE VIDA Description: Esta função serve para construir tabelas de vida de espécies e deve ser utilizada para descrever os estágios de desenvolvimento de quaisquer espécies em que a idade de vida esteja representada numericamente (dias, anos, tamanhos, etc.). A função retorna uma tabela de vida, que opcionalmente pode ser salva (data.frame), e um gráfico da curva de sobrevivência da espécie analisada. Usage: tabvida(x,x1,idade,Nxi=FALSE,save=TRUE) Arguments: x: Vetor numérico contendo a primeira idade de cada classe de idade, por exemplo: o primeiro dia de uma classe, o primeiro ano de uma classe, o primeiro tamanho de uma classe, etc.. No exemplo de *Phlox drummondii* (tabela de vida no trabalho de: Leverich & Levin, 1979) a primeira classe de idade é representada pelo “0” e a classe seguinte pelo "63", isso significa que a 1º classe vai de "0 até 62 dias" e que a 2º classe começa no dia "63" (o primeiro dia “x” da 2º classe). x1: Vetor numérico contendo a primeira idade seguinte a idade “x”. No exemplo de *Phlox drummondii*, na 1º classe, a primeira idade seguinte a “x” é representada pelo “63”. idade: Data.frame contendo o dia, ano, tamanho ou quaisquer outros valores que possam representar a idade de morte dos indivíduos. Cada linha do data.frame deve representar um indivíduo e conter a idade de morte do indivíduo. Nxi: Número total de indivíduos que o estágio de desenvolvimento é acompanhado ao longo do tempo. Deve ser um número inteiro que corresponda ao total de indivíduos a partir do qual a tabela de vida é construída. save: Opção para salvar a tabela de vida que é calculada. O default da função é =TRUE indicando que a tabela deve ser salva, caso não exista interesse em salvar a tabela deve ser informado save=FALSE. Details: Esta função pode ser utilizada para construir tabelas de vida de coortes e não coortes. Será uma tabela de coorte quando todos os indivíduos que nascem dentro de um mesmo intervalo são acompanhados do nascimento até a morte do último sobrevivente. Caso seja uma tabela de coorte "Nxi" não precisa ser informado (o default da função é para uma tabela de coorte: Nxi=FALSE), porém, caso não seja uma coorte "Nxi" deve ser informado, pois é necessário saber o total de indivíduos inicial a partir do qual a tabela é construída. Os parâmetros calculados na tabela de vida foram estabelecidos e definidos conforme as descrições que constam no trabalho de Leverich & Levin (1979) e no livro de Begon et al. (2007). O argumento “x” deve ser um vetor que contém zero na primeira posição, pois o primeiro dia da primeira classe sempre será zero (é o dia inicial); “x” deve estar em ordem crescente, pois a idade aumenta com o passar do desenvolvimento; e as idades de “x” devem ser menores do que as idades de “x1”, pois “x1” delimita o final das classes de idade (intervalo fechado em “x1”). O argumento “x1” não deve conter zero em nenhuma posição do vetor e deve estar em ordem crescente, pois a idade aumenta com o passar do desenvolvimento. O argumento "idade" deverá ser da classe data.frame, pois a forma mais usual e fácil de acompanhar o desenvolvimento dos indivíduos é anotando a idade de morte em uma planilha de trabalho. Value: Dx: Duração dos intervalos ou classes de idades (x-x1), que descrevem os estágios de desenvolvimento das espécies, por exemplo, para *Phlox drummondii* o primeiro intervalo de idade possui 63 dias (de 0 até 62). Nx : Número total de indivíduos vivos no dia "x". O dia "x" representa o primeiro dia de uma classe de idade, por exemplo, para *Phlox drummondii* o primeiro dia da 1º classe de "x" é igual a zero e, nesse caso, o total de indivíduos é igual a 996, que representa o total de indivíduos a partir do qual o desenvolvimento foi acompanhado. A primeira 1º linha da coluna “Nx” será igual a “Nxi” e a 2º linha será igual a “Nxi – dxi”... E assim sucessivamente até calcular todas as linhas. lx: Proporção de sobreviventes no dia "x" (1*Nx/Nxi). dx: Número total de indivíduos mortos por cada intervalo de idade de vida. A idade de morte de cada indivíduo deve ser informada no data.frame "idade" e, a partir disso, conta-se o número de indivíduos que morreram em cada intervalo. p.dx: Proporção de mortos durante cada idade "dx", que corresponde a diferença entre os sucessivos valores de lx (lxi – lxii...). Este parâmetro é calculado no livro de Begon et al. (2007). qx: Taxa de mortalidade específica por idade ((dx/Nx)/Dx). Gráfico da curva de sobrevivência: plota no eixo y “lx”, que corresponde à proporção de sobreviventes no dia “x”, e plota no eixo x a idade no dia “x”. Warning: A função retornará erro: Se “x” não for um vetor da classe numérica com zero na primeira posição do vetor, se os componentes de “x” não estiverem em ordem crescente e se as idades de “x” forem maiores do que as idades de “x1”; Se “x1” não for um vetor da classe numérica, se “x1” possuir zero em alguma de suas posições e se “x1” não estiver em ordem crescente; Se “idade” não for da classe data.frame; Se “x” e “X1” não possuírem o mesmo comprimento. Author(s): Débora Samira Gongora Negrão e-mail: deborasamira@gmail.com References: Begon, M.; Townsend, C.R.; Harper, J.L.. Porto Alegre: Artmed, 2007.752p. Leverich, W. J. & Levin, D. A. 1979. Age-Specific Survivorship and Reproduction in Phlox drummondii. The American Naturalist, 113(6), 881–903. Examples: Dados para exemplo: x<-c(0,63,124,184,215,231,247,264,271,278,285,292,299,306,313,320,327,334,341,348,355) x1 idade:{{:01_curso_atual:alunos:trabalho_final:deboranegrao:idade.txt|}} {{:01_curso_atual:alunos:trabalho_final:deboranegrao:tabvida_codigo_entrada.r|}} ==== Código tabvida ==== ############################# ####FUNÇÃO TABELA DE VIDA#### ############################# tabvida<-function(x,x1,idade,Nxi=FALSE,save=TRUE){ #inicia a função #verifica os argumentos de entrada if(class(x)!="numeric")#verifica se "x" é numérico { stop("x precisa ser numérico!")#PARAR se "x" não for numérico } if(x[1]!=0)#verifica se o 1º elemento de "x" é !=0 { stop("o 1º elemento de x precisa ser ==0")#PARAR se o 1º elemento de "x" não for =0 } for(a in 1:(length(x)-1))#abre fluxo for com índice a indo de 1 até o número de linhas de "x"-1 { if(x[a]>x[a+1])#verifica as condições: se o 1º elemento de "x" for maior do que o 2º elemento de "x" (e assim sucessivamente até verificar todos os elementos): { stop("x precisa estar em ordem crescente")#PARAR quando "x" não estiver em ordem crescente } } if(class(x1)!="numeric")#verifica se "x1" é numérico { stop("x1 precisa ser numérico!")#PARAR se "x1" não for numérico } for(b in 1:length(x1))#abre fluxo for com o índice b indo de 1 até o número de linhas de "x1" { if(x1[b]==0)#se "x1" possuir algum zero, então: { stop("x1 não deve conter zeros")#PARAR "x1" não deve conter zero em nenhuma de suas posições } } for(c in 1:(length(x1)-1))#abre fluxo for com o índice c indo de 1 até o número de linhas de "x1"-1 { if(x1[c]>x1[c+1])#verifica as condições: se o 1º elemento de "x1" for maior do que o 2º elemento de "x1" (e assim sucessivamente até verificar todos os elementos): { stop("x1 precisa estar em ordem crescente")#PARAR quando "x1" não estiver em ordem crescente } if(length(x)!=length(x1))#verifica se "x" tem o mesmo comprimento de "x1", caso não: { stop("x e x1 precisam ter o mesmo tamanho")#PARAR se o comprimento de "x!=x1" } for(i in 1:length(x))#abre fluxo for com o índice i indo de 1 até o número de linhas de "x" { if(x[i]>x1[i])#se os elementos de "x" forem maiores do que "x1": { stop("os elementos de x precisam ser menores do que os de x1")#PARAR os elementos de "x" devem ser menores do que os elementos de "x1" } } if(class(idade)!="data.frame")#verifica se "idade" é um data.frame { stop("idade precisa ser da classe data.frame!")#PARAR se "idade" não for um data.frame } if(Nxi!=FALSE)#se "Nxi" é !=FALSE, então, não é uma tabela de coorte, logo: { if(class(Nxi)!="numeric")#"Nxi" deve ser informado pelo usuário e deve ser numérico, caso não: { stop("Nxi precisa numérico")#PARAR se "Nxi" não for numérico } } if(Nxi!=FALSE)#se "Nxi" é !=FALSE, então, não é uma tabela de coorte, logo: { if(Nxi==0)#verifica se "Nxi" é =0 { stop("Nxi precisa ser != de zero")#PARAR se "Nxi" for =0 } } if(Nxi!=FALSE)#se "Nxi" é !=FALSE, então, não é uma tabela de coorte, logo: { if(Nxi!=round(Nxi))#verifica se "Nxi" é um número inteiro { stop("Nxi precisa ser um número inteiro")#PARAR se "Nxi" for != de inteiros } } } #calcula os parâmetros da Tabela de Vida Dx<-abs(x-x1)#calcula o número de dias entre os intervalos (em módulo) { if(Nxi==FALSE)#então é uma coorte: qual o total de indivíduos? { Nxi<-nrow(idade)#cada linha do data.frame "idade" é um indivíduo (conta o número de linhas, usa nrow por ser data.frame) } } #cálculo "dx" n<-1 #cria contador "n" para percorrer os vetores "x", "x1" e "dx" dx<-rep(0, length(x))#cria vetor "dx" com zeros e possuindo o tamanho do comprimento ="x" (length por ser vetor class numeric) for(d in 1:nrow(idade))#abre o fluxo for com o índice d indo de 1 até o número de linhas de "idade" { if(x[n]<=idade[d,1] && idade[d,1]