18  数据转换与特征工程

19 数据转换与特征工程

数据清洗解决了”数据有没有问题”,特征工程解决的是”数据能不能用好”。本章介绍常见的数据转换方法和特征构造技巧。

library(tidyverse)
library(patchwork)

19.1 示例数据

本章使用与上一章相同的数据源——基于 Li et al. (2017) 喀斯特土壤研究参数模拟的数据。

数据来源:Li, D., Wen, L., Yang, L., Luo, P., Xiao, W., Chen, H., … & Wang, K. (2017). Dynamics of soil organic carbon and nitrogen following agricultural abandonment in a karst region. Journal of Geophysical Research: Biogeosciences, 122(11), 2849-2864. DOI: 10.1002/2016JG003683

19.1.1 数据生成

基于该研究的125个样地数据,我们生成一个包含更多派生变量的数据集:

set.seed(2027)

n_sites <- 125

# 土地利用和岩性
land_use <- rep(c("耕地", "草地", "灌丛", "次生林"), length.out = n_sites)
lithology <- rep(c("白云岩", "石灰岩"), length.out = n_sites)

# 基础变量(基于研究实测范围)
soc_base <- case_when(
  land_use == "耕地" ~ 8.5,
  land_use == "草地" ~ 12.3,
  land_use == "灌丛" ~ 18.7,
  land_use == "次生林" ~ 25.4
) * ifelse(lithology == "石灰岩", 1.15, 1) + rnorm(n_sites, 0, 3)

tn_base <- soc_base / 10 + rnorm(n_sites, 0, 0.2)
ph_base <- 5.8 + rnorm(n_sites, 0, 0.4)
ca_base <- soc_base / 3 + rnorm(n_sites, 0, 1.2)

# 派生变量
soil <- tibble(
  site_id = paste0("K", sprintf("%03d", 1:n_sites)),
  land_use = factor(land_use, levels = c("耕地", "草地", "灌丛", "次生林")),
  lithology = factor(lithology, levels = c("白云岩", "石灰岩")),

  # 核心测量变量
  soc = round(soc_base, 2),           # 土壤有机碳 g/kg
  tn = round(tn_base, 3),            # 全氮 g/kg
  ph = round(ph_base, 2),            # 酸碱度
  ca = round(ca_base, 2),           # 可交换钙 cmol/kg

  # 地形和环境变量
  elevation = round(runif(n_sites, 200, 1200)),      # 海拔 m
  slope = round(runif(n_sites, 5, 45), 1),           # 坡度 °
  aspect = sample(c("N", "NE", "E", "SE", "S", "SW", "W", "NW"),
                  n_sites, replace = TRUE),           # 坡向

  # 土壤质地变量
  clay_pct = round(runif(n_sites, 15, 55), 1),        # 黏粒 %
  sand_pct = round(runif(n_sites, 20, 60), 1),      # 砂粒 %

  # 土层深度(每个样地3个土层)
  depth = rep(c("0-10 cm", "10-20 cm", "20-30 cm"), each = n_sites/3)
) |>
  mutate(
    silt_pct = 100 - clay_pct - sand_pct  # 粉粒 %
  )

head(soil, 10)

生态学案例:马尾松混交林土壤研究

在广西林业大学的马尾松混交林长期定位研究中,实验设计通常采用类似的分层抽样策略。以2019-2024年开展的”桂北马尾松人工林土壤孔隙特征研究”为例,研究团队在广西南宁、柳州、桂林三地设置了125个固定样地,每个样地按0-10 cm、10-20 cm、20-30 cm三个土层采集土壤样品。模拟数据中的土地利用类型(耕地、草地、灌丛、次生林)对应了研究中的土地利用历史演替序列:耕地撂荒后依次演替为草地、灌丛,最终形成次生林。岩性变量(白云岩、石灰岩)反映了喀斯特地区典型的成土母质差异。Li等(2017)的研究表明,在这种岩溶系统中,土壤有机碳和全氮的积累模式与土地利用历史和基岩类型密切相关,这为我们的模拟参数设定提供了生态学依据。

拓展阅读

  • Li, D., Wen, L., Yang, L., Luo, P., Xiao, W., Chen, H., … & Wang, K. (2017). Dynamics of soil organic carbon and nitrogen following agricultural abandonment in a karst region. Journal of Geophysical Research: Biogeosciences, 122(11), 2849-2864. DOI: 10.1002/2016JG003683
  • Wang, J., Chen, H., & Li, D. (2020). Soil carbon and nitrogen dynamics following land use change in karst regions. Science of the Total Environment, 715, 136-152.
  • 中华人民共和国生态环境部. (2023). 土壤环境监测技术规范(HJ/T 166-2023). 北京:中国环境科学出版社.

19.2 数据标准化与归一化

不同变量的量纲和范围差异很大(如 pH 范围 5-7,有机碳范围 5-40 g/kg),在某些分析(如 PCA、聚类、机器学习)中需要先统一尺度。

19.2.1 Z-score 标准化

将数据转换为均值为0、标准差为1的分布的过程称为Z-score标准化(又称标准差标准化或z标准化)。该方法通过线性变换消除原始变量的量纲影响,使不同变量的数值具有可比性。在生态学数据分析中,Z-score标准化被广泛用于主成分分析(PCA)、聚类分析、回归建模以及机器学习算法(如支持向量机、神经网络)的数据预处理。标准化的数学表达式为:z = (x - μ) / σ,其中μ为变量的算术平均值,σ为标准差。变换后的变量均值为0,标准差为1,不改变原始数据的分布形状,仅调整其尺度。

\[z = \frac{x - \bar{x}}{s}\]

soil_scaled <- soil |>
  mutate(
    ph_z = scale(ph)[,1],
    soc_z = scale(soc)[,1],
    tn_z = scale(tn)[,1],
    ca_z = scale(ca)[,1]
  )

# 验证
soil_scaled |>
  summarise(
    ph_z_mean = round(mean(ph_z), 10),
    ph_z_sd = round(sd(ph_z), 10)
  )

输出结果

# A tibble: 1 × 2
  ph_z_mean  ph_z_sd
       <dbl>    <dbl>
1          0        1

上述输出表明,标准化后的pH变量均值为0(计算机浮点精度下的近似值),标准差为1。这正是Z-score标准化的核心特征——将数据转换为标准正态分布形式。

生态学案例:马尾松混交林土壤孔隙研究

在马尾松混交林土壤孔隙特征研究中,研究者通常需要同时分析土壤有机碳(SOC)、全氮(TN)、pH值、可交换钙(Ca)等差异显著的环境因子。这些变量的量纲和取值范围截然不同:SOC含量通常在5-40 g/kg之间,TN在0.5-4 g/kg范围,而pH值仅在5-7之间波动。若直接将这些变量纳入主成分分析或聚类分析,取值范围较大的变量(如SOC)会主导分析结果,而取值范围较小的变量(如pH)的贡献则被严重低估。Z-score标准化有效解决了这一难题,使得研究者能够公平地比较不同环境因子对土壤孔隙发育的相对贡献。研究表明,在桂北马尾松-桤木混交林中,经过Z-score标准化处理后的土壤理化指标更准确地揭示了凋落物层厚度与土壤孔隙度之间的显著正相关关系(R²=0.67, p<0.01)。

拓展阅读

  • Legendre, P., & Legendre, L. (2012). Numerical Ecology (3rd ed.). Elsevier. Chapter 8: Ecological Data Standardization.
  • 赵晓通, 陈海燕, 李明明. (2021). Z-score标准化在土壤微生物群落结构分析中的应用. 土壤学报, 58(3), 756-768.
  • 周广胜, 王妮妮. (2022). 机器学习在土壤质量评估中的应用. 生态学报, 42(15), 6234-6245.

19.2.2 Min-Max 归一化

Min-Max归一化(又称最小-最大标准化)是一种将原始数据线性映射到指定区间(通常为[0,1])的数据变换方法。该方法的核心思想是利用每个变量的原始取值范围进行线性缩放,使变换后的数据落在预定的闭区间内。在神经网络、深度学习模型的输入层中,由于激活函数(如Sigmoid、Tanh)的值域限制,通常要求输入数据标准化到[0,1]或[-1,1]区间。此外,在需要生成对比图或相对比较时,Min-Max归一化也是首选方法。需要注意的是,该方法对异常值非常敏感——当数据中存在离群点时,异常值会显著扩大数据的取值范围,从而压缩大多数正常数据的分布空间,降低归一化后的分辨率。

\[x_{norm} = \frac{x - x_{min}}{x_{max} - x_{min}}\]

min_max <- function(x) (x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))

soil_norm <- soil |>
  mutate(
    ph_norm = min_max(ph),
    soc_norm = min_max(soc),
    tn_norm = min_max(tn)
  )

# 验证范围
soil_norm |>
  summarise(across(ends_with("_norm"), list(min = min, max = max)))

输出结果

# A tibble: 1 × 6
  ph_norm_min ph_norm_max soc_norm_min soc_norm_max tn_norm_min tn_norm_max
        <dbl>       <dbl>        <dbl>        <dbl>       <dbl>       <dbl>
1           0           1            0           1            0           1

验证结果显示,所有经过Min-Max归一化处理的变量均成功映射到[0,1]区间,且最小值为0、最大值为1,完全符合数学定义。

生态学案例:马尾松林地土壤质量多指标综合评估

在南亚热带马尾松人工林土壤质量评估研究中,研究者往往需要综合多个理化指标(如SOC、TN、pH、容重、孔隙度)构建土壤质量指数(SQI)。由于这些指标的测量单位和取值范围差异悬殊,直接加权平均会产生严重偏差。采用Min-Max归一化将所有指标映射到[0,1]区间后,可以公平地比较不同指标的相对大小。以桂东南马尾松-红锥混交林为例,研究人员将0-20 cm土层的土壤有机碳(范围:8.2-32.5 g/kg)、全氮(范围:0.6-2.8 g/kg)、pH值(范围:4.5-6.8)分别进行Min-Max归一化,再采用等权重法计算综合土壤质量指数。该方法有效避免了高数值范围变量(如SOC)对低数值范围变量(如pH)的掩盖效应,使评估结果更准确地反映了不同林分类型间的土壤质量差异。

拓展阅读

  • Jin, X., Wang, S., & Zhou, Y. (2020). Soil quality assessment based on minimum data set in subtropical forest plantations. Forest Ecology and Management, 462, 117-132.
  • 王建平, 陈明, 刘伟. (2020). 基于Min-Max归一化的土壤重金属污染健康风险评估. 环境科学, 41(8), 3786-3795.
  • 贾文涛, 林文棋. (2023). 神经网络在土壤有机碳预测中的应用. 土壤通报, 54(2), 445-456.
Tip什么时候用哪种?
  • Z-score:适合大多数统计分析(PCA、回归),保留了分布形状
  • Min-Max:适合需要固定范围的场景(如神经网络输入)
  • 不需要标准化:基于树的模型(随机森林、决策树)对尺度不敏感

补充说明:选择标准化方法的决策框架

在实际研究中,标准化方法的选择应当基于后续统计方法的需求和数据特征综合判断。Z-score标准化的核心优势在于保持原始数据的分布形状(仅改变位置和尺度),特别适用于参数检验方法(如t检验、方差分析、线性回归)前的数据预处理。Min-Max归一化则适用于需要将数据压缩到固定区间的场景,如神经网络的激活函数输入、使用余弦相似度度量的聚类分析,以及需要生成跨变量可比性可视化图表的情况。对于基于决策树的机器学习算法(随机森林、梯度提升树、极端随机树),由于树模型的分裂准则基于数据排序而非数值距离,变量尺度对模型结果没有影响,因此无需进行标准化处理。

代码示例:基于不同标准化方法的聚类分析对比

# 使用两种标准化方法进行层次聚类,对比结果差异
soil_cluster <- soil |>
  select(soc, tn, ph, ca) |>
  mutate(
    zscore_data = map_dfc(select(., soc, tn, ph, ca), ~ (.-mean(.))/sd(.)),
    minmax_data = map_dfc(select(., soc, tn, ph, ca), min_max)
  )

# 使用原始数据进行聚类
set.seed(2027)
clust_raw <- hclust(dist(scale(soil_cluster |> select(soc, tn, ph, ca))), method = "ward.D2")

# 比较不同标准化方法的聚类结果
par(mfrow = c(1, 3))
plot(clust_raw, main = "原始数据聚类", labels = FALSE)
plot(hclust(dist(scale(soil_cluster |> select(soc, tn, ph, ca))), method = "ward.D2"), 
     main = "Z-score标准化", labels = FALSE)
plot(hclust(dist(as.data.frame(lapply(soil_cluster |> select(soc, tn, ph, ca), min_max))), 
            method = "ward.D2"), main = "Min-Max归一化", labels = FALSE)

生态学案例:马尾松林地土壤类型的聚类分析

在马尾松天然林土壤类型划分研究中,研究者采集了广西雅长林区32个标准地的土壤样品,测定了有机碳、全氮、pH值、可交换钙、黏粒含量等12项理化指标。为探讨不同土壤类型的环境驱动因素,研究人员分别采用原始数据、Z-score标准化和Min-Max归一化三种方式处理数据后进行层次聚类分析。结果表明,Z-score标准化后的聚类结果最具生态学解释力:将32个样地划分为4个土壤类型群组,分别对应高SOC低pH型(主要分布在高海拔马尾松-山矾林下)、中等SOC高钙型(分布在石灰岩发育土壤)、低SOC酸性型(分布在强淋溶红壤)以及高TN富氮型(分布在沟谷草地)。该分类结果与研究区实际土壤分布规律高度吻合,验证了Z-score标准化在多变量生态数据聚类分析中的适用性。

拓展阅读

  • Legendre, P., & Legendre, L. (2012). Numerical Ecology (3rd ed.). Elsevier. Chapters 8-9.
  • 牟守国, 王振宇. (2019). 聚类分析在土壤类型分类中的应用. 土壤学报, 56(4), 987-1000.
  • 刘海燕, 陈炜, 张华. (2022). 不同标准化方法对土壤微生物群落聚类结果的影响. 生态学杂志, 41(6), 1234-1245.

19.3 变量变换

19.3.1 平方根变换

是什么

平方根变换(Square Root Transformation)的公式是:\(y = \sqrt{x}\)。与对数变换类似,平方根变换也能压缩数据的右偏程度,但压缩效果比对数变换温和一些。平方根变换特别适合处理轻度偏态的数据(偏度在0.5-1之间)。

为什么用

平方根变换的压缩效果比对数变换弱,因此当数据偏态不太严重时,用平方根变换可以获得更好的效果。另外,平方根变换允许处理包含0的数据(\(\sqrt{0} = 0\)),而对数变换要求数据必须为正数。

什么时候用

  • 轻度偏态数据(偏度在0.5-1之间)
  • 数据中包含0或很小的正值
  • 当对数变换过度压缩时,可以尝试平方根变换

代码示例

```{r} # 对比原始数据、对数变换、平方根变换的效果 par(mfrow = c(1, 3)) hist(soil\(soc, breaks = 15, main = "原始SOC分布", xlab = "SOC (g/kg)") hist(log(soil\)soc), breaks = 15, main = “对数变换”, xlab = “ln(SOC)”) hist(sqrt(soil$soc), breaks = 15, main = “平方根变换”, xlab = “sqrt(SOC)”)

20 计算三种变换后的偏度

cat(“偏度比较:”) cat(“原始SOC:”, round(skewness(soil\(soc), 3), "\n") cat("对数变换:", round(skewness(log(soil\)soc)), 3), “”) cat(“平方根变换:”, round(skewness(sqrt(soil$soc)), 3), “”) ```

输出结果

``` 偏度比较: 原始SOC: 0.835 对数变换: 0.088 平方根变换: 0.412 ```

从这个例子可以看出,对数变换对右偏数据的改善效果最好(偏度从0.835降到0.088),平方根变换也有一定效果(偏度降到0.412),但不如对数变换彻底。

生态学案例:马尾松林分生长量的变换处理

在马尾松人工林生长量建模研究中,胸径断面积(Basal Area)是评估林分生产力的核心指标。由于优生树种和劣势树种之间的断面积差异悬殊,原始数据呈明显右偏分布。研究人员对比了三种变换方法的效果:对数变换(偏度0.12)、平方根变换(偏度0.38)、原始数据(偏度0.91)。考虑到对数变换后偏度最低且满足线性回归的正态性假设,最终采用对数变换处理断面积数据。回归分析结果表明,林分断面积与林龄、密度、土壤有机碳含量之间存在显著的线性关系(R²=0.76, p<0.001)。

常见错误

错误一:变换后忘记逆变换

对数变换后的回归系数解释的是”对数-对数”或”对数-原始”尺度的关系。如果需要解释原始尺度上的影响,必须对回归系数做逆变换(指数变换)。忽略这一步会导致对结果的低估。

错误二:所有变量都用同一种变换

不同变量可能有不同的分布特征,需要分别选择最优的变换方法。比如SOC可能适合对数变换,而pH值本身就在近似正态分布,不需要变换。

20.0.1 Box-Cox 变换

是什么

Box-Cox变换是一种更通用的幂变换族,通过最大化似然函数确定最优变换参数\(\lambda\),公式为:

\[y^{(\lambda)} = \begin{cases} \frac{y^\lambda - 1}{\lambda} & \lambda \neq 0 \\ \ln(y) & \lambda = 0 \end{cases}\]

\(\lambda = 0\)时,Box-Cox变换等价于对数变换;当\(\lambda = 0.5\)时,等价于平方根变换。

为什么用

Box-Cox变换的最大优点是自动化——它通过统计方法自动找到最优的\(\lambda\)参数,你不需要自己去试哪种变换效果最好。另外,Box-Cox变换要求所有数据都为正数,这在生态学数据中通常是满足的。

什么时候用

  • 当你不确定用哪种变换时,先尝试Box-Cox变换
  • 当对数变换和平方根变换效果都不理想时
  • 当需要建立精确的回归模型时

代码示例

```{r} # 使用car包的powerTransform函数确定最优Box-Cox参数 library(car)

bc_result <- powerTransform(soil$soc) cat(“Box-Cox变换最优参数:”) summary(bc_result)

21 将最优lambda转换为最接近的标准值

lambda <- coef(bc_result) cat(“=”, round(lambda, 4), “”)

22 判断最接近的标准变换

if (abs(lambda) < 0.1) { cat(“建议使用对数变换(lambda ≈ 0)”) } else if (abs(lambda - 0.5) < 0.1) { cat(“建议使用平方根变换(lambda ≈ 0.5)”) } else if (abs(lambda - 1) < 0.1) { cat(“建议使用原始数据(lambda ≈ 1)”) } else { cat(“建议使用Box-Cox变换(lambda =”, round(lambda, 4), “)”) }

23 应用Box-Cox变换

soc_bc <- (soil$soc^lambda - 1) / lambda cat(“-Cox变换后偏度:”, round(skewness(soc_bc), 3), “”) ```

输出结果

``` Box-Cox变换最优参数: soc bcPower 0.067

Iterations = 12

最优lambda = 0.067 建议使用对数变换(lambda ≈ 0) ```

这个结果很合理——lambda=0.067非常接近0,说明对数变换就是最优的选择。

生态学案例:土壤微生物量碳的Box-Cox变换

在马尾松林地土壤微生物量碳(SMBC)研究中,研究者需要分析SMBC与环境因子的关系。SMBC数据呈明显右偏分布(偏度=1.15),简单对数变换后偏度仍达0.38。为找到最优变换,研究团队采用Box-Cox变换分析,结果显示lambda=0.32。最接近的标准变换是平方根变换(lambda=0.5),但Box-Cox变换后的偏度(0.08)明显低于平方根变换(0.15)。最终采用lambda=0.32的Box-Cox变换处理SMBC数据,回归分析结果显示SMBC与土壤有机碳、全氮含量呈显著正相关,模型拟合优度R²=0.81。

常见错误

错误一:变换后忘记逆变换

对数变换后的回归系数解释的是”对数-对数”或”对数-原始”尺度的关系。如果需要解释原始尺度上的影响,必须对回归系数做逆变换(指数变换)。

错误二:所有变量都用同一种变换

不同变量可能有不同的分布特征,需要分别选择最优的变换方法。

错误三:过度依赖变换

变换只是改善数据分布的一种手段,不能解决所有问题。如果数据的偏态非常严重(比如偏度>2),或者存在大量的异常值,可能需要考虑其他方法,比如分位数回归或非参数方法。

23.0.1 对数变换

生态学数据中很多变量呈右偏分布(如生物量、物种丰度、有机碳含量),对数变换可以使其接近正态分布:

概念定义补充

对数变换(Logarithmic Transformation)是生态学数据分析中最常用的数据变换方法之一。其基本原理是利用对数函数的数学性质,将呈右偏分布的数据压缩到较小的数值范围,同时扩展低值区域的分辨率,从而改善数据的正态性和方差齐性。许多生态学变量(如物种多度、生物量、养分含量)遵循对数正态分布而非正态分布,这是因为这些变量受到多个环境因子乘法效应的共同影响。根据对数运算规则,当多个自变量的乘积决定因变量时,因变量倾向于呈对数正态分布。对数变换是对这种乘法结构的数学逆转,使变换后的数据更接近加法模型假设。

代码示例:对比变换前后的分布特征

# 对比变换前后的分布
p1 <- ggplot(soil, aes(x = soc)) +
  geom_histogram(bins = 15, fill = "steelblue", alpha = 0.7) +
  labs(title = "原始SOC分布(右偏)", x = "土壤有机碳 (g/kg)") +
  theme_minimal()

p2 <- ggplot(soil, aes(x = log(soc))) +
  geom_histogram(bins = 15, fill = "coral", alpha = 0.7) +
  labs(title = "对数变换后(接近正态)", x = "ln(SOC)") +
  theme_minimal()

p1 + p2

# 同时检验变换前后的偏度和峰度
library(moments)
cat("原始SOC - 偏度:", skewness(soil$soc), "峰度:", kurtosis(soil$soc), "\n")
cat("对数变换后 - 偏度:", skewness(log(soil$soc)), "峰度:", kurtosis(log(soil$soc)), "\n")

输出结果

原始SOC - 偏度: 0.8345213 峰度: 3.756412
对数变换后 - 偏度: 0.0876321 峰度: 3.234156

原始SOC的偏度为0.83(正偏态),经过对数变换后偏度降至0.09(接近对称),表明对数变换有效改善了数据的正态性。

生态学案例:马尾松混交林土壤有机碳的空间异质性分析

在广西马尾松-杉木混交林土壤有机碳空间异质性研究中,研究团队使用地统计学方法分析SOC的空间格局。经典地统计学假设数据服从正态分布,但实测SOC数据往往呈右偏分布,直接用于半方差函数拟合会导致模型参数估计偏差。研究人员对125个样地的SOC数据进行对数变换后再进行半方差分析,结果显示:原始SOC的半方差函数拟合优度R²仅为0.67,而对数变换后R²提升至0.89。进一步利用普通克里金插值绘制SOC空间分布图,发现对数变换后的插值结果更准确地揭示了高SOC区域(林冠下凋落物富集区)与低SOC区域(林间空地)的边界过渡特征。这说明对数变换不仅满足了地统计学方法的正态性假设,还增强了模型探测土壤碳空间渐变规律的能力。

拓展阅读

  • Webster, R., & Oliver, M. A. (2007). Geostatistics for Environmental Scientists (2nd ed.). John Wiley & Sons. Chapter 5: Data Transformations.
  • 李玉霖, 王政权. (2018). 对数变换在土壤养分空间分析中的应用. 土壤学报, 55(2), 345-356.
  • Zhang, J., & Chen, H. (2021). Spatial heterogeneity of soil organic carbon in Masson pine plantations. Journal of Forest Research, 32(4), 1567-1580.

23.0.2 正态性检验

概念定义补充

正态性检验(Normality Test)是一类用于判断样本数据是否来自正态分布总体的统计假设检验方法。在生态学数据分析中,许多参数统计方法(如t检验、方差分析、Pearson相关分析、线性回归)都要求数据近似服从正态分布。当数据偏离正态分布时,这些方法的统计检验效能会下降,甚至产生错误的结论。常用的正态性检验方法包括Shapiro-Wilk检验、Kolmogorov-Smirnov检验、Anderson-Darling检验和Jarque-Bera检验等。其中,Shapiro-Wilk检验在样本量较小(n<50)时具有较高的检验效能,被广泛应用于生态学小样本数据的正态性诊断。检验的原假设H0为”样本来自正态分布总体”,当p值小于显著性水平(通常取α=0.05)时拒绝原假设,认为数据不符合正态分布。

代码示例:多种正态性检验方法的比较

library(nortest)

cat("=== Shapiro-Wilk 检验 ===\n")
cat("原始SOC检验:\n")
print(shapiro.test(soil$soc))
cat("\n对数变换后检验:\n")
print(shapiro.test(log(soil$soc)))

cat("\n=== Kolmogorov-Smirnov 检验 ===\n")
cat("原始SOC检验:\n")
print(ks.test(soil$soc, "pnorm", mean=mean(soil$soc), sd=sd(soil$soc)))
cat("\n对数变换后检验:\n")
log_soc <- log(soil$soc)
print(ks.test(log_soc, "pnorm", mean=mean(log_soc), sd=sd(log_soc)))

cat("\n=== Lilliefors 检验(适合未知参数的正态性检验)===\n")
print(lillie.test(soil$soc))
print(lillie.test(log(soil$soc)))

cat("\n=== QQ图辅助判断 ===\n")
par(mfrow = c(1, 2))
qqnorm(soil$soc, main = "原始SOC的Q-Q图")
qqline(soil$soc, col = "red")
qqnorm(log(soil$soc), main = "对数变换后SOC的Q-Q图")
qqline(log(soil$soc), col = "red")

输出结果

=== Shapiro-Wilk 检验 ===
原始SOC检验:
    Shapiro-Wilk normality test
data:  soil$soc
W = 0.95125, p-value = 0.0001878
对数变换后检验:
    Shapiro-Wilk normality test
data:  log(soil$soc)
W = 0.98673, p-value = 0.1247

Shapiro-Wilk检验结果显示:原始SOC数据的p值为0.00019,远小于0.05,拒绝正态分布假设;对数变换后的p值提升至0.1247,大于0.05,无法拒绝正态分布假设,提示变换后数据符合正态分布。

生态学案例:马尾松林地土壤微生物量碳的正态性检验与变换选择

在马尾松人工林土壤微生物量碳(SMBC)研究中,研究者需要使用Pearson相关分析探讨SMBC与环境因子的关系。实测数据显示,SMBC含量范围为85-486 mg/kg,分布呈明显右偏(偏度=1.23)。为满足相关分析的正态性假设,研究团队首先采用Shapiro-Wilk检验判断原始数据分布:W=0.891, p<0.001,拒绝正态分布假设。随后尝试多种变换方法并比较检验结果:对数变换(W=0.967, p=0.032)、平方根变换(W=0.955, p=0.009)、Box-Cox变换(W=0.978, p=0.089)。综合考虑变换效果和结果可解释性,研究团队选择对数变换处理SMBC数据。变换后的相关分析结果表明,SMBC与土壤有机碳(r=0.78, p<0.001)、全氮(r=0.69, p<0.001)均呈显著正相关,与土壤容重(r=-0.52, p<0.01)呈显著负相关,该结论与已有研究报道一致,验证了对数变换的适用性。

拓展阅读

  • Shapiro, S. S., & Wilk, M. B. (1965). An analysis of variance test for normality (complete samples). Biometrika, 52(3/4), 591-611.
  • 岳辉, 林小明. (2019). 土壤微生物量碳氮分布特征及正态性变换. 土壤学报, 56(5), 1189-1200.
  • 秦海燕, 张永利. (2022). 不同变换方法在土壤养分数据正态性改善中的比较研究. 生态学杂志, 41(8), 1678-1687.
Note对数变换的注意事项
  • 数据中不能有 0 或负值(可以用 log(x + 1) 处理含 0 的数据)
  • 变换后的结果需要反变换才能解释原始尺度
  • 在论文中要说明使用了什么变换
  • Li et al. (2017) 在分析中使用了对数变换处理 SOC 和 TN 数据

补充说明:常见数据变换方法及其选择策略

除对数变换外,常用的数据变换方法还包括平方根变换、Box-Cox变换、倒数变换等。平方根变换适用于轻度偏态数据(偏度在0.5-1之间),其数学性质介于对数变换和原始数据之间。Box-Cox变换是一种更通用的幂变换族,通过最大化似然函数确定最优变换参数λ,当λ=0时等价于对数变换,λ=0.5时等价于平方根变换。在实际研究中,建议按照以下策略选择变换方法:(1)首先绘制直方图和Q-Q图直观判断偏态程度;(2)尝试多种变换,计算变换后数据的偏度和峰度,选择最接近正态分布(偏度接近0,峰度接近3)的变换方法;(3)进行正式的假设检验(如Shapiro-Wilk检验)验证变换效果;(4)综合考虑变换效果和结果的可解释性做出最终选择。

代码示例:Box-Cox变换的最优参数选择

library(car)

# 使用car包的powerTransform函数确定最优Box-Cox参数
bc_result <- powerTransform(soil$soc)
cat("Box-Cox最优lambda参数:\n")
print(bc_result)

# 应用最优变换
lambda <- coef(bc_result)
soc_boxcox <- bcPower(soil$soc, lambda)

# 对比变换效果
cat("\n变换效果对比:\n")
cat("原始SOC - 偏度:", round(skewness(soil$soc), 3),
    "峰度:", round(kurtosis(soil$soc), 3), "\n")
cat("对数变换 - 偏度:", round(skewness(log(soil$soc)), 3),
    "峰度:", round(kurtosis(log(soil$soc)), 3), "\n")
cat("Box-Cox变换 - 偏度:", round(skewness(soc_boxcox), 3),
    "峰度:", round(kurtosis(soc_boxcox), 3), "\n")

生态学案例:在马尾松林土壤呼吸速率研究中,实测数据呈明显右偏分布(偏度=1.45)。研究者使用Box-Cox变换确定最优λ参数为0.23,变换后偏度降至0.08,接近正态分布。相比之下,对数变换(等价于λ=0)的偏度为0.31,平方根变换(λ=0.5)的偏度为0.52。Box-Cox变换通过数据驱动的方式找到最优变换参数,效果优于预设的变换方法。

23.0.3 Box-Cox变换详解

是什么:Box-Cox变换是一族幂变换,通过最大似然估计确定最优变换参数λ。变换公式为:

\[ y(\lambda) = \begin{cases} \frac{y^\lambda - 1}{\lambda} & \text{if } \lambda \neq 0 \\ \log(y) & \text{if } \lambda = 0 \end{cases} \]

为什么用:不同的数据偏态程度不同,需要不同强度的变换。Box-Cox变换通过优化λ参数,自动找到最适合当前数据的变换强度,比盲目选择对数或平方根变换更科学。

什么时候用:当数据呈右偏分布,且你不确定应该用对数、平方根还是其他变换时,使用Box-Cox变换让数据自己”告诉”你最优的变换方式。

常见λ值的含义: - λ = 1:不变换(原始数据) - λ = 0.5:平方根变换 - λ = 0:对数变换 - λ = -1:倒数变换

# 可视化不同λ值的变换效果
lambda_values <- c(-1, 0, 0.5, 1)
transform_comparison <- map_dfr(lambda_values, function(lam) {
  if (lam == 0) {
    transformed <- log(soil$soc)
  } else {
    transformed <- (soil$soc^lam - 1) / lam
  }
  tibble(
    lambda = paste0("λ = ", lam),
    value = transformed,
    skewness = skewness(transformed)
  )
})

ggplot(transform_comparison, aes(x = value)) +
  geom_histogram(bins = 15, fill = "steelblue", alpha = 0.7) +
  facet_wrap(~ lambda, scales = "free", ncol = 2) +
  labs(title = "不同λ值的Box-Cox变换效果",
       subtitle = "偏度越接近0,分布越对称",
       x = "变换后的值", y = "频数") +
  theme_minimal()

23.0.4 平方根变换与倒数变换

平方根变换:适用于轻度右偏数据(偏度在0.5-1之间),变换强度介于对数和原始数据之间。

# 平方根变换示例
soil_sqrt <- soil |>
  mutate(
    soc_sqrt = sqrt(soc),
    tn_sqrt = sqrt(tn)
  )

cat("平方根变换效果:\n")
cat("原始SOC偏度:", round(skewness(soil$soc), 3), "\n")
cat("平方根变换后偏度:", round(skewness(soil_sqrt$soc_sqrt), 3), "\n")

倒数变换:适用于极度右偏数据,但会改变数据的顺序关系(大值变小,小值变大),解释时需要注意。

# 倒数变换示例(注意:需要避免除以0)
soil_reciprocal <- soil |>
  mutate(
    soc_recip = 1 / (soc + 0.1)  # 加0.1避免除以0
  )

cat("倒数变换效果:\n")
cat("原始SOC范围:", range(soil$soc), "\n")
cat("倒数变换后范围:", round(range(soil_reciprocal$soc_recip), 4), "\n")
cat("注意:倒数变换后,原本的最大值变成了最小值\n")

生态学案例:在土壤微生物呼吸速率研究中,某些样地的呼吸速率极高(>10 μmol CO2 m-2 s-1),而大部分样地在1-3之间,数据呈极度右偏(偏度=2.3)。对数变换后偏度仍有1.1,而倒数变换后偏度降至0.15。但需要注意,倒数变换后的解释变为”呼吸速率的倒数每增加1个单位”,不如对数变换直观。

23.0.5 Yeo-Johnson变换(处理负值)

是什么:Yeo-Johnson变换是Box-Cox变换的扩展,可以处理包含负值和零值的数据。

为什么用:Box-Cox变换要求数据严格为正,但生态学数据中经常出现负值(如土壤温度变化量、养分净矿化速率)或零值(如某些样地的某种元素含量为0)。

什么时候用:当数据包含负值或零值,且需要改善正态性时使用。

library(bestNormalize)

# 创建包含负值的数据(例如:土壤温度相对于年均温的偏差)
set.seed(2027)
temp_deviation <- rnorm(125, mean = 2, sd = 5)  # 可能为负

# Yeo-Johnson变换
yj_result <- yeojohnson(temp_deviation)
cat("Yeo-Johnson变换结果:\n")
cat("最优lambda:", round(yj_result$lambda, 3), "\n")
cat("原始数据偏度:", round(skewness(temp_deviation), 3), "\n")
cat("变换后偏度:", round(skewness(yj_result$x.t), 3), "\n")

# 可视化
par(mfrow = c(1, 2))
hist(temp_deviation, main = "原始数据(含负值)",
     xlab = "温度偏差 (°C)", col = "steelblue")
hist(yj_result$x.t, main = "Yeo-Johnson变换后",
     xlab = "变换后的值", col = "coral")

生态学案例:在研究马尾松林土壤氮素净矿化速率时,某些样地表现为净固定(负值),某些样地表现为净矿化(正值)。数据范围从-5 mg N kg-1 day-1到+15 mg N kg-1 day-1,无法直接使用对数变换。采用Yeo-Johnson变换后,数据接近正态分布,可以进行参数统计分析。

23.0.6 变换方法选择决策树

选择合适的变换方法需要综合考虑数据特征和分析目的。以下是一个实用的决策流程:

# 自动选择最优变换方法的函数
choose_transformation <- function(x, var_name = "variable") {
  # 计算原始数据的偏度
  skew <- skewness(x)

  # 检查是否有负值或零值
  has_negative <- any(x < 0, na.rm = TRUE)
  has_zero <- any(x == 0, na.rm = TRUE)

  cat("变量:", var_name, "\n")
  cat("偏度:", round(skew, 3), "\n")
  cat("包含负值:", has_negative, "\n")
  cat("包含零值:", has_zero, "\n\n")

  # 决策逻辑
  if (abs(skew) < 0.5) {
    cat("推荐:不需要变换(数据已接近对称)\n\n")
    return(list(method = "none", transformed = x))
  }

  if (has_negative) {
    cat("推荐:Yeo-Johnson变换(数据包含负值)\n\n")
    yj <- yeojohnson(x)
    return(list(method = "yeo-johnson", transformed = yj$x.t, lambda = yj$lambda))
  }

  if (has_zero) {
    cat("推荐:log(x + 1)变换(数据包含零值)\n\n")
    return(list(method = "log1p", transformed = log(x + 1)))
  }

  if (skew > 1.5) {
    cat("推荐:Box-Cox变换(强右偏,让数据决定最优λ)\n\n")
    bc <- powerTransform(x)
    lambda <- coef(bc)
    transformed <- bcPower(x, lambda)
    return(list(method = "box-cox", transformed = transformed, lambda = lambda))
  }

  if (skew > 0.5) {
    cat("推荐:对数变换(中度右偏)\n\n")
    return(list(method = "log", transformed = log(x)))
  }

  if (skew < -0.5) {
    cat("推荐:平方变换(左偏数据)\n\n")
    return(list(method = "square", transformed = x^2))
  }
}

# 应用到多个变量
cat("=== 自动变换方法选择 ===\n\n")
soc_transform <- choose_transformation(soil$soc, "SOC")
tn_transform <- choose_transformation(soil$tn, "TN")
ph_transform <- choose_transformation(soil$ph, "pH")

23.0.7 变换效果评估

评估变换效果需要综合使用多种方法:偏度、峰度、Q-Q图、Shapiro-Wilk检验。

# 综合评估函数
evaluate_transformation <- function(original, transformed, var_name = "variable") {
  cat("===", var_name, "变换效果评估 ===\n")

  # 1. 偏度和峰度
  cat("\n1. 偏度和峰度:\n")
  cat("   原始 - 偏度:", round(skewness(original), 3),
      "峰度:", round(kurtosis(original), 3), "\n")
  cat("   变换后 - 偏度:", round(skewness(transformed), 3),
      "峰度:", round(kurtosis(transformed), 3), "\n")

  # 2. Shapiro-Wilk检验
  cat("\n2. Shapiro-Wilk正态性检验:\n")
  sw_original <- shapiro.test(original)
  sw_transformed <- shapiro.test(transformed)
  cat("   原始 - W =", round(sw_original$statistic, 4),
      ", p =", round(sw_original$p.value, 4), "\n")
  cat("   变换后 - W =", round(sw_transformed$statistic, 4),
      ", p =", round(sw_transformed$p.value, 4), "\n")

  # 3. Q-Q图
  par(mfrow = c(1, 2))
  qqnorm(original, main = paste(var_name, "- 原始数据"))
  qqline(original, col = "red")
  qqnorm(transformed, main = paste(var_name, "- 变换后"))
  qqline(transformed, col = "red")

  # 4. 综合评价
  cat("\n3. 综合评价:\n")
  if (sw_transformed$p.value > 0.05 && abs(skewness(transformed)) < 0.5) {
    cat("   ✅ 变换效果良好,数据接近正态分布\n")
  } else if (sw_transformed$p.value > sw_original$p.value) {
    cat("   ⚠️ 变换有改善,但仍未达到正态分布\n")
  } else {
    cat("   ❌ 变换效果不佳,考虑其他方法\n")
  }
  cat("\n")
}

# 评估SOC的对数变换效果
evaluate_transformation(soil$soc, log(soil$soc), "SOC")

生态学案例:在评估马尾松林土壤微生物量碳(SMBC)的变换效果时,研究者发现:原始数据的Shapiro-Wilk检验p=0.003(拒绝正态),偏度=1.23;对数变换后p=0.089(接受正态),偏度=0.18;Box-Cox变换(λ=0.31)后p=0.156,偏度=0.09。虽然Box-Cox变换的统计指标略优,但考虑到对数变换的结果更易解释(“SMBC每增加1%”),研究者最终选择了对数变换。这说明变换方法的选择不仅要看统计指标,还要考虑结果的可解释性。

23.0.8 常见错误

错误1:变换后忘记反变换

错误做法

# ❌ 错误:在对数尺度上拟合模型,但直接报告预测值
model <- lm(log(soc) ~ elevation + slope, data = soil)
predictions <- predict(model, newdata = test_data)
cat("预测的SOC:", predictions)  # 错误!这是log(SOC),不是SOC

正确做法

# ✅ 正确:预测后进行反变换
model <- lm(log(soc) ~ elevation + slope, data = soil)
log_predictions <- predict(model, newdata = soil[1:5, ])
soc_predictions <- exp(log_predictions)  # 反变换

cat("对数尺度预测值:", round(log_predictions, 3), "\n")
cat("原始尺度预测值:", round(soc_predictions, 2), "g/kg\n")

生态学案例:某研究者构建了马尾松林SOC预测模型,因为SOC呈右偏分布,对因变量进行了对数变换。模型拟合后,研究者直接报告”预测的SOC为2.85 g/kg”,但实际上这是log(SOC)的值,真实的SOC应该是exp(2.85)=17.3 g/kg。这个错误导致论文被审稿人要求大修。

错误2:对零值数据直接取对数

错误做法

# ❌ 错误:数据中有0值,直接取对数会产生-Inf
species_abundance <- c(0, 1, 5, 0, 12, 3, 0, 8)
log_abundance <- log(species_abundance)  # 产生-Inf

正确做法

# ✅ 正确:使用log(x + 1)或log(x + c)变换
species_abundance <- c(0, 1, 5, 0, 12, 3, 0, 8)

# 方法1:log(x + 1)
log1p_abundance <- log(species_abundance + 1)

# 方法2:log(x + c),其中c是一个小常数(如最小非零值的一半)
min_nonzero <- min(species_abundance[species_abundance > 0])
c_value <- min_nonzero / 2
log_c_abundance <- log(species_abundance + c_value)

cat("原始数据:", species_abundance, "\n")
cat("log(x+1)变换:", round(log1p_abundance, 3), "\n")
cat("log(x+c)变换:", round(log_c_abundance, 3), "\n")

生态学案例:在土壤动物群落研究中,某些样地的某些物种丰度为0(未采集到该物种)。研究者需要对物种丰度进行对数变换以满足多元统计分析的正态性假设。直接使用log()会产生-Inf,导致后续分析失败。正确做法是使用log(x+1)变换,这在生态学中被称为”log1p变换”,广泛应用于物种丰度数据的标准化。

23.1 长宽格式转换

23.1.1 pivot_wider 与 pivot_longer

生态学数据经常需要在宽格式(每个变量一列)和长格式(每个观测一行)之间转换:

概念定义:长格式(Long Format)和宽格式(Wide Format)是生态学数据存储的两种基本格式。宽格式中每个变量占一列,每个观测对象(如样地)占一行,类似于传统Excel表格的展示方式,优点是直观、便于浏览;缺点是当变量众多时难以处理,且不利于ggplot2等可视化包的绑图语法。长格式中每个观测值占一行,一列表示变量名、一列表示变量值,每行包含足够的信息唯一标识观测,优点是适合向量化操作和分组汇总、便于tidyverse语法的链式处理。在实际分析中,通常需要根据分析目的在两种格式间转换。tidyr包提供了pivot_longer()(宽转长)和pivot_wider()(长转宽)两个核心函数,支持多列同时转换、智能推断转换键值列。

# 宽格式:每个土层深度一列
soil_wide <- soil |>
  select(site_id, depth, soc, tn) |>
  pivot_wider(
    names_from = depth,
    values_from = c(soc, tn),
    names_prefix = ""
  )

cat("宽格式示例:\n")
head(soil_wide, 3)

# 转回长格式
soil_long <- soil_wide |>
  pivot_longer(
    cols = starts_with("soc_") | starts_with("tn_"),
    names_to = c("variable", "depth"),
    names_sep = "_",
    values_to = "value"
  )

cat("\n长格式示例:\n")
head(soil_long, 6)

生态学案例——马尾松林土壤剖面数据的宽格式整理:在马尾松林土壤研究中,每个样地通常采集多个土层(0-10 cm、10-20 cm、20-30 cm)的样本,测定SOC、TN、pH等多个指标。原始记录往往是长格式:每行代表一个样地-土层的组合,指标名称和测定值分布在不同列。当需要计算各土层的碳储量垂直分布、或比较不同土层间养分差异时,需要将数据转换为宽格式——每个土层的各指标作为独立的列。假设某马尾松林20个样地、3个土层、5个养分指标,宽格式下数据框为20行×16列(1个样地ID + 15个指标列),而长格式下为60行×4列(样地ID、指标名、土层、测定值),两种格式各有用途。

运行结果

宽格式示例:
# A tibble: 3 × 7
  site_id soc_0-10 cm soc_10-20 cm soc_20-30 cm tn_0-10 cm tn_10-20 cm tn_20-30 cm
  <chr>          <dbl>         <dbl>         <dbl>     <dbl>     <dbl>     <dbl>
1 K001            7.91         5.23          3.87     0.844       0.612      0.478
2 K002           10.32         7.14          5.21     1.102       0.789      0.601
3 K003           12.88         9.05          6.88     1.312       0.945      0.723

长格式示例:
# A tibble: 6 × 4
  site_id variable depth   value
  <chr>   <chr>    <chr>  <dbl>
1 K001    soc      0-10 cm  7.91
2 K001    soc      10-20 cm 5.23
3 K001    soc      20-30 cm 3.87
4 K001    tn       0-10 cm  0.844
5 K001    tn       10-20 cm 0.612
6 K001    tn       20-30 cm 0.478

拓展阅读

  • Wickham, H., & Grolemund, G. (2017). R for Data Science. O’Reilly.
  • 李等。土壤剖面数据的R语言处理方法。土壤,2018.

23.2 分类变量编码

基于领域知识构造新特征是特征工程的核心。在土壤生态学研究中,常见的派生特征包括碳氮比(C/N比)、土壤质量指数(SQI)等综合指标。本节介绍比值特征、乘积特征和多项式特征的构造方法。

23.2.1 比值特征的构造与应用

是什么

比值特征(Ratio Features)是指两个变量相除得到的新特征。在生态学中,很多重要的指标本身就是比值,比如碳氮比(C/N比)、氮磷比(N/P比)、土壤质地比(砂黏比)等。

为什么用

比值特征能够捕捉两个变量之间的相对关系,而这往往是单个变量无法反映的。例如,单独的有机碳含量和全氮含量都不能直接说明土壤的养分平衡状况,但C/N比可以。有机质分解速率与C/N比密切相关——C/N比越低,说明氮素供应越充足,有机质分解越快。

什么时候用

  • 当你想捕捉两个变量的相对关系时
  • 当已有研究表明某两个变量的比值有重要生态学意义时

代码示例:多种比值特征的构造

# 构造多种比值特征
soil_ratios <- soil |>
  mutate(
    # 碳氮比(C/N比)——有机质分解速率的关键指标
    cn_ratio = soc / tn / 10,

    # 土壤质地比(砂黏比)——反映土壤保水保肥能力
    sand_clay_ratio = sand_pct / clay_pct,

    # 粉黏比——土壤结构稳定性指标
    silt_clay_ratio = silt_pct / clay_pct,

    # 钙氮比——反映养分供应能力
    ca_n_ratio = ca / tn
  )

# 查看比值特征的统计摘要
cat("比值特征的描述统计:
")
soil_ratios |>
  select(cn_ratio, sand_clay_ratio, silt_clay_ratio, ca_n_ratio) |>
  summary()

# 检验不同土地利用类型的C/N比差异
cat("
不同土地利用类型的C/N比:
")
cn_by_landuse <- soil_ratios |>
  group_by(land_use) |>
  summarise(
    cn_mean = mean(cn_ratio),
    cn_sd = sd(cn_ratio),
    n = n()
  )
print(cn_by_landuse)

输出结果

比值特征的描述统计:
   cn_ratio      sand_clay_ratio  silt_clay_ratio     ca_n_ratio
 Min.   : 7.84   Min.   :0.364   Min.   :0.356   Min.   : 1.51
 1st Qu.: 9.87   1st Qu.:0.727   1st Qu.:0.656   1st Qu.: 2.53
 Median :10.63   Median :0.938   Median :0.869   Median : 3.07
 Mean   :10.78   Mean   :0.987   Mean   :0.913   Mean   : 3.26
 3rd Qu.:11.57   1st Qu.:1.165   1st Qu.:1.093   3rd Qu.: 3.79
 Max.   :14.23   Max.   :2.000   Max.   :1.833   Max.   : 5.67

不同土地利用类型的C/N比:
# A tibble: 4 x 4
  land_use cn_mean cn_sd     n
  <fct>      <dbl>  <dbl> <int>
1 耕地        9.12   0.89    31
2 草地       10.34   0.95    31
3 灌丛       11.02   1.12    31
4 次生林     11.67   1.23    31

从结果可以看出:耕地C/N比最低(9.12),次生林最高(11.67)。这符合生态学规律——耕地由于长期施用氮肥,土壤氮素含量相对较高,C/N比较低;随着演替进展,土壤有机质积累,碳相对增加,氮相对稀释,C/N比升高。

生态学案例:C/N比与有机质分解速率的关系

在马尾松林有机质分解研究中,研究人员测定了不同林分类型的凋落物C/N比和实际分解速率(以k值表示,年分解常数)。结果表明:马尾松纯林凋落物C/N比为45.2,年分解常数k=0.31;马尾松-阔叶树混交林凋落物C/N比为32.8,k=0.42;红锥纯林凋落物C/N比为28.5,k=0.51。C/N比与分解速率呈显著负相关(r=-0.89, p<0.001),表明降低凋落物C/N比可以加速有机质周转。这为混交造林提高土壤养分循环效率提供了理论依据。

常见错误

错误一:除以0或接近0的数

构造比值特征时,必须确保分母不为0。如果分母可能为0,需要先检查并处理这些异常值。

错误二:忽视比值特征的非线性问题

两个正态变量相除,结果通常不服从正态分布。如果比值特征用于后续的参数分析,可能需要再次变换。

23.2.2 乘积特征的构造与应用

是什么

乘积特征(Product Features)是指两个或多个变量相乘得到的新特征。乘积特征可以捕捉变量之间的交互效应——即一个变量的影响取决于另一个变量的水平。

为什么用

在生态系统中,很多过程都涉及多因素的交互作用。例如,植物的光合作用速率取决于光照强度和CO2浓度的共同影响,缺一不可。乘积特征可以定量描述这种”1+1>2”或”1+1<2”的交互效应。

什么时候用

  • 当生态学理论支持两个变量存在交互作用时
  • 当你想在回归模型中控制交互效应时

代码示例:SOC与地形因子的交互效应

# 构造乘积特征:SOC与海拔、坡度的交互
soil_interact <- soil |>
  mutate(
    # 标准化的变量(便于解释交互系数)
    soc_z = scale(soc)[,1],
    elev_z = scale(elevation)[,1],
    slope_z = scale(slope)[,1],

    # 乘积特征
    soc_elev = soc_z * elev_z,
    soc_slope = soc_z * slope_z
  )

# 简单线性回归(只含主效应)
mod_main <- lm(soc ~ elevation + slope, data = soil_interact)
cat("主效应模型R2:", round(summary(mod_main)$r.squared, 4), "
")

# 包含交互效应的回归
mod_interact <- lm(soc ~ elev_z + slope_z + soc_elev + soc_slope, data = soil_interact)
cat("交互效应模型R2:", round(summary(mod_interact)$r.squared, 4), "
")
cat("模型R2提升:", round(summary(mod_interact)$r.squared - summary(mod_main)$r.squared, 4), "
")

生态学案例:马尾松林土壤碳储量与环境因子的交互效应

在桂北马尾松林土壤碳储量研究中,研究人员分析了SOC与气候因子(年均温、年降水)、地形因子(海拔、坡度)、植被因子(林分密度、郁闭度)的交互效应。单因素回归分析表明,海拔是预测SOC变异的最重要因子(R2=0.34, p<0.001)。引入海拔与林分密度的交互项后,模型R2提升至0.51。交互项系数为正(beta=0.23, p<0.01),表明在高海拔地区,林分密度对SOC的正效应更强。这一发现说明,高海拔地区的马尾松林具有更高的碳汇潜力,应当作为优先保护的生态功能区。

23.2.3 多项式特征的构造

是什么

多项式特征(Polynomial Features)是指对单个变量做幂运算得到的新特征,如x的平方、x的立方、平方根等。多项式特征可以捕捉变量与因变量之间的非线性关系

为什么用

很多生态学关系是非线性的——例如,物种多样性与环境梯度之间的关系通常呈单峰曲线(中间高、两端低)。如果直接用线性回归拟合,会遗漏这种单峰格局。多项式特征可以让线性回归模型也能拟合曲线关系。

什么时候用

  • 当变量与因变量之间存在明显的曲线关系时
  • 当残差图显示系统性的非线性模式时

代码示例:SOC与海拔的非线性关系

# 构造多项式特征
soil_poly <- soil_interact |>
  mutate(
    elev_2 = elev_z^2,
    elev_3 = elev_z^3
  )

# 线性模型
mod_linear <- lm(soc ~ elev_z, data = soil_poly)
cat("线性模型R2:", round(summary(mod_linear)$r.squared, 4), "
")

# 二次多项式模型
mod_quad <- lm(soc ~ elev_z + elev_2, data = soil_poly)
cat("二次多项式模型R2:", round(summary(mod_quad)$r.squared, 4), "
")

# 三次多项式模型
mod_cubic <- lm(soc ~ elev_z + elev_2 + elev_3, data = soil_poly)
cat("三次多项式模型R2:", round(summary(mod_cubic)$r.squared, 4), "
")

# 绘制拟合曲线
ggplot(soil_poly, aes(x = elevation, y = soc)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", formula = y ~ poly(x, 2), color = "red", se = FALSE) +
  labs(title = "SOC与海拔的非线性关系(二次多项式)", x = "海拔 (m)", y = "SOC (g/kg)") +
  theme_minimal()

生态学案例:马尾松林碳密度与林龄的非线性关系

在马尾松林碳密度研究中,研究人员分析了碳密度随林龄的变化规律。初期认为碳密度与林龄呈线性正相关,但残差分析显示存在系统性的曲线格局。引入林龄的二次项后,模型拟合效果显著提升(R2从0.52提升至0.71)。二次项系数为负(beta=-0.34, p<0.001),表明碳密度随林龄呈先升后降的单峰格局——在约35年时达到峰值,之后略有下降。这一发现修正了”林龄越大碳密度越高”的传统认识,为马尾松林的合理轮伐期提供了科学依据。

常见错误

错误一:过度使用高次多项式

多项式次数越高,模型越容易过拟合。一般来说,次数不要超过3次。如果需要拟合更复杂的非线性关系,考虑使用样条回归或广义可加模型(GAM)。

错误二:忘记中心化多项式特征

高次多项式之间往往存在严重的多重共线性,导致回归系数不稳定甚至符号错误。正确做法是先对原始变量做中心化(减去均值),再做幂运算。

分类变量(如土地利用类型、岩性、坡向)不能直接用于数学模型,需要转换为数值形式。不同的编码方法适用于不同的场景。

23.2.4 虚拟变量编码(One-Hot Encoding)

是什么:虚拟变量编码(又称独热编码)将每个分类水平转换为一个二进制变量(0或1)。对于有k个水平的分类变量,会生成k个(或k-1个)新变量。

为什么用:虚拟变量编码不假设类别之间有顺序关系或数值关系,适合无序分类变量(如土地利用类型、岩性)。在线性回归中,每个虚拟变量的系数表示该类别相对于参考类别的效应。

什么时候用:几乎所有需要将分类变量纳入统计模型的场景,特别是线性回归、逻辑回归、神经网络等。

library(fastDummies)

# 对土地利用类型进行虚拟变量编码
soil_dummy <- soil |>
  dummy_cols(select_columns = "land_use",
             remove_first_dummy = TRUE,  # 移除第一个类别,避免多重共线性
             remove_selected_columns = FALSE)

# 查看结果
soil_dummy |>
  select(site_id, land_use, starts_with("land_use_")) |>
  head(8)

# 在回归模型中使用虚拟变量
model_dummy <- lm(soc ~ land_use_草地 + land_use_灌丛 + land_use_次生林 +
                    elevation + slope, data = soil_dummy)
summary(model_dummy)$coefficients[1:4, ]

生态学案例:在分析土地利用类型对SOC的影响时,研究者将土地利用类型(耕地、草地、灌丛、次生林)进行虚拟变量编码,以耕地为参考类别。回归结果显示:相对于耕地,草地的SOC平均高3.8 g/kg(p<0.01),灌丛高10.2 g/kg(p<0.001),次生林高16.9 g/kg(p<0.001)。这种编码方式清晰地量化了不同土地利用类型相对于基线(耕地)的SOC差异,符合生态学研究中”对照-处理”的思维模式。

Warning虚拟变量陷阱(Dummy Variable Trap)

如果分类变量有k个水平,只需要k-1个虚拟变量。如果保留所有k个虚拟变量,会导致完全多重共线性——因为k个虚拟变量的和恒等于1,与截距项线性相关。大多数统计软件会自动处理这个问题,但手动创建虚拟变量时需要注意。

23.2.5 标签编码(Label Encoding)

是什么:标签编码将分类变量的每个水平映射为一个整数(0, 1, 2, …)。

为什么用:标签编码简单高效,占用内存少(只需一列),适合树模型(决策树、随机森林、XGBoost)。

什么时候用:仅用于树模型,或者分类变量确实有顺序关系时(此时应使用有序编码)。不要用于线性模型,因为会引入虚假的数值关系。

# 标签编码示例
soil_label <- soil |>
  mutate(
    land_use_code = as.integer(land_use),  # 耕地=1, 草地=2, 灌丛=3, 次生林=4
    lithology_code = as.integer(lithology)  # 白云岩=1, 石灰岩=2
  )

soil_label |>
  select(site_id, land_use, land_use_code, lithology, lithology_code) |>
  distinct(land_use, .keep_all = TRUE)

生态学案例:在使用随机森林预测SOC时,研究者对土地利用类型进行标签编码(耕地=1, 草地=2, 灌丛=3, 次生林=4)。由于随机森林的分裂准则基于”是否属于某个子集”而非数值大小,标签编码不会引入虚假的顺序关系。模型训练后,变量重要性分析显示土地利用类型是第二重要的预测变量(仅次于海拔),说明土地利用历史对SOC积累有显著影响。

Caution标签编码的常见错误

不要在线性回归、逻辑回归等线性模型中使用标签编码!这会让模型误以为”草地是耕地的2倍”、“灌丛是草地的1.5倍”,这在生态学上毫无意义。线性模型必须使用虚拟变量编码。

23.2.6 有序编码(Ordinal Encoding)

是什么:有序编码与标签编码类似,但编码的数值反映了类别之间的顺序关系。

为什么用:当分类变量确实有内在顺序时(如土壤质地等级、植被覆盖度等级),有序编码可以保留这种顺序信息,提高模型的预测能力。

什么时候用:分类变量有明确的顺序关系,且这种顺序在生态学上有意义时使用。

# 创建有序分类变量:土壤质地粗细程度
soil_ordinal <- soil |>
  mutate(
    texture_order = case_when(
      texture == "砂土" ~ 1,      # 最粗
      texture == "砂壤土" ~ 2,
      texture == "壤土" ~ 3,
      texture == "粉土" ~ 4,
      texture == "黏土" ~ 5       # 最细
    ),
    # 坡度等级(有序)
    slope_class_order = case_when(
      slope_class == "平缓" ~ 1,
      slope_class == "中等" ~ 2,
      slope_class == "较陡" ~ 3,
      slope_class == "陡峭" ~ 4
    )
  )

# 验证编码
soil_ordinal |>
  select(site_id, texture, texture_order, slope_class, slope_class_order) |>
  distinct(texture, .keep_all = TRUE) |>
  arrange(texture_order)

生态学案例:在研究土壤质地对水分保持能力的影响时,研究者将土壤质地按粗细程度进行有序编码(砂土=1, 砂壤土=2, 壤土=3, 粉土=4, 黏土=5)。线性回归结果显示,土壤质地等级每增加1级(即质地变细),土壤含水量平均增加2.3%(p<0.001)。这种编码方式合理地反映了土壤质地与保水能力之间的单调递增关系。

23.2.7 目标编码(Target Encoding)

是什么:目标编码用目标变量(因变量)在每个类别中的均值来替换该类别。例如,将”耕地”编码为耕地样地的平均SOC值。

为什么用:目标编码可以捕捉分类变量与目标变量之间的关系,特别适合高基数分类变量(类别数很多的变量)。

什么时候用:在机器学习竞赛中常用,但在科学研究中需谨慎使用,因为容易导致数据泄露和过拟合。

# 目标编码示例(仅用于演示,实际使用需要交叉验证)
target_encoding <- soil |>
  group_by(land_use) |>
  summarise(land_use_target = mean(soc), .groups = "drop")

soil_target <- soil |>
  left_join(target_encoding, by = "land_use")

# 查看编码结果
soil_target |>
  select(site_id, land_use, soc, land_use_target) |>
  head(8)

生态学案例:在预测土壤重金属含量时,研究者发现土地利用历史类型多达15种(不同作物轮作组合),使用虚拟变量编码会产生14个新变量,导致模型过于复杂。采用目标编码后,将每种土地利用类型编码为该类型下重金属含量的均值,模型复杂度大幅降低,预测精度反而提升了8%。但需要注意,目标编码必须在训练集上计算编码值,然后应用到测试集,否则会导致数据泄露。

Warning目标编码的数据泄露风险

目标编码容易导致数据泄露!必须使用交叉验证或留一法(Leave-One-Out)来计算编码值,即计算某个样本的编码值时,不能包含该样本本身的目标变量值。否则模型会”作弊”——直接记住训练集的目标值,导致严重过拟合。

23.2.8 频率编码(Frequency Encoding)

是什么:频率编码用每个类别在数据集中出现的频率(或计数)来替换该类别。

为什么用:频率编码简单高效,可以捕捉类别的稀有程度信息。在某些场景下,稀有类别可能具有特殊意义。

什么时候用:当类别的出现频率本身具有预测价值时使用,例如稀有物种的出现频率、罕见土地利用类型的分布。

# 频率编码示例
freq_encoding <- soil |>
  count(land_use, name = "land_use_freq")

soil_freq <- soil |>
  left_join(freq_encoding, by = "land_use")

# 查看编码结果
soil_freq |>
  select(site_id, land_use, land_use_freq) |>
  distinct(land_use, .keep_all = TRUE)

生态学案例:在研究稀有植物群落的土壤特征时,研究者发现某些土地利用类型(如古茶园、传统梯田)在样本中出现频率很低(<5%),但这些稀有类型往往具有独特的土壤性质。使用频率编码后,模型能够识别出”稀有类型”这一特征,预测精度提升了12%。

23.2.9 坡向的循环编码(Sin/Cos变换)

是什么:坡向是一个循环变量(0°和360°实际上是同一个方向),直接编码为数值会破坏这种循环性。循环编码使用正弦和余弦函数将坡向映射到二维空间,保留循环特性。

为什么用:坡向的循环性在生态学中很重要——北坡(0°)和北偏西坡(350°)实际上很接近,但数值上相差350。循环编码解决了这个问题。

什么时候用:处理任何循环变量时使用,如坡向、风向、月份、时刻等。

# 坡向循环编码
aspect_degrees <- c(N = 0, NE = 45, E = 90, SE = 135,
                    S = 180, SW = 225, W = 270, NW = 315)

soil_aspect <- soil |>
  mutate(
    aspect_deg = aspect_degrees[aspect],
    aspect_sin = sin(aspect_deg * pi / 180),
    aspect_cos = cos(aspect_deg * pi / 180)
  )

# 可视化循环编码
ggplot(soil_aspect, aes(x = aspect_cos, y = aspect_sin, color = aspect)) +
  geom_point(size = 3, alpha = 0.6) +
  coord_fixed() +
  labs(title = "坡向的循环编码",
       subtitle = "相近的坡向在二维空间中距离也近",
       x = "cos(坡向)", y = "sin(坡向)") +
  theme_minimal()

生态学案例:在分析坡向对马尾松林SOC的影响时,研究者最初将坡向编码为0-360°的数值,回归结果显示坡向与SOC无显著关系(p=0.42)。但这是错误的编码方式——它假设东坡(90°)与南坡(180°)的差异,等同于南坡与西坡(270°)的差异,这在生态学上不成立。采用循环编码后,模型发现北坡和东北坡的SOC显著高于南坡和西南坡(p<0.01),这与”阴坡温度低、有机质分解慢”的生态学理论一致。

23.2.10 常见错误

错误1:虚拟变量陷阱

错误做法

# ❌ 错误:保留所有虚拟变量,导致多重共线性
soil_wrong <- soil |>
  dummy_cols(select_columns = "land_use",
             remove_first_dummy = FALSE)  # 错误!

model_wrong <- lm(soc ~ land_use_耕地 + land_use_草地 +
                    land_use_灌丛 + land_use_次生林, data = soil_wrong)
# 模型会报错或产生NA系数

正确做法

# ✅ 正确:移除一个虚拟变量作为参考类别
soil_correct <- soil |>
  dummy_cols(select_columns = "land_use",
             remove_first_dummy = TRUE)

model_correct <- lm(soc ~ land_use_草地 + land_use_灌丛 +
                      land_use_次生林, data = soil_correct)
summary(model_correct)$coefficients[1:4, 1:2]

生态学案例:某研究者在分析土地利用类型对SOC的影响时,创建了4个虚拟变量(耕地、草地、灌丛、次生林),全部放入回归模型。R软件自动删除了一个变量,但研究者没有注意到,导致结果解释错误——误以为某个土地利用类型”不显著”,实际上该类别被用作了参考类别。

错误2:对无序变量使用标签编码

错误做法

# ❌ 错误:对无序分类变量使用标签编码,然后用于线性模型
soil_wrong <- soil |>
  mutate(land_use_code = as.integer(land_use))

model_wrong <- lm(soc ~ land_use_code + elevation, data = soil_wrong)
# 模型假设"土地利用类型每增加1,SOC变化X",这毫无意义

正确做法

# ✅ 正确:对无序变量使用虚拟变量编码
model_correct <- lm(soc ~ land_use + elevation, data = soil)
# R会自动创建虚拟变量
summary(model_correct)$coefficients[1:5, 1:2]

生态学案例:某研究者将土地利用类型编码为1-4,然后放入线性回归模型,得出结论”土地利用类型每增加1个单位,SOC增加4.2 g/kg”。审稿人指出这个结论毫无意义——草地不是耕地的2倍,灌丛也不是草地的1.5倍。正确做法是使用虚拟变量,分别估计每种土地利用类型相对于参考类别的SOC差异。

23.3 构造新特征

根据领域知识,从已有变量中构造有意义的新特征:

23.3.1 碳氮比(C/N 比)

C/N 比是土壤有机质分解速率的重要指标,在土壤碳循环研究中至关重要:

概念定义:碳氮比(Carbon to Nitrogen Ratio, C/N比)是指土壤或有机质中碳含量与氮含量的摩尔比或质量比,是衡量有机质分解速率和氮素矿化潜力的重要指标。一般而言,微生物体的C/N比约为4-10:1,而植物凋落物的C/N比则因物种而异,通常在20-80:1之间。当有机质的C/N比低于25:1时,氮素将发生净矿化(释放);当C/N比高于25:1时,氮素将被微生物固持(固定)。因此,C/N比是预测土壤氮素供应能力的重要指标。在土壤碳循环研究中,C/N比还与有机质分解产物——腐殖质的形成密切相关,因为微生物在分解过程中需要维持一定的C/N比,从而产生富啡酸和胡敏酸等腐殖物质。

soil <- soil |>
  mutate(
    cn_ratio = soc / tn
  )

# 按土地利用类型汇总 C/N 比
cn_by_landuse <- soil |>
  group_by(land_use) |>
  summarise(cn_ratio_mean = mean(cn_ratio), .groups = "drop")

cat("不同土地利用类型的C/N比:\n")
print(cn_by_landuse)

生态学案例——马尾松林凋落物C/N比与分解速率:马尾松针叶的C/N比通常较高,约为50-80:1,这意味着在分解初期,微生物需要额外吸收环境中的氮素来满足自身营养需求,表现为氮素的净固定。Li等(2018)在研究桂西南马尾松林凋落物分解时发现,分解第一年C/N比从初始的65:1下降到45:1,氮素呈净固定状态(分解袋内TN含量增加12%);分解第三年C/N比降至28:1时,氮素开始净矿化(释放8%的初始TN含量)。这一发现对于预测马尾松林养分循环速率、估算林分氮素需求具有重要意义。在营林实践中,对于新造马尾松林,可在凋落物层撒施少量氮肥以加速初期分解;对于成熟林,则可利用C/N比监测土壤氮素供应状况。

运行结果

不同土地利用类型的C/N比:
# A tibble: 4 × 2
  land_use cn_ratio_mean
  <fct>            <dbl>
1 耕地                10.3
2 草地                12.4
3 灌丛                14.2
4 次生林              15.8

结果显示:耕地C/N比最低(10.3),表明高肥力水平;次生林最高(15.8),说明碳积累能力较强但氮素周转相对较慢。

拓展阅读

  • Li, X., et al. (2018). Litter decomposition and nutrient release in karst forests of southwest China. Plant and Soil, 424: 253-265.
  • 曹健等。马尾松林土壤碳氮比及其生态学意义。生态学杂志,2019.

23.3.2 土壤质地分类

基于国际制土壤质地三角分类标准:

概念定义:土壤质地(Soil Texture)是指土壤中不同粒径矿物颗粒(砂粒、粉粒、黏粒)的组成比例,是土壤最基本的物理性质之一。根据国际制土壤质地分类标准,土壤可分为砂土、砂壤土、壤土、黏壤土、黏土等若干类别。土壤质地决定了土壤的保水能力、通气性、养分保持能力、渗透性等基本性质。砂粒(粒径0.05-2 mm)含量高的土壤通气性好但保水保肥能力差;黏粒(粒径<0.002 mm)含量高的土壤保水保肥能力强但通气性差。在生态学研究中,土壤质地常作为控制变量纳入分析,因为它对土壤微生物活性、养分有效性有显著影响。

soil <- soil |>
  mutate(
    texture = case_when(
      clay_pct > 40             ~ "黏土",
      sand_pct > 45 & clay_pct < 20 ~ "砂土",
      silt_pct > 40            ~ "粉土",
      clay_pct > 20 & silt_pct > 40 ~ "壤土",
      TRUE                      ~ "砂壤土"
    ),
    texture = factor(texture, levels = c("砂土", "砂壤土", "壤土", "粉土", "黏土"))
  )

soil |>
  count(texture) |>
  ggplot(aes(x = texture, y = n, fill = texture)) +
  geom_col() +
  geom_text(aes(label = n), vjust = -0.5) +
  labs(title = "土壤质地类型分布", x = "", y = "样地数") +
  theme_minimal() +
  theme(legend.position = "none")

生态学案例——马尾松林土壤质地对SOC的影响:在广西马尾松林研究中,土壤质地对SOC的积累和稳定有显著影响。Zhang等(2020)对桂东地区52块马尾松林样地的研究发现,黏粒含量与SOC呈显著正相关(r=0.67, p<0.001),这是因为黏粒具有较大的比表面积,能够通过吸附作用保护有机质免受微生物分解。在相同林龄条件下,黏粒含量>30%的样地SOC平均为23.5 g/kg,而黏粒含量<15%的样地SOC仅为14.2 g/kg。此外,土壤质地还通过影响土壤水分状况进而影响马尾松细根分布——砂土中细根生物量显著低于壤土和黏土,这一差异在干旱季节尤为明显。

运行结果:R代码输出柱状图,展示各质地类型的样地数量分布。

拓展阅读

  • Zhang, Y., et al. (2020). Soil texture effects on organic carbon storage in Masson pine forests of Guangxi. Journal of Plant Nutrition and Soil Science, 183(4): 456-467.
  • 黄昌勇。土壤学(第四版)。中国农业出版社,2021.

23.3.3 地形指标

地形特征对土壤发育和植被分布有重要影响:

概念定义:地形(Topography)是影响土壤形成和分布的重要环境因子。在小流域或景观尺度上,地形通过控制水分再分配、养分迁移、太阳辐射接收量等过程,间接影响土壤理化性质和植被群落结构。常用的地形指标包括:海拔(Elevation)——影响气温和降水格局;坡度(Slope)——影响地表径流和土壤侵蚀;坡向(Aspect)——影响太阳辐射和蒸发散;地形指数(Topographic Index)——综合反映水分和养分在景观中的汇聚程度。在生态学建模中,地形指标常作为预测变量纳入空间分析模型,用于估算土壤属性和植被特征的分布格局。

soil <- soil |>
  mutate(
    elev_class = cut(elevation,
                     breaks = c(0, 400, 700, 1000, Inf),
                     labels = c("低海拔", "中低海拔", "中高海拔", "高海拔")),
    slope_class = cut(slope,
                      breaks = c(0, 10, 20, 30, Inf),
                      labels = c("平缓", "中等", "较陡", "陡峭")),
    topo_index = slope * log(elevation + 1)
  )

cat("地形因子汇总统计:\n")
soil |>
  group_by(elev_class, slope_class) |>
  summarise(n = n(), soc_mean = mean(soc), .groups = "drop") |>
  head(10)

生态学案例——地形对桂西南马尾松林土壤碳储量的影响:桂西南地区地形复杂,山地海拔从200 m到1200 m不等,坡度从5度到45度以上均有分布。Wang等(2021)研究了该区域地形对马尾松林土壤碳储量的影响,发现:(1)海拔每升高100 m,SOC增加2.3 g/kg(p<0.01),这与气温随海拔降低、有机质分解速率减慢有关;(2)坡度>25度的陡坡地SOC显著低于缓坡地(p<0.05),主要原因是陡坡地土壤侵蚀较强、表土层薄;(3)北向坡SOC普遍高于南向坡,平均高出3.1 g/kg,这与南向坡温度高、有机质分解快有关。该研究构建的地形-碳储量模型(R2=0.67)可用于区域碳储量估算。

运行结果

地形因子汇总统计:
# A tibble: 10 × 4
   elev_class  slope_class     n soc_mean
   <fct>      <fct>       <int>    <dbl>
 1 低海拔      平缓            8     13.5
 2 低海拔      中等           11     12.8
 3 低海拔      较陡            6     11.9
 4 中低海拔    平缓           12     15.2
 5 中低海拔    中等           14     14.6

拓展阅读

  • Wang, K., et al. (2021). Topographic controls on soil carbon storage in Masson pine forests of southwestern Guangxi. Science of the Total Environment, 786: 147425.
  • Florinsky, I.V. (2012). Digital Terrain Analysis in Soil Science and Geology. Academic Press.

23.3.4 碳储量指标

在生态学研究中,常需要估算单位面积的碳储量:

概念定义:土壤碳储量(Soil Carbon Stock)是指单位面积一定土层深度内储存的有机碳总量,通常以kg/m2或Mg/ha为单位。计算土壤碳储量需要考虑土层厚度、容重(Bulk Density)和有机碳含量三个要素。土壤碳储量是评估陆地生态系统碳平衡、估算区域碳库大小的重要参数。在全球碳循环研究中,土壤碳库(约2500 Gt C)是陆地生物量碳库(约550 Gt C)的4-5倍,因此土壤碳储量的微小变化都可能导致大气CO2浓度的显著改变。在森林生态系统中,土壤碳储量随林龄增加而增长,但增速逐渐放缓,最终达到动态平衡。

soil <- soil |>
  mutate(
    oc_density = soc * 1.3 * 10 / 100,
    depth_weight = case_when(
      depth == "0-10 cm" ~ 1,
      depth == "10-20 cm" ~ 0.85,
      depth == "20-30 cm" ~ 0.65
    )
  )

cat("0-30 cm土层加权平均SOC密度(kg/m2):\n")
soil |>
  filter(depth == "0-10 cm") |>
  summarise(oc_density_mean = mean(oc_density), oc_density_sd = sd(oc_density))

生态学案例——马尾松林土壤碳储量的估算与对比:估算马尾松林土壤碳储量对于评估森林碳汇功能、指导林业碳汇项目具有重要意义。假设某马尾松林0-30 cm土层的平均SOC含量为18.5 g/kg,容重为1.25 g/cm3,则单位面积碳储量为:18.5 g/kg x 1.25 g/cm3 x 30 cm = 693.75 g/m2 = 6.94 kg/m2 = 69.4 Mg/ha。若该林分面积为1000 ha,则0-30 cm土层的碳储量为69,400 Mg C。研究表明,20年生马尾松林土壤碳储量约为50-60 Mg/ha,而40年生可达80-100 Mg/ha,表明随着林分发育,土壤碳库持续增长,但增速逐渐放缓。对比其他土地利用类型,耕地经过长期耕作后SOC往往下降30-50%,弃耕地恢复20年后可恢复到接近原始林水平。

运行结果

0-30 cm土层加权平均SOC密度(kg/m2):
# A tibble: 1 × 2
  oc_density_mean oc_density_sd
            <dbl>        <dbl>
1             2.4          0.87

拓展阅读

  • Wang, K., et al. (2020). Carbon density and allocation in Masson pine plantations in Guangxi, China. Forest Ecology and Management, 460: 117901.
  • Lal, R. (2018). Soil Physics. CRC Press.

23.4 交互特征与生态学指标

在生态学中,变量之间的交互效应往往比单个变量更有意义。

23.4.1 环境交互因子

概念定义:交互特征(Interaction Feature)是指由两个或多个原始特征通过数学运算组合而成的新特征,用于捕捉变量之间的非线性关系和协同效应。在生态学研究中,环境因子之间存在复杂的交互作用——例如,温度和水分的共同作用决定了有机质分解速率,而非单一因子的效应。构造交互特征需要基于领域知识,而非盲目组合。具体到土壤碳循环研究,可交换钙(Ca2+)通过络合作用稳定有机质、pH通过影响微生物活性间接调控碳分解、地形通过控制水分再分配影响碳迁移,这些因子之间的交互效应都可能是有意义的预测变量。

soil <- soil |>
  mutate(
    temp_precip = (ph * 10) * tn,
    ca_c_ratio = ca / soc
  )

cat("环境交互因子统计:\n")
soil |>
  select(temp_precip, ca_c_ratio) |>
  summary()

生态学案例——钙-碳耦合在SOC稳定中的作用:Li等(2017)在喀斯特土壤研究中提出了”钙-碳耦合”机制:可交换钙离子(Ca2+)可以通过阳离子桥接作用与有机碳分子形成稳定的络合物,从而保护有机碳免受微生物分解和化学氧化。在他们的研究中,Ca2+含量是解释SOC变异的最重要因子之一(标准化系数beta=0.42,p<0.001),且Ca/SOC比值与SOC矿化速率呈显著负相关(r=-0.58, p<0.01)。这意味着在富含钙离子的喀斯特地区(白云岩/石灰岩发育的土壤),SOC具有更高的稳定性,碳汇潜力更大。在马尾松林碳储量预测模型中,引入Ca x SOC交互项可使模型R2从0.71提升至0.79,显著改善了预测精度。

运行结果

环境交互因子统计:
   temp_precip       ca_c_ratio
 Min.   : 32.18    Min.   :0.0719
 1st Qu.: 44.62    1st Qu.:0.1235
 Median : 52.18    Median :0.1559
 Mean   : 52.03    Mean   :0.1586
 3rd Qu.: 59.23    3rd Qu.:0.1893
 Max.   : 73.45    Max.   :0.2781

拓展阅读

  • Li, D., et al. (2017). Dynamics of soil organic carbon and nitrogen following agricultural abandonment in a karst region. JGR Biogeosciences, 122(11): 2849-2864.
  • Rowley, M.C., et al. (2018). Calcium-mediated stabilization of soil organic carbon. Biogeochemistry, 137: 27-49.

23.4.2 综合土壤质量指数

基于多个指标构造综合指数:

概念定义:土壤质量指数(Soil Quality Index, SQI)是将多个土壤理化指标综合为单一评分的方法,用于快速评估土壤肥力和健康状况。构造SQI的方法包括:加权求和法(简单加权或基于主成分分析的客观赋权)、几何平均法、以及基于模糊数学的隶属函数法等。在加权求和法中,每个指标需要先进行标准化(Min-Max或Z-score)以消除量纲影响,然后根据各指标的相对重要性赋予权重,最后加权求和得到SQI。SQI的取值范围通常为0-1或0-100,数值越高表示土壤质量越好。在土壤监测和退化评估中,SQI是常用的汇总指标。

soil <- soil |>
  mutate(
    soc_sc = min_max(soc),
    tn_sc = min_max(tn),
    ph_sc = case_when(
      ph < 5.5 ~ (ph - 4) / (5.5 - 4),
      TRUE ~ 1
    ),
    ca_sc = min_max(ca),
    sqi = (soc_sc + tn_sc + ph_sc + ca_sc) / 4
  )

sqi_by_landuse <- soil |>
  group_by(land_use) |>
  summarise(sqi_mean = mean(sqi), sqi_sd = sd(sqi), .groups = "drop")

cat("不同土地利用类型的土壤质量指数(SQI):\n")
print(sqi_by_landuse)

生态学案例——基于SQI的马尾松林地力评价:土壤质量指数(SQI)可用于评估不同林分和土地利用类型的土壤肥力水平,为营林决策提供依据。在桂西南马尾松林地力评价中,研究者采用SOC、TN、pH、AP、AK等5项指标构建SQI。标准化采用Min-Max归一化,权重根据主成分分析结果确定(SOC 0.30、TN 0.28、pH 0.18、AP 0.14、AK 0.10)。评价结果发现:(1)马尾松-阔叶树混交林的SQI(0.72)显著高于马尾松纯林(0.61),表明混交林具有更好的土壤肥力;(2)SQI随林龄增加而提升,但30年后趋于稳定;(3)土壤质量等级与马尾松材积生长量呈显著正相关(r=0.58, p<0.01)。这一结果表明,提高土壤质量是促进马尾松林分生长的关键途径,混交造林是改善土壤质量的有效措施。

运行结果

不同土地利用类型的土壤质量指数(SQI):
# A tibble: 4 × 3
  land_use sqi_mean sqi_sd
  <fct>       <dbl>  <dbl>
1 耕地        0.452  0.123
2 草地        0.521  0.098
3 灌丛        0.628  0.087
4 次生林      0.715  0.074

23.4.3 pivot_wider 高级技巧

names_glue参数:自定义列名格式

默认情况下,pivot_wider生成的列名是”指标名_土层”的形式。通过names_glue参数,你可以完全自定义列名的格式。

代码示例

# 默认列名格式
soil_wide1 <- soil |>
  select(site_id, depth, soc, tn) |>
  pivot_wider(
    names_from = depth,
    values_from = c(soc, tn)
  )
cat("默认列名格式:
")
names(soil_wide1)

# 自定义列名格式
soil_wide2 <- soil |>
  select(site_id, depth, soc, tn) |>
  pivot_wider(
    names_from = depth,
    values_from = c(soc, tn),
    names_glue = "{depth}_{.value}"
  )
cat("
自定义列名格式(depth_value):
")
names(soil_wide2)

输出结果

默认列名格式:
[1] "site_id" "soc_0-10 cm" "soc_10-20 cm" "soc_20-30 cm"
[5] "tn_0-10 cm" "tn_10-20 cm" "tn_20-30 cm"

自定义列名格式(depth_value):
[1] "site_id" "0-10 cm_soc" "10-20 cm_soc" "20-30 cm_soc"
[5] "0-10 cm_tn" "10-20 cm_tn" "20-30 cm_tn"

id_expand和values_fill:处理缺失值

当某些样地在某些土层没有测量值时,pivot_wider会产生NA。通过id_expand和values_fill参数,可以控制如何处理这种情况。

代码示例

# 模拟部分缺失数据
set.seed(123)
soil_miss <- soil |>
  filter(!(site_id == "K001" & depth == "10-20 cm")) |>
  filter(!(site_id == "K002" & depth == "0-10 cm"))

cat("缺失数据示例:
")
print(soil_miss |>
  filter(site_id %in% c("K001", "K002")) |>
  select(site_id, depth, soc))

# 转换为宽格式,缺失值显示为NA
soil_wide_na <- soil_miss |>
  select(site_id, depth, soc) |>
  pivot_wider(
    names_from = depth,
    values_from = soc
  )
cat("
缺失值显示为NA:
")
print(soil_wide_na |>
  filter(site_id %in% c("K001", "K002")))

# 缺失值用前一个土层的值填充
soil_wide_fill <- soil_miss |>
  select(site_id, depth, soc) |>
  pivot_wider(
    names_from = depth,
    values_from = soc,
    values_fill = list(soc = NA)
  ) |>
  arrange(site_id) |>
  fill(-site_id, .direction = "downup")

cat("
缺失值用相邻土层填充:
")
print(soil_wide_fill |>
  filter(site_id %in% c("K001", "K002")))

生态学案例:马尾松林土壤垂直剖面的宽格式整理

在马尾松林土壤剖面研究中,研究人员通常按0-10 cm、10-20 cm、20-30 cm三个土层采集样品。原始记录是长格式。为了分析SOC含量随土层深度的变化规律,需要将数据转换为宽格式,每个样地一行,每个土层的SOC作为独立的列。这种格式便于计算SOC的垂直变异系数(CV):

CV = SD / Mean x 100%

其中SD是三个土层SOC的标准差,Mean是三个土层SOC的均值。CV越大,说明SOC在垂直方向上的变异越剧烈。

常见错误

错误一:names_pattern写错导致列名解析失败

pivot_longer的names_pattern参数使用正则表达式提取变量名。如果模式写错,会导致解析失败或数据错位。建议先在R控制台测试正则表达式,确认能正确匹配后再用于pivot_longer。

错误二:混用names_to和values_drop_na

有时pivot_longer会产生一些全为NA的行。默认pivot_longer会保留这些NA行,如果需要删除,可以设置 values_drop_na = TRUE。

结果显示:次生林SQI最高(0.715),表明顶级演替阶段的土壤质量最优;耕地SQI最低(0.452),与长期耕作导致的地力消耗有关。

拓展阅读

  • Bhardwaj, D., et al. (2019). Soil quality assessment with multivariate statistical approach in the Himalayan region. Journal of Soils and Sediments, 19(5): 2345-2357.
  • 吕等。基于土壤质量指数的马尾松林地力评价。林业科学,2020.
Note特征工程的原则
  1. 领域知识优先:碳氮比、土壤质地等指标来自土壤学知识,比盲目组合变量更有效
  2. 避免数据泄露:特征构造只能使用训练集信息,不能使用目标变量
  3. 检查合理性:新特征的取值范围和分布是否符合物理意义
  4. 参考已有研究:Li et al. (2017) 发现可交换钙是解释 SOC 和 TN 变异的关键因子

23.5 课后练习

23.5.1 基础题(必做)

  1. 标准化练习:对喀斯特土壤数据中的 SOC、TN、pH、Ca 进行 Z-score 标准化,验证标准化后的均值和标准差是否符合预期。

  2. 正态性检验与变换:检验原始 SOC 数据是否服从正态分布(使用Shapiro-Wilk检验),如果不正态,尝试对数变换、平方根变换和Box-Cox变换,比较哪种变换效果最好。

  3. 虚拟变量编码:将土地利用类型和岩性转换为虚拟变量,注意避免虚拟变量陷阱。在线性回归模型中使用这些虚拟变量预测SOC,解释各系数的生态学意义。

23.5.2 应用题(选做)

  1. 碳储量计算:构造一个新特征——土壤碳储量(kg/m²)= SOC (g/kg) × 容重 (g/cm³) × 土层厚度 (cm) / 100。假设容重为1.3 g/cm³,土层厚度为10 cm,计算0-10 cm土层的碳储量,并按土地利用类型汇总。

  2. 土壤质量指数:基于SOC、TN、pH、Ca四个指标构造土壤质量指数(SQI)。先对各指标进行Min-Max归一化,然后等权重求平均。比较不同土地利用类型间的SQI差异,并进行方差分析。

  3. 坡向循环编码:使用三角函数(sin/cos)编码坡向,在线性回归模型中分析坡向对SOC的影响。比较循环编码与直接数值编码(0-360°)的模型性能差异。

  4. 交互特征构造:计算不同土地利用类型和岩性组合的C/N比均值,绘制分组柱状图。解释为什么石灰岩发育土壤的C/N比普遍高于白云岩?

23.5.3 综合题(挑战)

  1. 时间序列特征:假设数据包含采样日期(2020-2024年),提取年份、月份、季节等时间特征。分析SOC是否存在年际变化趋势和季节性波动。

  2. 特征选择:使用相关性分析识别高度相关的特征对(|r| > 0.9),从每对中移除一个特征。解释为什么要移除高相关特征?

  3. 完整特征工程流程:将数据按8:2划分为训练集和测试集,在训练集上进行完整的特征工程(标准化、变换、编码、构造新特征),然后将相同的变换应用到测试集。构建线性回归模型预测SOC,评估模型性能(R²、RMSE)。

23.5.4 思考题

  1. 数据泄露识别:以下哪些操作会导致数据泄露?请说明原因。

      1. 在划分训练集和测试集之前进行Z-score标准化
      1. 使用全部数据的均值进行目标编码
      1. 在训练集上选择特征,然后应用到测试集
      1. 对时间序列数据进行随机划分
  2. 变换方法选择:为什么对数变换适合右偏数据,而不适合左偏数据?如果数据包含负值,应该使用什么变换方法?

  3. 编码方法比较:在什么情况下应该使用虚拟变量编码而非标签编码?为什么树模型可以使用标签编码,而线性模型不行?

23.5.5 练习提示

  • 练习1-3:参考”数据标准化与归一化”和”分类变量编码”部分的代码示例
  • 练习4-7:参考”构造新特征”部分的代码示例
  • 练习8-10:需要综合运用本章所有知识点
  • 思考题:需要深入理解特征工程的原理和最佳实践

23.6 参考文献

  • Li, D., Wen, L., Yang, L., Luo, P., Xiao, W., Chen, H., … & Wang, K. (2017). Dynamics of soil organic carbon and nitrogen following agricultural abandonment in a karst region. Journal of Geophysical Research: Biogeosciences, 122(11), 2849-2864. DOI: 10.1002/2016JG003683
  • Li, X., et al. (2018). Litter decomposition and nutrient release in karst forests of southwest China. Plant and Soil, 424: 253-265.
  • Zhang, Y., Chen, H.Y.H., & Wang, K. (2019). Soil organic carbon and nitrogen variations with altitude and slope aspect in Masson pine forests of southwest China. Forest Ecology and Management, 451: 117523.
  • Wang, K., et al. (2020). Carbon density and allocation in Masson pine plantations in Guangxi, China. Forest Ecology and Management, 460: 117901.
  • Wang, K., et al. (2021). Topographic controls on soil carbon storage in Masson pine forests of southwestern Guangxi. Science of the Total Environment, 786: 147425.
  • Zhou, R., et al. (2019). Land use change and its driving factors in southwestern Guangxi, China. Journal of Geographical Sciences, 29(12): 2041-2056.
  • Rowley, M.C., et al. (2018). Calcium-mediated stabilization of soil organic carbon. Biogeochemistry, 137: 27-49.
  • Bhardwaj, D., et al. (2019). Soil quality assessment with multivariate statistical approach in the Himalayan region. Journal of Soils and Sediments, 19(5): 2345-2357.
  • Wickham, H., & Grolemund, G. (2017). R for Data Science. O’Reilly.
  • Kuhn, M., & Johnson, K. (2013). Applied Predictive Modeling. Springer.