R语言时间序列分析:从读取数据到预测气温

上周翻出老家气象站2015–2023年的月均温ref="/tag/426/" style="color:#B2A89E;font-weight:bold;">数据,想看看夏天是不是真的一年比一年热。没打开Excel,直接开了RStudio——几行代码跑完,趋势线、季节图、ARIMA预测全出来了。R做时间序列分析,真没那么玄乎。

先让数据“认得清自己”

R不认得“时间”,得手动告诉它哪列是时间、频率是多少。比如读入一个CSV,第一列是日期(格式为2015-01),第二列是气温:

library(readr)
library(zoo)
data <- read_csv("temp_monthly.csv")
# 转成zoo对象,按月频次设定
ts_data <- zoo(data$temperature, order.by = as.yearmon(data$date))

as.yearmon()as.Date()更适配月度数据,不会卡在2月29日这种边界问题上。要是你手头是日度销售数据,换成as.Date()frequency=365就行。

一眼看出规律:画图比看数字管用

别急着建模,先画出来。用plot()看看原始序列,再加个decompose()拆解趋势、季节和残差:

plot(ts_data, main = "月均气温变化(2015–2023)", ylab = "℃")
decomp <- decompose(ts_data)
plot(decomp)

我那组数据的季节图里,每年7月都稳稳顶在最高点,而1月几乎固定在最低位——这说明季节性极强;趋势图则缓缓上扬,近九年平均升温约0.8℃,肉眼可辨。

预测下个月?试试ARIMA

想预估下个月气温?forecast包里的auto.arima()能自动选参数:

library(forecast)
fit <- auto.arima(ts_data)
fc <- forecast(fit, h = 1)  # 预测1步
print(fc)

输出里会带点估计值和80%、95%置信区间。我试了2023年12月的数据,模型给出预测2.3℃±0.4℃,实际是2.6℃,误差在合理范围。如果换成零售店的日销量,这个方法也能快速响应促销或节假日带来的波动。

小技巧:遇到缺失值别删,用na.interp填

实测数据常有断档,比如某个月仪器坏了没记录。别急着删整行——na.interp()能基于前后值线性插补:

ts_clean <- na.interp(ts_data)

它比简单用均值填充更靠谱,尤其对温度、股价这类连续变化的序列。

不是所有序列都要复杂模型

上周帮朋友处理奶茶店周销量,前两年波动大,但最近半年明显走平。我直接用了ets()(指数平滑),比ARIMA快,预测结果反而更稳。R里没有“必须用哪个模型”的规矩,谁跑出来残差白噪声检验通过、预测误差小,就用谁。