projetos:planaltopaulista:restrito:cris:funcoesmatrizes

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: — 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!)

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.

Veja se consegue rodar e se conseguir vá arrumando as instruções dessa página para cada função. bom trabalho — Alexandre Adalardo 2010/05/09 19:14

Antigo

A última versão da função (provavelmente a final) é de 17 de fevereiro de 2010: comentariosAle17fev2010

Arquivos:


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. 
  • /home/adalardo/farm/labtrop/data/pages/projetos/planaltopaulista/restrito/cris/funcoesmatrizes.txt
  • Última modificação: 2026/03/27 13:51
  • por 127.0.0.1