首页 > 解决方案 > 计算R中时间序列数据中每个点的趋势

问题描述

我有一个从1979年到2020年玉米产量的年度时间序列数据。样本数据是这样的

year production

1979  1061
1980  1900
1981  1701
1982  1180
.
.
.
2020  1245

现在我需要计算每年的趋势值来分离生产的趋势成分。我怎样才能在 R 中做到这一点?我们可以使用线性回归模型来做吗,因为文献中说玉米产量可以分为趋势产量、气候产量和随机误差,如下所示:

Y=Yt+Yc+ε

其中 Y 是玉米产量 Yt 是趋势产量,Yc 是气候产量,ε 是受其他随机因素影响的产量分量,可以忽略不计。

我需要将气候产量与总产量分开。

预先感谢您的帮助 :)

标签: rtime-seriesregressiontrend

解决方案


1)线性回归假设

  1. 输入数据框dd在最后的注释中可重现地显示(这 4 个点还不够,但我们使用我们拥有的)
  2. 如问题中所述使用线性回归
  3. 问题中的 y、yc、yt 和 e 分别是产量(产量)、平均产量、趋势效应和年产量线性回归的残差

我们使用 运行回归lm,然后使用 进行分解proj。不使用任何包。

fm <- lm(production ~ year, dd)
p <- proj(fm)

# check that components sum to yield
all.equal(dd$production, rowSums(p), check.attributes = FALSE)
## [1] TRUE

tt <- ts(cbind(dd$production, p), start = dd$year[1])
colnames(tt) <- c("y", "yc", "yt", "e")
tt
## Time Series:
## Start = 1979 
## End = 1982 
## Frequency = 1 
##         y     yc    yt      e
## 1979 1061 1460.5 -23.7 -375.8
## 1980 1900 1460.5  -7.9  447.4
## 1981 1701 1460.5   7.9  232.6
## 1982 1180 1460.5  23.7 -304.2

# plot
plot(tt, main = "yield and components")

(图片后续)

截屏

2) HP 过滤器另一种方法是将 yc 定义为上述平均产量,但使用 Hodrick 和 Prescott 过滤器输出来定义趋势。

(还有其他可能性,例如对线性回归的残差运行 HP 过滤器,然后将 HP 趋势定义为 yc,给出四个分量:均值、yt、yc 和 e,或者可能将均值与其他分量之一结合起来;然而,在没有具体定义实际想要什么的情况下,我们不会追求许多可能性。)

library(mFilter)

y <- with(dd, ts(production, start = year[1]))
yc <- mean(y)
yt <- hpfilter(y - yc)$trend
e <- y - yc - yt

tt2 <- cbind(y, yc, yt, e); tt2
## Time Series:
## Start = 1979 
## End = 1982 
## Frequency = 1 
##         y     yc         yt         e
## 1979 1061 1460.5 -50.440731 -349.0593
## 1980 1900 1460.5  20.014502  419.4855
## 1981 1701 1460.5  32.293190  208.2068
## 1982 1180 1460.5  -1.866961 -278.6330

plot(tt2, main = "yield and HP components")

截屏

笔记

dd <- structure(list(year = 1979:1982, production = c(1061L, 1900L, 
1701L, 1180L)), class = "data.frame", row.names = c(NA, -4L))

更新

进行了一些改进并添加了第二种方法。


推荐阅读