===== Funções para Análises Matriciais ===== Hoje terminei todo o conjunto de funções que precisamos até o momento para fazer as análises para a tese. Estou postando as funções e script e precisamos ajustar essa página para explicar as funçoes: --- //[[adalardo@usp.br|Alexandre Adalardo]] 2010/05/09 19:14// * {{matrix_function09maio2010.r|}} : **Funções básicas para as análises matriciais:** * //classes// : cria as classes de tamanho * //matriz.trans// : calcula uma matriz de transição basica pelas probabilidade de transição diretamento dos dados * //sensi.mat// : restorna as análises básicas como: lambda, sensibilidade, elasticidade, valor reprodutivo e stable stage * //elas.vital// : retorna análise de elasticidade para as taxas vitais de objeto criado pela funçao //taxas.vitais// * * {{vital.rates.r|}}: **Função para calcular as taxas vitais de diferentes formas** * //taxas.vitais// : calculas as taxas vitais por tres métodos distintos * //vital.mat// : transforma taxas vitais em matriz de transição, independente do método utilizado para calcular as taxas vitais. * {{boot.lambda.r|}} : **Arquivo para calculo do intervalo bootstrap do lambda** * //boot.lambda//: cria vetor com todos os valores de lambada boot * //boot.intervalo//: calcula intervalo de confiança do boot.lambda ajustado (ver Caswell) * {{boot.lambda.trans.r|}} ** boot lambda a partir da transição** * //boot.trans//: calcula o lambda bootstrap a partir de uma matriz de transição (recalcula os destinos dos indivíduos pelas probabilidades - não é o mais correto, mas funciona!) ==== teste ==== Fiz vários testes e correções. Está tudo funcionando, mas precisa ainda de uma checagem. Acho que não vamos conseguir checar muito antes da tese, mas se vir algo estranho me avise ASAP! Veja o script básico de teste para guapira com quatro classe: altura, das, dap<10, dap>10. * {{scripprepdados07maio2010.r|}} Veja se consegue rodar e se conseguir vá arrumando as instruções dessa página para cada função. bom trabalho --- //[[adalardo@usp.br|Alexandre Adalardo]] 2010/05/09 19:14// === Antigo === * [[antiga | Antigas criada em 09 de maio de 2010]] A última versão da função (provavelmente a final) é de 17 de fevereiro de 2010: [[comentariosAle17fev2010]] Arquivos: * {{matrix_function17fev2010.r|}} - Função * {{matrixale17fev.rdata|}} - RData do teste * {{script17fev2010.r|}} - Script do teste \\ Artigo que demonstra as principais funções do pacote ´popbio´: {{stuben_milligan_2007_jss.pdf|}} Comentários sobre versões anteriores: [[comentariosAle15set09]] === Descrição das funções === == 1. 'classes()' == A função 'classes()' deve ser aplicada ao arquivo de dados de demografia (para cada espécie) já preparado (ver a função de preparação de dados: [[funcoesR]]), ou seja, com apenas uma coluna para as medidas de DAP e DAS e ALTURA, não havendo repetição de número de placa (caules múltiplos já somados).\\ Exemplo de arquivo de dados: head(teste) # floresta estadio tamanho especie placa medida tamanho2007 tamanho2008 tamanho2009 Reprodutivo2007 # 1 teomar tardia grande G 4 dap 60.05 63.19 65.69 0 # 2 teomar tardia grande G 7 dap 71.59 72.89 75.39 0 # 3 teomar tardia grande G 8 dap 19.19 19.52 22.02 0 Argumentos da função 'classes()' dados censo=c("2007","2008") # controla os anos do censo que servirão de base para o cálculo das classes tipos.med=c("altura","das","dap") limite= list(alt=c(20,30,50), das=c(10,20,30),dap=c(50,100,150,200,300))) Um exemplo do objeto resultante da função classes() classes.teste = classes(teste, censo=c("2007", "2009")) head(classes.teste) # floresta estadio tamanho especie placa medida tamanho2007 tamanho2008 tamanho2009 Reprodutivo2007 classe2007 classe2009 # 1 teomar tardia grande G 4 dap 60.05 63.19 65.69 0 10 10 # 2 teomar tardia grande G 7 dap 71.59 72.89 75.39 0 10 10 # 3 teomar tardia grande G 8 dap 19.19 19.52 22.02 0 9 9 O resultado da função 'classes()' é, portanto, um objeto com duas colunas a mais que o inicial, correspondentes às classes de tamanho. == 2. 'matriz.trans()' == A função 'matriz.trans()' calcula a matriz de transição com base nas transições entre as classes ("jeito antigo"). É útil para fazer a conferência dos valores das transições após o cálculo da matriz via taxas vitais ("jeito novo"). É aplicada ao objeto resultante da função 'classes()':\\ matriz.teste = matriz.trans(classes.teste, censo.classe=c("classe2007","classe2009")) Argumentos da função 'matriz.trans()' dados=gua fator="floresta" censo.classe=c("classe2007","classe2008") O objeto resultante é uma tabela com tantas matrizes de transição quantos forem os fatores definidos no argumento fator. == 3. 'taxas.vitais()' == A função 'taxas.vitais()' calcula as taxas vitais para cada classe de tamanho, as quais serão utilizadas no cálculo da matriz de transição pelo "jeito novo". Da mesma forma que para 'matriz.trans()', a função 'taxas.vitais()' é aplicada ao objeto resultante da função 'classes()':\\ taxas.vitais.teste = taxas.vitais(classes.teste, censo.classe=c("classe2007","classe2009")) Argumentos da função 'taxas.vitais()' dados censo.classe=c("classe2007","classe2008") O objeto resultante é um data frame com uma lista das taxas vitais por classe: head(taxas.vitais.teste) # sobr regr cresc fec # classe1 0.8278146 0.00000000 0.08800000 0 # classe2 0.9655172 0.10714286 0.07142857 0 # classe3 0.8888889 0.12500000 0.12500000 0 Mas estas taxas vitais não levam em conta os fatores, a menos que cada fator seja indexado no argumento dados: taxas.vitais.teomar = taxas.vitais(classes.teste[classes.teste$floresta=="teomar",], censo.classe=c("classe2007","classe2009")) Por isso, seria interessante criar um argumento 'fator' semelhante ao que existe na função 'matriz.trans', para não ser preciso indexar uma floresta de cada vez.\\ Além disso, falta incorporar a essa função as taxas vitais correspondentes à possibilidade de regredir e crescer por mais de uma classe. == 4. 'mat.vital()' == A função 'mat.vital()' constrói a matriz de transição a partir das taxas vitais. Assim, ela é aplicada ao data frame resultante da função 'taxas.vitais()'\\ matriz.taxas.vitais = mat.vital(taxas.vitais.teomar) Argumentos da função 'mat.vital()' taxas O objeto resultante é uma matriz de transição. == 5. 'project.mat()' == A função 'project.mat()' calcula os resultados básicos das análises matriciais. É aplicada à matriz de transição calculada através de 'mat.vital()' ou 'matriz.trans()' par.basicos = project.mat(matriz.taxas.vitais) Argumentos da função 'project.mat()' matriz zero=TRUE Como esta função incorpora a função básica 'eigen.analysis()' do pacote 'popbio', o resultado é um objeto do tipo lista, com os parâmetros básicos calculados nesses casos. \\ Um exemplo retirado do help do 'popbio': # $lambda1 # [1] 0.7113787 # $stable.stage # [1] 0.5626178 0.2372651 0.2001171 # $sensitivities # [,1] [,2] [,3] #[1,] 0.0000000 0.0000000 0.1185631 #[2,] 0.7904207 0.0000000 0.0000000 #[3,] 0.0000000 0.3952104 0.0000000 # $elasticities # [,1] [,2] [,3] #[1,] 0.0000000 0.0000000 0.3333333 #[2,] 0.3333333 0.0000000 0.0000000 #[3,] 0.0000000 0.3333333 0.0000000 # $repro.value #[1] 1.000000 2.371262 2.811442 # $damping.ratio #[1] NA No entanto, as sensibilidades e elasticidades calculadas nessa função básica do 'popbio' são baseadas nos elementos da matriz de transição, as quais não possuem uma interpretação biológica (Morris & Doak 2002, cap.8 e 9).\\ As sensibilidades e elasticidades mais interessantes são as baseadas nas taxas vitais, pois dirão o quanto alterações em determinada taxa vital potencialmente afetariam o lambda. \\ O 'popbio' faz esse cálculo através da função 'vitalsens()'.\\ Para implementar isso não é tão simples, pois os argumentos da função 'vitalsens()' são: elements: an object of mode expression with all matrix elements represented by zeros or symbolic vital rates. vitalrates: a list of vital rates with names matching expressions in elements above. Nenhum desses objetos foram produzidos com as funções contruídas até agora.\\ Para a qualificação construí a expressão: expressao.matriz.gua.inicial = expression(s1*(1-g1), s2*(1-g2)*r2, 0, 0, 0, 0, 0, 0, 0, 0, 0, f13,...) E depois a lista de valores correspondentes: vital.rates.gua.inicial = c(s1=0.886598, s2=1, s3=1, s4=1, s5=1, s6= 1...) E apliquei a função: sens.elas.gua.inicial = vitalsens(expressao.matriz.gua.inicial, vital.rates.gua.inicial) E o resultado é bem diferente do obtido pela função básica 'eigen.analysis()', com um valor de sensibilidade e elasticidade para cada taxa vital de cada classe de tamanho: # estimate sensitivity elasticity #s1 0.886598000 6.927711e-05 6.144602e-05 #s2 1.000000000 1.457389e-05 1.457983e-05 #s3 1.000000000 8.997966e-05 9.001639e-05 #s4 1.000000000 3.591816e-02 3.593282e-02 Portanto, esse cálculo ainda falta implementar nas nossas funções. == 6. automatização das parametrizações (a definir) == * Taxas de transição referentes à crescimento (progressão) que sejam iguais à zero são uma consequência de se empregar um modelo com classes de tamanho. Estas transições não são zero, mas são muito pequenas e não são detectadas devido à amplitude das nossas classes (por outro lado, se as amplitudes fossem menores e usássemos mais classes teríamos poucos indivíduos em cada classe). A função **'matriz.trans()'** e a função **'taxas.vitais()'** podem detectar esses casos e emitir um aviso para que se mobilize um conjunto de dados à parte que contenha a estimativa dessas transições derivada das taxas de crescimento. Para isso é necessário deixar já pronto um conjunto de dados com a taxa de crescimento em cada classe. Detalhes do cálculo em [[parametrizacoes]]. * Da mesma forma, taxas de mortalidade iguais à zero em qualquer classe de tamanho não são reais, refletem um problema intrínseco a eventos mais raros, que nessa escala de tempo e espaço não foram detectados. A função **'taxas.vitais()'** pode detectar taxas de mortalidade iguais a zero e emitir um aviso para que se mobilize um conjutnto de dados à parte. No caso das taxas de mortalidade, teríamos que utilizar taxas de mortalidade da literatura. Outra possibilidade seria empregar o cálculo feito por Cruz & Rodrigues et al. 2009, detalhes em [[parametrizacoes]]. == 7. cálculo da fertilidade (a definir) == Apenas a última classe de tamanho está sendo considerada reprodutiva na função 'taxas.vitais()'. Ao definirmos o número de classes para cada espécie, provavelmente isso precisará ser corrigido. Detalhes em [[parametrizacoes]]. == 8. intervalo de confiança por bootstraping (não escrita ainda) == O principal problema para automatizar o cálculo do intervalo de confiança do lambda é que não sabemos //a priori// quais transições irão necessitar parametrização à parte. \\ Como recalcular as parametrizações a cada novo cálculo do lambda por bootstraping?\\ Com essa questão resolvida poderemos incorporar a função 'boot.transitions()' do 'popbio': Calculate bootstrap distributions of population growth rates (lambda), stage vectors, and projection matrix elements by randomly sampling with replacement from a stage-fate data frame of observed transitions Usage boot.transitions(transitions, iterations, by.stage.counts = FALSE, ...) Arguments transitions: a stage-fate data frame with stage or age class in the current census, fate in the subsequent census, and one or more fertility columns iterations: Number of bootstrap iterations by.stage.counts: Resample transitions with equal probability (default) or by subsets of initial stage counts ... additional options passed to projection.matrix A list with 3 items lambda A vector containing bootstrap values for lambda matrix A matrix containing bootstrap transtion matrices with one projection matrix per row. vector A matrix containing bootstrap stage vectors with one stage vector per row.