Funções Matriz Antigas
Versão atualizada ja antiga
A última última versão da função é de 22 de abril de 2010 e provavelmente não a última
Boot Lambda
Cris, acho que consegui fazer a rotina bootstrap para o lambda. Ainda precisa ser testada confrontando as estimativas com o popbio. O resultado é um vetor com um conjunto de dados de lambda bootstrap, para estimar o intervalo de confiança basta usar o seguinte comando no objeto resultante da função:
quantile(resulta.boot, prob=c(0.025, 0.975))
Antigo
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.