R - 时间序列分析
R 语言中的现代时间序列分析
Section titled “R 语言中的现代时间序列分析”时间序列是按时间顺序索引的数据点序列。常见的例子包括每日股票价格、月度销售数据或每小时温度读数。R 语言在时间序列分析方面非常强大,提供经典和现代两种框架。
我们将从 R 语言的基础 ts 对象开始。然后,我们将介绍现代的 tsibble 框架,它与 tidyverse 无缝集成,可实现更灵活、更稳健的分析。
经典方法:ts() 对象
Section titled “经典方法:ts() 对象”ts() 函数创建一个时间序列对象,它是一个带有时间附加属性的向量或矩阵。
ts(data, start = 1, end = numeric(), frequency = 1, ...)data:观测值的向量或矩阵。start:第一个观测值的时间。可以是一个数字,也可以是一个向量,例如c(year, period)(如c(2020, 1)表示 2020 年 1 月)。frequency:每单位时间内的观测数量。这是一个关键参数:1表示年度,4表示季度,12表示月度,52表示周度。
示例:月度降雨量数据
Section titled “示例:月度降雨量数据”让我们为从 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 Dec2022 799 1175 865 1335 635 918 685 999 784 985 883 1071autoplot() 命令生成简洁的折线图,这是可视化时间序列的标准方式。
现代方法:tsibble
Section titled “现代方法:tsibble”对于复杂分析,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可视化多个时间序列
Section titled “可视化多个时间序列”使用 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()后续步骤:分析与预测
Section titled “后续步骤:分析与预测”- 分解:使用
decompose()(R 基础包)或feasts包中更高级的STL()等函数,将时间序列分解为趋势、季节性和随机分量。 - 预测:预测未来值。
fable包为 ETS(误差、趋势、季节性)和 ARIMA(自回归积分移动平均)等流行模型提供了一个现代的整洁接口。 - 最佳实践:始终先可视化您的数据。检查缺失值和异常值。理解数据的潜在频率以选择正确的模型。
- 资源:在线书籍 Forecasting: Principles and Practice (3rd ed) 是使用
tsibble生态系统在 R 中进行现代时间序列分析的权威资源。