最近在论文大修2024年投稿的一篇文章,大修了2轮,最后一次还是重新投稿,其中有一个问题一直被审稿人怼,他认为我计算时间序列的趋势的时候,没有考虑时间的相关性,即对噪声模型的估计不合理,会影响对趋势和其不确定度的估计。我之前从来没意识到这个问题:
要用最小二乘法(Least Squares)估计一个时间序列的趋势及其不确定度,你可以将时间序列拟合为一个线性模型:
(1)最小二乘估计(OLS)
假设有 nn个数据点 (ti,yi)(ti,yi),可以构造设计矩阵:
(2)估计不确定度(标准误)
python 代码:
import numpy as np
import matplotlib.pyplot as plt# 模拟数据
t = np.arange(0, 10, 1) # 年份
y = 2.0 + 0.3 * t + np.random.normal(0, 0.2, len(t)) # 加上噪声# 构造设计矩阵
X = np.vstack([np.ones(len(t)), t]).T# 最小二乘解
beta_hat = np.linalg.inv(X.T @ X) @ X.T @ y
a, b = beta_hat# 残差与方差
residuals = y - X @ beta_hat
sigma2 = np.sum(residuals**2) / (len(t) - 2)
cov_beta = sigma2 * np.linalg.inv(X.T @ X)
b_std = np.sqrt(cov_beta[1, 1])print(f"趋势估计:{b:.4f} ± {b_std:.4f} (单位/年)")
但是实际上上述是假设残差是符合正态分布,而实际上很多地球物理的观测结果是存在有色噪声影响的。因此用上述的程序计算的结果是否合理需要评估。
在我这次的论文大修中,审稿人给我推荐了两个有用的处理工具:
HECTOR 或 estnoise 这两款工具 —— 它们都易于使用,且免费提供,可以在回归参数估计的同时估算随机特性。需要注意的是,HECTOR 还支持估计时变的季节信号,这在某些研究中可能具有参考价值。但如果作者坚持使用缩放方法,那就必须以稳健的方式来执行。
-
Hector - TeroMovigo
-
https://www.usgs.gov/node/279390
在这里我推荐使用Hector,因为这个可以估算时变的季节性信号。而我们的时间许多很多是有季节性变化的。
(3)Hector介绍
Hector 是一款开源的学术软件包,专为在时间序列数据中估计轨迹模型(如含年度信号的线性趋势)而设计,尤其适用于存在时间相关噪声的情况。在地球物理研究中,轨迹估计至关重要,因为我们关注的现象往往包括气温上升、由气候变化引起的海平面上升、以及由地壳垂向运动或构造板块运动引起的位置变化等。在这类时间序列中,噪声通常具有时间相关性,这会显著影响线性趋势估计的精度,因此推荐使用像 Hector 这样的程序工具。Hector 假设用户预先了解其观测数据中可能存在的时间相关噪声类型,并通过最大似然估计(MLE)方法同时估计线性趋势和所选噪声模型的参数。Hector 由 TeroMovigo 团队开发和维护,旨在为学术界持续提供支持。有关其底层方法的详细介绍,可参考著作 《Geodetic Time Series Analysis in Earth Sciences》。此外,还有一些其他知名程序可用于类似任务,如 CATS 和 est_noise。已有研究对 Hector 和 est_noise 进行了广泛比较,结果表明两者在输出结果上高度一致。如果你在学术出版物中使用 Hector,请引用以下文献以致谢:Bos, M.S., Fernandes, R.M.S., Williams, S.D.P., and Bastos, L. (2013).
Fast Error Analysis of Continuous GNSS Observations with Missing Data. Journal of Geodesy, 87(4), 351–360.doi: 10.1007/s00190-012-0605-0
这个软件在Linux系统是可以直接运行下载的程序包,而本人使用的mac系统只能自己编译源代码
Hector 软件包主要设计用于在类 Unix 操作系统(如 Linux 或 macOS)上运行。如果你不想使用预编译的静态可执行文件,也可以自行编译源代码。在这种情况下,需要同时安装 Boost、FFTW3 和 OpenBLAS 等库。对于 Mac 用户,可以使用 **Xcode(clang 编译器)**和 Homebrew 来编译源代码。如需下载最新版本(2.1)的静态可执行文件(适用于多种 Linux 发行版)、源代码与示例数据、Python 3 脚本或使用手册,请点击以下链接:
• hector_2.0_OL8.tar.bz2 (Oracle Linux 8)
• hector_2.0_SL7.tar.bz2 (Scientific Linux 7)
• hector_2.0_Ubuntu18.04.tar.bz2 (Ubuntu 18.04 LTS)
• hector_2.0_Ubuntu20.04.tar.bz2 (Ubuntu 20.04 LTS)
• hector_2.0_Ubuntu21.04.tar.bz2 (Ubuntu 21.04)
• hector_2.1_Ubuntu20.04.tar.bz2 (Ubuntu 20.04 LTS)
• hector_2.1_Ubuntu21.04.tar.bz2 (Ubuntu 21.04)
• hector_2.1_Ubuntu22.04.tar.bz2 (Ubuntu 22.04 LTS)
• hector-2.1_CentOS7.tar.bz2 (CentOS7)
• hector-2.1_CentOS9.tar.bz2 (CentOS9)
• source code hector-2.0
• source code hector-2.1
• Python3 scripts hector-2.0
• Python3 scripts hector-2.1
• examples
• manual hector-2.0
• manual hector-2.1
(4)Hector使用
如果在Linux中,可以直接运行程序
而在mac系统中,则需要先安装一个Docker,配置一个linux环境
1️⃣ 安装 Docker Desktop
前往官网下载安装:
🔗 https://www.docker.com/products/docker-desktop/
安装后打开 Docker,确保状态栏图标为绿色,表示运行正常。
2️⃣ 创建一个 Linux 容器(如 Ubuntu)
docker pull ubuntu:22.04
然后启动一个交互式容器:
docker run -it --name hector_env ubuntu:22.04
第一次运行会进入 Linux shell,类似 Ubuntu 终端环境。
执行数据处理命令:
./estimatetrend estimatetrend.ctl
可以得到以下的结果:
后续还可以估计时间序列的频谱信号特征,以及建模的信号特征:
./estimatespectrum estimatespectrum.ctl
./modelspectrum modelspectrum.ctl
更具体的处理流程需要参见说明手册。
❤️欢迎点赞收藏❤️