Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

forestat: Forest Carbon Sequestration and Potential Productivity Calculation 森林碳汇计量和潜力计算

License

Notifications You must be signed in to change notification settings

caf-ifrit/forestat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

67 Commits

Repository files navigation

森林碳汇计量和潜力计算

Forestat version: 1.1.0

Date: 10/10/2023


forestat 是基于中国林业科学研究院资源信息研究所(Institute of Forest Resource Information Techniques, Chinese Academy of Forestry)提出的基于林分潜在生长量的立地质量评价方法与应用[1]A basal area increment-based approach of site productivity evaluation for multi-aged and mixed forests[2]开发的R包。可依据林分高生长,划分立地等级;并以全林整体模型为基础,建立不同立地等级下的非线性混合效应生物量模型,实现更精准的碳汇计量;尤其提出了一种基于林分潜在生长量的碳汇潜力计算方法。该套算法适用于天然林和人工林,能够定量回答一定立地条件下的潜在生产力、现实生产力、提升空间有多大,可用于立地质量评价、树种适宜性评价、退化林评价等多个方面。

1 概述

forestat 包实现了碳汇潜力计算和退化林评价,其中碳汇潜力计算包括了基于林分高生长的立地等级划分,树高模型、断面积生长模型、生物量生长模型的建立,林分现实生产力与潜在生产力的计算。树高模型可用Richard模型、Logistic模型、korf模型、Gompertz模型、Weibull模型和Schumacher模型构建,断面积生长模型和生物量生长模型仅可用Richard模型构建。碳汇潜力计算依赖于给定林分类型(树种)的多个样地数据,退化林的评价依赖于多个样木和样地数据,forestat 包中带有一些样例数据。

1.1 forestat 流程图

图 1.1 碳汇计算工作流程图

图 1.2 退化林评价工作流程图

1.2 forestat 依赖的R包

Package Download Link
dplyr https://CRAN.R-project.org/package=dplyr
ggplot2 https://CRAN.R-project.org/package=ggplot2
nlme https://CRAN.R-project.org/package=nlme

2 安装

2.1 从CRAN或GitHub安装

在 R 中使用以下命令从 CRAN 安装 forestat :

# 安装forestat
install.packages("forestat")

当然,你也可以在 R 中使用以下命令从 GitHub 安装 forestat :

# 安装devtools
install.packages("devtools")
# 安装forestat
devtools::install_github("caf-ifrit/forestat/forestat")

2.2 加载 forestat

library(forestat)

3 快速开始

本部分展示的是快速完成立地分级、潜在生产力和现实生产力的完整步骤,使用的数据是包中自带的forestData样例数据。

# 加载包中 forestData 样例数据
data("forestData")
# 基于 forestData 数据建立模型,返回一个 forestData 类对象
forestData <- class.plot(forestData, model = "Richards",
 interval = 5, number = 5,
 H_start=c(a=20,b=0.05,c=1.0))
# 绘制树高生长模型散点图
plot(forestData,model.type = "H",plot.type = "Scatter",
 title = "桦木阔叶树高生长模型散点图")
# 计算 forestData 对象的潜在生产力
forestData <- potential.productivity(forestData)
# 计算 forestData 对象的现实生产力
forestData <- realized.productivity(forestData)
# 获取 forestData 对象的汇总数据
summary(forestData)

本部分展示的是快速完成退化林评价的完整步骤,使用的数据是包中自带的tree_1tree_2tree_3plot_1plot_2plot_3样例数据。

# 加载包中tree_1 tree_2 tree_3 plot_1 plot_2 plot_3样例数据
data(tree_1)
data(tree_2)
data(tree_3)
data(plot_1)
data(plot_2)
data(plot_3)
# 对退化林数据进行预处理
plot_data <- degraded_forest_preprocess(tree_1, tree_2, tree_3,
 plot_1, plot_2, plot_3)
# 计算退化林评价指标
res_data <- calc_degraded_forest_grade(plot_data)
# 查看计算结果
res_data

4 碳汇潜力计算

4.1 建立模型
4.1.1 自定义数据

为了建立一个准确的模型,好的数据是不可或缺的,在 forestat 包中内置了一个经过清洗的样例数据,可以通过如下命令加载查看样例数据:

# 加载包中 forestData 样例数据
data("forestData")
# 筛选 forestData 样例数据中ID、code、AGE、H、S、BA 和 Bio字段
# 并查看前6行数据
head(dplyr::select(forestData,ID,code,AGE,H,S,BA,Bio))
# 输出
 ID code AGE H S BA Bio
1 1 1 13 2.0 152.67461 4.899382 32.671551
2 2 1 15 3.5 68.23825 1.387268 5.698105
3 3 1 20 4.2 128.32683 3.388492 22.631467
4 4 1 19 4.2 204.93928 4.375324 18.913886
5 5 1 13 4.2 95.69713 1.904063 6.511951
6 6 1 25 4.7 153.69393 4.129810 28.024739

当然,你也可以选择加载自定义数据:

# 加载自定义数据
forestData <- read.csv("/path/to/your/folder/your_file.csv")

自定义数据中ID(样地ID)code(样地林分类型代码)AGE(林分平均年龄)H(林分平均高)是必须字段,用以建立树高模型(H-model),并绘制相关示例图。

S(林分密度指数)BA(林分断面积)Bio(林分生物量)是可选的字段,用以建立断面积生长模型(BA-model)生物量生长模型(Bio-model)

在后续的潜在生产力和现实生产力计算中,断面积生长模型与生物量生长模型是必须的。也就是自定义数据如果缺少SBABio字段将无法计算潜在生产力和现实生产力。

图 2. 自定义数据格式要求


4.1.2 构建林分生长模型

数据加载后,forestat 将使用class.plot()函数构建林分生长模型,如果自定义数据中同时包含ID、code、AGE、H、S、BA、Bio字段,则会同时构建树高模型、断面积生长模型、生物量生长模型,如果只包含ID、code、AGE、H字段,则只会构建树高模型

# 选用 Richards 模型构建林分生长模型
# interval=5表示初始树高分类的林分年龄区间设置为5,number=5表示初始树高分类数最多为5,maxiter=1000表示拟合模型的最大次数为1000
# 树高模型拟合的初始参数H_start默认为c(a=20,b=0.05,c=1.0)
# 断面积生长模型拟合的初始参数BA_start默认为c(a=80, b=0.0001, c=8, d=0.1)
# 生物量生长模型拟合的初始参数Bio_start默认为c(a=450, b=0.0001, c=12, d=0.1)
forestData <- class.plot(forestData, model = "Richards",
 interval = 5, number = 5, maxiter=1000,
 H_start=c(a=20,b=0.05,c=1.0),
 BA_start = c(a=80, b=0.0001, c=8, d=0.1),
 Bio_start=c(a=450, b=0.0001, c=12, d=0.1))

其中,model为构建树高模型时选用的模型,可在"Logistic"、"Richards"、"Korf"、"Gompertz"、"Weibull"、"Schumacher"模型中任选一个,断面积生长模型和生物量生长模型默认使用Richard模型构建。interval为初始树高分类的林分年龄区间,number为初始树高分类数的最大值,maxiter为最大拟合次数。H_start 是拟合树高模型的初始参数,BA_start 是拟合断面积生长模型的初始参数,H_start 是拟合生物量生长模型的初始参数,当拟合出现错误时,可以多尝试一些初始参数作为尝试。

class.plot()函数返回的结果为forestData 对象,包括Input(输入数据和树高分级结果)、Hmodel(树高模型结果)、BAmodel(断面积模型结果)、Biomodel(生物量模型结果)以及output(所有模型的表达式、参数及精度)。

图 3. forestData对象结构


4.1.3 获取汇总数据

为了解模型的建立情况,可以使用summary(forestData)函数获取forestData对象汇总数据。该函数返回summary.forestData对象并将相关数据输出至屏幕。

输出的第一段为输入数据的汇总,第二、三、四段分别为H-modelBA-modelBio-model的参数及其精简报告。

summary(forestData)
# 输出
# 第一段
 H S BA Bio 
 Min. : 2.00 Min. : 68.24 Min. : 1.387 Min. : 5.698 
 1st Qu.: 8.10 1st Qu.: 366.37 1st Qu.: 9.641 1st Qu.: 52.326 
 Median :10.30 Median : 494.76 Median :13.667 Median : 78.502 
 Mean :10.62 Mean : 522.53 Mean :14.516 Mean : 90.229 
 3rd Qu.:12.90 3rd Qu.: 661.84 3rd Qu.:18.750 3rd Qu.:115.636 
 Max. :19.10 Max. :1540.13 Max. :45.749 Max. :344.412 
# 第二段
H-model Parameters:
Nonlinear mixed-effects model fit by maximum likelihood
 Model: H ~ 1.3 + a * (1 - exp(-b * AGE))^c 
 Data: data 
 AIC BIC logLik
 728.4366 747.2782 -359.2183
Random effects:
 Formula: a ~ 1 | LASTGROUP
 a Residual
StdDev: 3.767163 0.7035752
Fixed effects: a + b + c ~ 1 
 Value Std.Error DF t-value p-value
a 12.185054 1.7050081 313 7.146625 0
b 0.037840 0.0043682 313 8.662536 0
c 0.761367 0.0769441 313 9.895060 0
 Correlation: 
 a b 
b -0.110 
c -0.093 0.946
Standardized Within-Group Residuals:
 Min Q1 Med Q3 Max 
-3.858592084 -0.719253472 0.007120413 0.761123585 3.375793806 
Number of Observations: 320
Number of Groups: 5 
Concise Parameter Report:
Model Coefficients:
 a1 a2 a3 a4 a5 b c
 7.013778 9.575677 11.90324 14.67456 17.75801 0.03783956 0.7613666
Model Evaluations:
 pe RMSE R2 Var TRE AIC BIC logLik
 -0.006484677 0.6980625 0.9543312 0.4887767 0.3960163 728.4366 747.2782 -359.2183
Model Formulas:
 Func Spe
 model1:H ~ 1.3 + a * (1 - exp(-b * AGE))^c model1:pdDiag(a ~ 1)
# 第三段(与第二段数据格式相似)
BA-model Parameters:
# 此处省略
......
# 第四段(与第二段数据格式相似)
Bio-model Parameters:
# 此处省略
......

4.2 绘制图像

经过4.1.2 class.plot()函数构建林分生长模型后,就可以使用plot()函数绘制图像。

其中,model.type为绘图使用的模型,可以选择H(树高模型)、BA(断面积生长模型)或者Bio(生物量生长模型)。plot.type为绘图的类型,可以选择Curve(曲线图)、Residual(残差图)、Scatter_Curve(散点曲线图)、Scatter(散点图)。xlabylablegend.labtitle分别为x轴标题y轴标题图例图像标题

# 绘制树高模型的曲线图
plot(forestData,model.type="H",
 plot.type="Curve",
 xlab="年龄(year)",ylab="树高(m)",legend.lab="立地等级",
 title="桦木阔叶混树高模型曲线图")
# 绘制断面积生长模型散点图
plot(forestData,model.type="BA",
 plot.type="Scatter",
 xlab="年龄(year)",ylab=expression(paste("断面积( ",m^2,"/",hm^2,")")),legend.lab="立地等级",
 title="桦木阔叶混断面积生长模型散点图")

不同的plot.type绘制的样图如图4所示:

图 4. 不同的plot.type绘制的样图


4.3 计算林分潜在生产力

经过4.1.2 class.plot()函数构建林分生长模型后,就可以使用potential.productivity()函数计算林分潜在生产力。在计算之前,要求forestData 对象中BA-modelBio-model已经建立。

forestData <- potential.productivity(forestData, code=1,
 age.min=5,age.max=150,
 left=0.05, right=100,
 e=1e-05, maxiter = 50) 

其中,参数code为计算潜在生产力使用的林分类型代码。age.minage.max分别为林分年龄的最小值和最大值,潜在生产力的计算会在最小值和最大值的区间中进行。leftright为拟合模型的初始参数,当拟合出现错误时,可以多尝试一些初始参数作为尝试。e为拟合模型的精度,当残差低于e时,认为模型收敛并停止拟合。maxiter为拟合模型的最大次数,当拟合次数等于maxiter时,认为模型收敛并停止拟合。


4.3.1 潜在生产力输出数据说明

计算结束后,可以使用如下命令查看并输出结果:

library(dplyr)
forestData$potential.productivity %>% head(.)
# 输出
 Max_GI Max_MI N1 D1 S0 S1 G0 G1 M0 M1 LASTGROUP AGE
1 3.949820 20.47488 9830.149 6.945724 1645.486 1800.378 33.29664 37.24646 119.5148 139.9897 1 5
2 3.348912 17.90140 8823.972 7.294578 1619.740 1748.342 33.52799 36.87690 125.2417 143.1431 1 6
3 2.906982 15.94796 8044.876 7.609892 1596.350 1705.999 33.68334 36.59033 130.1117 146.0597 1 7
4 2.568525 14.40953 7418.938 7.898755 1574.827 1670.207 33.78520 36.35373 134.3302 148.7398 1 8
5 2.300998 13.16340 6902.612 8.166065 1554.965 1639.234 33.85073 36.15173 138.0482 151.2116 1 9
6 2.084278 12.13145 6467.402 8.415423 1536.461 1611.846 33.88831 35.97259 141.3594 153.4908 1 10

输出结果中,各字段含义如下:

Max_GI:林分断面积最大年生长量

Max_MI:林分生物量最大年生长量

N1:达到潜在生长量对应的林分株数

D1:达到潜在生长量对应的林分平均直径

S0: 初始林分密度指数

S1:达到潜在生长量对应的最佳林分密度指数

G0:初始林分每公顷断面积

G1:达到潜在生长量对应的林分每公顷断面积(1年以后)

M0:初始林分每公顷生物量

M1:达到潜在生长量对应的林分每公顷生物量


4.4 计算林分现实生产力

经过4.1.2 class.plot()函数构建林分生长模型后,可以使用realized.productivity()函数计算林分现实生产力。在计算之前,要求forestData 对象中BA modelBio model已经建立。

forestData <- realized.productivity(forestData, 
 left=0.05, right=100)

其中,参数leftright是拟合模型的初始参数,当拟合出现错误时,可以多尝试一些初始参数作为尝试。


4.4.1 现实生产力输出数据说明

计算结束后,可以使用如下命令查看并输出结果:

library(dplyr)
forestData$realized.productivity %>% head(.)
# 输出
 code ID AGE H class0 LASTGROUP BA S Bio BAI VI
1 1 1 13 2.0 1 1 4.899382 152.67461 32.671551 0.18702090 1.0034425
2 1 2 15 3.5 1 1 1.387268 68.23825 5.698105 0.07181113 0.3804467
3 1 3 20 4.2 1 1 3.388492 128.32683 22.631467 0.10764262 0.6294930
4 1 4 19 4.2 1 1 4.375324 204.93928 18.913886 0.18279397 1.0839852
5 1 5 13 4.2 2 1 1.904063 95.69713 6.511951 0.11526498 0.6028645
6 1 6 25 4.7 1 1 4.129810 153.69393 28.024739 0.10696539 0.6640617

输出结果中,各字段含义如下:

BAI:断面积现实生产力

VI:生物量现实生产力


4.5 潜在生产力和现实生产力数据详情

在得到林分潜在生产力与现实生产力后,可以使用summary(forestData)函数获取forestData对象汇总数据。该函数返回summary.forestData对象并将相关数据输出至屏幕。

输出的前四段在4.1.3中已经介绍,第五段为潜在生产力与现实生产力数据详情。

summary(forestData)
# 输出
# 第一段
 H S BA Bio 
 Min. : 2.00 Min. : 68.24 Min. : 1.387 Min. : 5.698 
 
# 此处省略
......
# 第五段
 Max_GI Max_MI 
 Min. :0.1446 Min. : 1.216 
 1st Qu.:0.2046 1st Qu.: 1.813 
 Median :0.3023 Median : 2.562 
 Mean :0.5477 Mean : 4.029 
 3rd Qu.:0.5702 3rd Qu.: 4.446 
 Max. :4.4483 Max. :26.961 
 BAI VI 
 Min. :0.06481 Min. :0.3804 
 1st Qu.:0.16296 1st Qu.:1.3086 
 Median :0.22507 Median :1.8154 
 Mean :0.25199 Mean :1.9743 
 3rd Qu.:0.30246 3rd Qu.:2.4227 
 Max. :0.98168 Max. :6.6287 

5 退化林评价

5.1 数据要求

forestat 包中内置了样例数据,包括了tree_1tree_2tree_3三个样木数据以及plot_1plot_2plot_3三个样地数据,可以通过如下命令加载查看样例数据:

# 加载包中tree_1 tree_2 tree_3 plot_1 plot_2 plot_3样例数据
# tree_1 plot_1, tree_2 plot_2, tree_3 plot_3 分别为2005年、2010年、2015年清查数据
data(tree_1)
data(tree_2)
data(tree_3)
data(plot_1)
data(plot_2)
data(plot_3)
# 查看tree_1前6行数据
head(tree_1)
# 输出
 tree_number sample_plot_number inspection_type tree_species_code plot_id
1 3 4 11 410 700000004
2 13 4 14 410 700000004
3 19 4 11 420 700000004
4 26 4 12 420 700000004
5 28 4 12 420 700000004
6 29 4 12 410 700000004
# 查看plot_1前6行数据
head(plot_1)
# 输出
 sample_plot_number sample_plot_type altitudes slope_direction slope_position gradient soil_thickness humus_thickness
1 2 11 410 9 6 0 60 0
2 5 11 333 3 3 4 30 10
3 6 11 350 2 5 1 70 20
4 7 11 395 2 3 5 75 20
5 8 11 438 2 4 4 80 20
6 9 11 472 7 4 5 60 25
 land_type origin dominant_tree_species average_age age_group average_diameter_at_breast_height average_tree_height
1 180 0 0 0 0 0 0
2 111 13 620 37 2 125 116
3 240 0 0 0 0 0 0
4 111 13 620 20 1 97 110
5 111 11 620 75 4 195 97
6 111 13 630 35 2 120 89
 crown_density naturalness disaster_type disaster_level standing_stock dead_wood_stock forest_cutting_stock plot_id
1 0 0 0 0 0.000 0.000 0.000 700000002
2 85 4 20 1 4.816 0.131 0.000 700000005
3 0 0 0 0 0.000 0.000 0.000 700000006
4 60 4 0 0 1.560 0.082 0.040 700000007
5 50 4 20 1 3.665 0.464 0.013 700000008
6 60 4 20 1 4.890 0.041 1.408 700000009

样例数据中各字段含义如下:

tree_number: 样木号

sample_plot_number: 样地号

inspection_type:检尺类型

tree_species_code:树种代码

plot_id:样地ID

sample_plot_type: 样地类型

altitudes:海拔

slope_direction:坡向

slope_position:坡位

gradient:坡度

soil_thickness:土壤厚度

humus_thickness:腐殖质厚度

land_type:地类

origin:起源

dominant_tree_species:优势树种

average_age:平均年龄

age_group:龄组

average_diameter_at_breast_height:平均胸径

average_tree_height:平均树高

crown_density:郁闭度

naturalness:自然度

disaster_type:灾害类型

disaster_level:灾害等级

standing_stock:活立蓄积

dead_wood_stock:枯损蓄积

forest_cutting_stock:采伐蓄积

你也可以加载自定义数据,自定义数据中tree_1、tree_2、tree_3 必须包含字段plot_idinspection_typetree_species_code。plot_1、plot_2和plot_3必须包含字段plot_idstand_stockforest_cutting_stockcrown_densitydisaster_levelorigindominant_tree_speciesage_groupnaturalnessland_type

# 加载openxlsx包
library("openxlsx")
# 从xlsx中加载自定义数据tree_1 tree_2 tree_3 plot_1 plot_2 plot_3
tree_1 <- read.xlsx("/path/to/your/folder/tree_1.xlsx", sheet = 1)
tree_2 ...
...

5.2 退化林等级计算

在加载数据后,可以使用degraded_forest_preprocess()函数完成退化林数据预处理,使用calc_degraded_forest_grade()函数完成退化林等级计算。

# 退化林数据预处理
plot_data <- degraded_forest_preprocess(tree_1, tree_2, tree_3,
 plot_1, plot_2, plot_3)
# 退化林等级计算
res_data <- calc_degraded_forest_grade(plot_data)
# 查看计算结果
res_data

res_data中包括了p1、p2、p3、p4、p5、ID、referenceID、num、p1m、p2m、p3m、p4m、Z1、Z2、Z3、Z4、Z5、Z、Z_weights、Z_grade、Z_weights_grade等字段,含义如下:

p1:蓄积平均净增长率

p2:进界率

p3:树种减少率

p4:林分郁闭度减少率

p5:森林灾害等级

ID:分组ID,按照起源-优势数种-龄组分组

referenceID:参照对象ID

num:参照对象数量

p1m:蓄积平均净增长率的参照值

p2m:进界率的参照值

p3m:树种减少率的参照值

p4m:林分郁闭度减少率的参照值

Z1:判别因子Z1

Z2:判别因子Z2

Z3:判别因子Z3

Z4:判别因子Z4

Z5:判别因子Z5

Z:判别因子之和,$Z = Z1 + Z2 + Z3 + Z4 + Z5$

Z_weights:综合判别因子,判别因子权重之和 $Z_weights = Z1 + 0.75 \times Z2 + 0.5 \times Z3 + 0.5 \times Z4 + 0.25 \times Z5$

Z_grade:Z 对应的退化林等级

Z_weights_grade:Z_weights 对应的退化林等级

6 引用

[1] 雷相东, 符利勇, 李海奎等. 基于林分潜在生长量的立地质量评价方法与应用[J]. 林业科学, 2018, 54(12): 116-126.
[2] Fu L, Sharma R P, Zhu G, et al. A basal area increment-based approach of site productivity evaluation for multi-aged and mixed forests[J]. Forests, 2017, 8(4): 119.

About

forestat: Forest Carbon Sequestration and Potential Productivity Calculation 森林碳汇计量和潜力计算

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

Languages

AltStyle によって変換されたページ (->オリジナル) /