Skip to content

R - 时间序列分析

时间序列是按时间顺序索引的数据点序列。常见的例子包括每日股票价格、月度销售数据或每小时温度读数。R 语言在时间序列分析方面非常强大,提供经典和现代两种框架。

我们将从 R 语言的基础 ts 对象开始。然后,我们将介绍现代的 tsibble 框架,它与 tidyverse 无缝集成,可实现更灵活、更稳健的分析。

ts() 函数创建一个时间序列对象,它是一个带有时间附加属性的向量或矩阵。

ts(data, start = 1, end = numeric(), frequency = 1, ...)
  • data:观测值的向量或矩阵。
  • start:第一个观测值的时间。可以是一个数字,也可以是一个向量,例如 c(year, period)(如 c(2020, 1) 表示 2020 年 1 月)。
  • frequency:每单位时间内的观测数量。这是一个关键参数:1 表示年度,4 表示季度,12 表示月度,52 表示周度。

让我们为从 2022 年 1 月开始的月度降雨量数据创建一个时间序列对象,并将其可视化。

# 加载用于绘图的现代库
library(ggplot2)
# 月度降雨量样本数据
rainfall_data <- c(799, 1174, 865, 1334, 635, 918, 685, 998, 784, 985, 882, 1071)
# 为从 2022 年 1 月开始的月度数据创建时间序列对象
rainfall_ts <- ts(rainfall_data, start = c(2022, 1), frequency = 12)
# 打印对象以查看其结构
print(rainfall_ts)
# 可视化时间序列
# ggplot2 中的 autoplot() 函数很智能,与 ts 对象配合良好
autoplot(rainfall_ts) +
labs(
title = "Monthly Rainfall (2022)",
x = "Time",
y = "Rainfall (mm)"
) +
theme_minimal()

当您打印 rainfall_ts 时,您会得到一个格式整齐的输出,显示按月份和年份对齐的数据:

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2022 799 1175 865 1335 635 918 685 999 784 985 883 1071

autoplot() 命令生成简洁的折线图,这是可视化时间序列的标准方式。

对于复杂分析,tsibble 包为时间序列提供了一种现代的、整洁的数据结构。tsibble 是一种特殊的数据框(tibble),它需要一个索引(时间变量)和可选的键(定义唯一时间序列的变量)。

# 您可能需要先安装这些包
# install.packages("tsibble")
# install.packages("dplyr")
library(tsibble)
library(dplyr)
# 为不同城市创建两个序列
rainfall_city_A <- c(799, 1174, 865, 1334, 635, 918, 685, 998, 784, 985, 882, 1071)
rainfall_city_B <- c(655, 1306, 1323, 1172, 562, 824, 822, 1265, 799, 1105, 1106, 1337)
# 创建一个数据框 (tibble)
rainfall_df <- tibble(
Month = yearmonth(seq(from = as.Date("2022-01-01"), by = "month", length.out = 12)),
City_A = rainfall_city_A,
City_B = rainfall_city_B
)
# 转换为长格式,这是一种“整洁”的方式
rainfall_long <- rainfall_df %>%
pivot_longer(cols = c(City_A, City_B), names_to = "City", values_to = "Rainfall")
# 转换为 tsibble,指定时间索引和键
rainfall_tsibble <- as_tsibble(rainfall_long, index = Month, key = City)
print(rainfall_tsibble)

tsibble 对象清晰地显示了其结构:

# A tsibble: 24 x 3 [1M]
# Key: City [2]
Month City Rainfall
<mth> <chr> <dbl>
1 2022 Jan City_A 799
2 2022 Feb City_A 1175
3 2022 Mar City_A 865
# ... with 21 more rows

使用 ggplot2 可视化 tsibble 是自然而强大的。您可以轻松地通过刻面或根据键变量进行着色。

# 绘制 tsibble 时会自动按键进行分组
ggplot(rainfall_tsibble, aes(x = Month, y = Rainfall, color = City)) +
geom_line() +
labs(
title = "Monthly Rainfall Comparison",
subtitle = "Data for City A vs. City B",
x = "Time",
y = "Rainfall (mm)"
) +
theme_minimal()
  • 分解:使用 decompose()(R 基础包)或 feasts 包中更高级的 STL() 等函数,将时间序列分解为趋势、季节性和随机分量。
  • 预测:预测未来值。fable 包为 ETS(误差、趋势、季节性)和 ARIMA(自回归积分移动平均)等流行模型提供了一个现代的整洁接口。
  • 最佳实践:始终先可视化您的数据。检查缺失值和异常值。理解数据的潜在频率以选择正确的模型。
  • 资源:在线书籍 Forecasting: Principles and Practice (3rd ed) 是使用 tsibble 生态系统在 R 中进行现代时间序列分析的权威资源。