Pular para conteúdo

Relação Hipsométrica


Warning

Esta biblioteca está em desenvolvimento, nenhuma das soluções apresentadas está disponível para download.

Estime as alturas das árvores ausentes com base nas alturas medidas em campo.


Parâmetros da Classe

HypRel(x, y, df, model, iterator)
Parâmetros Descrição
x Nome da coluna que contém os diâmetros/circunferências das árvores.
y Nome da coluna que contém as alturas das árvores.
df O DataFrame contendo os dados das árvores.
model (Opcional) Uma lista de modelos usados para estimar as alturas das árvores. Se None, usará todos os modelos disponíveis. Os modelos disponíveis são: ['curtis', 'parabolic', 'stofel', 'henriksen', 'prodan_i', 'prodan_ii', 'smd_fm', 'ann'].
iterator (Opcional) Nome de uma coluna usada como iterador. Pode ser o nome da fazenda, nome da parcela, código ou qualquer identificador único.

Métodos da Classe

functions and parameters
  HypRel.run()  
  HypRel.view_metrics()  
  HypRel.plots(dir = None, show = None)#(1)!

  HypRel.get_coef()
  HypRel.predict()

  1. dir = O diretório onde deseja salvar seus gráficos!
    Se dir == None, os gráficos serão exibidos na tela.
    show = Exibe os gráficos na tela! Pode ser True ou False.
Métodos Descrição
.run() Ajusta os modelos.
.view_metrics() Retorna uma tabela com as métricas de cada modelo avaliado.
.plots(dir=None, show=True) Retorna os gráficos de altura e resíduos.
.get_coef() Retorna os coeficientes de cada modelo.
.predict() Retorna as alturas previstas e os modelos utilizados em novas colunas.

Exemplo de Uso

Utilizando os dados de Scolforo (2005), de um povoamento de Pinus taeda variando de 15 a 19 anos, com 5 parcelas de 420m² medidas, podemos ajustar modelos para prever as alturas faltantes.

Fazer download do arquivo.

Primeiras 5 linhas do arquivo:

Parcela Dap (cm) H (m) Idade (anos)
p-1 22.28 0.0 15
p-1 23.87 22.2 15
p-1 25.46 0.0 15
p-1 25.78 24.5 15
p-1 26.74 22.2 15

hyp_rel_example.py
1
2
3
from fptools.hyp_rel import HypRel#(1)!

import pandas as pd#(2)!

  1. Importa a classe HypRel.
  2. Importa o pandas para manipulação de dados.

hyp_rel_example.py
df = pd.read_excel(r'C:/seu/diretório/exemplo_scolforo.xlsx')#(1)!

reg = HypRel('Dap (cm)',"H (m)",df)#(2)!

results = reg.run()#(3)!

metrics = reg.view_metrics()#(4)!

reg.plots(r'C:/Your/path/to_save')#(5)!

df_coefficients =  reg.get_coef()#(6)!

final_results =  reg.predict()#(7)!

  1. Carrega seu arquivo .xlsx.
  2. Cria a variável reg contendo a classe HypRel. Como model não foi declarado, usará todos os modelos disponíveis.
    Caso queira usar um modelo específico defina model=['curtis'] por exemplo, dessa forma usará somente o modelo de curtis.
    Caso queira ajustar os modelos para cada uma das parcelas utilize iterator="Parcela".
    Ex: reg = HypRel('Dap (cm)',"H (m)",df, iterator="Parcela")
  3. Executa os modelos e salva na variável results.
  4. Avalia os modelos ajustados e salva as métricas na variável metrics.
  5. Gera os gráficos para os modelos ajustados.
  6. Obtém os coeficientes de cada modelo ajustado.
  7. Obtém as alturas finais e os modelos utilizados para a estimativa.

Nesse caso, iterator e model não foram declarados, logo todas as equações foram ajustadas para o banco de dados inteiro. Nesse caso, esses foram os outputs:

Saídas

Tabelas

results(1)

  1. DataFrame contendo as alturas estimadas para cada um dos modelos e a altura medida no campo na coluna "Real Height".
curtis parabolic stofel henriksen prodan_i prodan_ii smd_fm ann Real Height
21.11 22.19 22.33 21.78 22.81 22.77 21.12 22.82 0.00
22.21 22.97 23.07 22.71 23.39 23.35 22.26 23.45 22.20
23.22 23.73 23.79 23.58 23.98 23.95 23.29 24.08 0.00
23.42 23.88 23.93 23.75 24.10 24.08 23.49 24.20 24.50
23.98 24.33 24.35 24.24 24.46 24.44 24.06 24.58 22.20

metrics(1)

  1. DataFrame contendo as métricas obtidas para cada modelo, atribuindo um Score=10 para o melhor modelo.
Modelo MAE MAPE MSE RMSE R squared Explained Var Mean Error score
henriksen 2,2125 7,6139 6,9901 2,6439 0,4163 0,4163 5,08E-15 10
curtis 2,1993 7,5325 7,0147 2,6485 0,4142 0,4154 0,1182 9
smd_fm 2,2099 7,6004 7,0020 2,6461 0,4153 0,4153 -0,0015 8
stofel 2,2060 7,5649 7,0210 2,6497 0,4137 0,4148 0,1177 7
parabolic 2,2183 7,6358 7,0099 2,6476 0,4146 0,4146 5,47E-16 6
ann 2,2194 7,6453 7,0312 2,6516 0,4128 0,4128 0,0002 5
prodan_ii 2,2008 7,5168 7,0921 2,6631 0,4077 0,4127 0,2434 4
prodan_i 2,2020 7,5241 7,0886 2,6625 0,4080 0,4125 0,2323 3

df_coefficients(1)

  1. DataFrame contendo os coeficientes de cada modelo e indicando qual deles foi o selecionado como melhor modelo.
    Como iterator não foi declarado, a coluna fica vazia.
iterator model equation b0 b1 b2 selected_model
curtis ln(h) = b0 + b1·(1/x) 3,8139 -17,0254 False
parabolic h = b0 + b1·x + b2·x² 8,9680 0,6891 -0,0043 False
stofel ln(h) = b0 + b1·ln(x) 1,6300 0,4755 False
henriksen h = b0 + b1·ln(x) -20,1429 13,5058 True
prodan_i h = x² / (b0 + b1·x + b2·x²) -7,7832 1,0345 0,0131 False
prodan_ii h - 1.3 = x² / (b0 + b1·x + b2·x²) -7,9302 1,1027 0,0131 False
smd_fm y = log(y) ~ x = 1/x + 1/x² 3,8008 -16,0925 False

final_results(1)

  1. DataFrame inical contendo duas novas colunas:
    best_predicted_height com a altura estimada pelo melhor modelo.
    selected_model indicando qual foi o melhor modelo.
Parcela Dap (cm) H (m) Idade (anos) best_predicted_height selected_model
p-1 22,28 0 15 21,77502772 henriksen
p-1 23,87 22,2 15 22,2 henriksen
p-1 25,46 0 15 23,57696518 henriksen
p-1 25,78 24,5 15 24,5 henriksen
p-1 26,74 22,2 15 22,2 henriksen

Se você desejar que cada modelo seja ajustado para cada uma das parcelas basta substituir a linha:
reg = HypRel('Dap (cm)',"H (m)",df)
por:
reg = HypRel('Dap (cm)',"H (m)",df, iterator="Fazenda")

Gráficos

Como a linha reg.plots(r'C:/Your/path/to_save') informou um diretório para serem salvos os gráficos gerados, serão criadas duas pastas nesse diretório:
Uma pasta chamada heights contendo os gráficos das curvas ajustadas.
Uma pasta chamada residuals contendo os gráficos de resíduos dos ajustes.

Exemplo de gráfico gerado com a curva ajustada para o modelo de henriksen
curva ajustada
Exemplo de gráfico de resíduos gerado para o modelo de henriksen
resíduos

flowchart LR subgraph run runText1[Executa todos os modelos disponíveis] end subgraph view_metrics runText2[Retorna um DataFrame com as métricas dos modelos ajustados] end subgraph plots runText3[Gera gráficos] end subgraph coefficients runText4[Retorna um DataFrame com os coeficientes dos modelos ajustados] end subgraph predict runText5[Retorna o DataFrame original contendo uma nova coluna com as alturas estimadas] end %% Links para os subgráficos: HypRel-Module --> run HypRel-Module --> view_metrics HypRel-Module --> plots HypRel-Module --> coefficients HypRel-Module --> predict

Modelos Disponíveis

  • curtis
  • \[ \operatorname{Altura Total} =e^{(\beta_0+β1*\frac{1}{x})} \]

  • parabolic
  • \[ \operatorname{Altura Total} = \beta_0 + \beta_1 * x + \beta_2 * x^2 \]

  • stofels
  • \[ \operatorname{Altura Total} = e^{(\beta_0+\beta_1*\ln(x))} \]

  • henriksen
  • \[ \operatorname{Altura Total} = \beta_0 + \beta_1 * \ln(x) \]

  • prodan_i
  • \[ \operatorname{Altura Total} = (\frac{x^2}{\beta_0+\beta_1*x+\beta_2* x^2}) \]

  • prodan_ii
  • \[ \operatorname{Altura Total} =(\frac{x^2}{\beta_0+\beta_1*x+\beta_2* x^2})+1.3 \]

  • smd_fm
  • Adaptação do pacote Julia "Forest Mensuration" por SILVA (2022), usado para realizar regressões utilizando diferentes tipos de transformações do diâmetro à altura do peito e altura nos processos de relação hipsométrica.

    Transformações de Y

    • \( y \)
    • \( \log(y) \)
    • \( \log(y - 1.3) \)
    • \( \log(1 + y) \)
    • \( \frac{1}{y} \)
    • \( \frac{1}{y - 1.3} \)
    • \( \frac{1}{\sqrt{y}} \)
    • \( \frac{1}{\sqrt{y - 1.3}} \)
    • \( \frac{x}{\sqrt{y}} \)
    • \( \frac{x}{\sqrt{y - 1.3}} \)
    • \( \frac{x^2}{y} \)
    • \( \frac{x^2}{y - 1.3} \)

    Transformações de X

    • \( x \)
    • \( x^2 \)
    • \( \log(x) \)
    • \( \log(x)^2 \)
    • \( \frac{1}{x} \)
    • \( \frac{1}{x^2} \)
    • \( x + x^2 \)
    • \( x + \log(x) \)
    • \( x + \log(x)^2 \)
    • \( x + \frac{1}{x} \)
    • \( x + \frac{1}{x^2} \)
    • \( x^2 + \log(x) \)
    • \( x^2 + \log(x)^2 \)
    • \( x^2 + \frac{1}{x} \)
    • \( \log(x) + \log(x)^2 \)
    • \( \log(x) + \frac{1}{x} \)
    • \( \log(x) + \frac{1}{x^2} \)
    • \( \log(x)^2 + \frac{1}{x} \)
    • \( \log(x)^2 + \frac{1}{x^2} \)
    • \( \frac{1}{x} + \frac{1}{x^2} \)

  • ann
  • Explicação sobre Redes Neurais Artificiais abaixo.

    Rede Neural Artificial

    Ao selecionar o modelo 'ann', 4 diferentes estruturas de redes neurais artificiais serão testadas. Apenas o resultado de um modelo será retornado. O modelo retornado será selecionado pela função de classificação.

    Para o modelo 'ann', o módulo sklearn.neural_network.MLPRegressor é utilizado.

    --- title: Parâmetros da ANN --- classDiagram class MLPRegressor { Épocas: 3000 Ativação: logística Modo do Solver: lbfgs Tamanho do Lote: dinâmico Taxa de Aprendizado Inicial: 0.1 Modo da Taxa de Aprendizado: adaptativo } class Model-0 { Tamanhos das Camadas Ocultas: (4,5) } class Model_1 { Tamanhos das Camadas Ocultas: (4,2) } class Model_2 { Tamanhos das Camadas Ocultas: (3,2) } class Model_3 { Tamanhos das Camadas Ocultas: (4,4) } MLPRegressor <|-- Model-0 MLPRegressor <|-- Model_1 MLPRegressor <|-- Model_2 MLPRegressor <|-- Model_3

    Função de Ranqueamento

    Para selecionar os modelos com melhor desempenho e classificá-los adequadamente, as seguintes métricas são calculadas:

    Nome da Métrica Estrutura
    Erro Médio Absoluto (MAE) \( MAE = \frac{1}{n} \sum_{i=1}^{n} \|y_i - \hat{y}_i\| \)
    Erro Percentual Médio Absoluto (MAPE) \( MAPE = \frac{100}{n} \sum_{i=1}^{n} \left\|\frac{y_i - \hat{y}_i}{y_i}\right\| \)
    Erro Quadrático Médio (MSE) \( MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \)
    Raiz do Erro Quadrático Médio (RMSE) \( RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2} \)
    R² (Coeficiente de Determinação) \( R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2} \)
    Variância Explicada (EV) \( EV = 1 - \frac{Var(y - \hat{y})}{Var(y)} \)
    Erro Médio \( Erro\ Médio = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i) \)

    Após obter as métricas para cada modelo testado, o melhor modelo recebe uma pontuação de 10, enquanto os demais recebem pontuações de 9, 8 e assim por diante.

    Referências

    CURTIS, R. O. (1967). Height-Diameter and Height-Diameter-Age Equations For Second-Growth Douglas-Fir. Forest Science, 13(4), 365–375. https://doi.org/10.1093/forestscience/13.4.365

    SCOLFORO, J. R. S. (2005). Biometria Florestal: Parte I: Modelos de regressão linear e não-linear; Parte II: Modelos para relação hipsométrica, volume, afilamento e preso de matéria seca. Lavras: UFLA/FAEPE, pp. 224–226.

    SILVA, M. D. (2022). Forest Mensuration.jl: Uma Introdução à Aplicações em Julia. 128 p. Trabalho de Conclusão de Curso (Graduação em Engenharia Florestal) – Universidade Federal de Santa Maria, Frederico Westphalen, RS, 2022.

    JAMES, G.; WITTEN, D.; HASTIE, T.; TIBSHIRANI, R. (2013). An Introduction to Statistical Learning. In Springer Texts in Statistics. Springer New York. https://doi.org/10.1007/978-1-4614-7138-7