R语言时间序列处理:如何对给定表格绘图并去除季节性?
处理步骤
针对你的表格数据,按以下步骤完成绘图和季节性去除操作:
1. 数据整理为时间序列格式
先把表格数据导入R并转换成标准的时间序列结构:
# 创建原始数据框 df <- data.frame( Season = c("Χειμώνας", "Άνοιξη", "Καλοκαίρι", "Φθινόπωρο"), "2016" = c(1, 3, 6, 4), "2017" = c(2, 2, 7, 5), "2018" = c(2, 4, 8, 5), "2019" = c(1, 3, 8, 6) ) # 转成长格式(方便后续绘图和处理) library(tidyr) df_long <- pivot_longer(df, cols = -Season, names_to = "Year", values_to = "Value") # 生成对应日期(默认冬季为每年第1季度) df_long$Quarter <- match(df_long$Season, c("Χειμώνας", "Άνοιξη", "Καλοκαίρι", "Φθινόπωρο")) df_long$Date <- as.Date(paste(df_long$Year, df_long$Quarter, "01", sep = "-"), format = "%Y-%m-%d") # 转换成ts时间序列对象(适配R的时间序列工具) ts_data <- ts(df_long$Value, start = c(2016, 1), frequency = 4)
2. 绘制原始时间序列图
用ggplot2做可视化(新手友好,图形更直观):
library(ggplot2) ggplot(df_long, aes(x = Date, y = Value, color = Season)) + geom_line(size = 1) + geom_point() + labs(title = "原始季度时间序列", x = "日期", y = "数值") + theme_minimal()
如果用基础绘图也可以快速生成:
plot(ts_data, main = "原始季度时间序列", xlab = "年份", ylab = "数值")
3. 去除季节性的几种实用方法
方法一:时间序列分解
用R自带的decompose()函数把序列拆分为趋势、季节性、随机成分,分加法和乘法两种模型:
# 乘法分解(你的数据中夏季数值大、波动也大,更适合这种模型) decomp_mult <- decompose(ts_data, type = "multiplicative") plot(decomp_mult) # 查看拆分后的各成分 ts_deseason_mult <- decomp_mult$trend * decomp_mult$random # 提取去季节性后的序列 # 加法分解(适合季节性波动不随数值变化的场景) decomp_add <- decompose(ts_data, type = "additive") plot(decomp_add) ts_deseason_add <- decomp_add$trend + decomp_add$random # 绘图查看去季节性后的结果 plot(ts_deseason_mult, main = "乘法模型去季节性后序列", xlab = "年份", ylab = "数值")
方法二:季节性差分
针对季度数据,直接做4阶差分(取当前值与前一年同季度值的差值),快速去除季节性:
ts_diff <- diff(ts_data, differences = 4) plot(ts_diff, main = "4阶差分去季节性后序列", xlab = "年份", ylab = "数值")
方法三:STL分解(更鲁棒)
stl()函数对异常值的处理更友好,仅支持加法模型,但灵活性更高:
stl_result <- stl(ts_data, s.window = "periodic") plot(stl_result) ts_deseason_stl <- stl_result$time.series[, "trend"] + stl_result$time.series[, "remainder"] plot(ts_deseason_stl, main = "STL分解去季节性后序列", xlab = "年份", ylab = "数值")
内容的提问来源于stack exchange,提问作者user19384320
相关产品推荐
相关产品推荐

