r - 计算R中时间序列数据中每个点的趋势
问题描述
我有一个从1979年到2020年玉米产量的年度时间序列数据。样本数据是这样的
year production
1979 1061
1980 1900
1981 1701
1982 1180
.
.
.
2020 1245
现在我需要计算每年的趋势值来分离生产的趋势成分。我怎样才能在 R 中做到这一点?我们可以使用线性回归模型来做吗,因为文献中说玉米产量可以分为趋势产量、气候产量和随机误差,如下所示:
Y=Yt+Yc+ε
其中 Y 是玉米产量 Yt 是趋势产量,Yc 是气候产量,ε 是受其他随机因素影响的产量分量,可以忽略不计。
我需要将气候产量与总产量分开。
预先感谢您的帮助 :)
解决方案
1)线性回归假设
- 输入数据框
dd
在最后的注释中可重现地显示(这 4 个点还不够,但我们使用我们拥有的) - 如问题中所述使用线性回归
- 问题中的 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))
更新
进行了一些改进并添加了第二种方法。
推荐阅读
- apache - 在 Alpine 上运行 Apache 后的 SSH docker 容器问题
- r - 使用 switch 函数代替嵌套的 if 函数
- flutter - 无法使用静态访问访问 Flutter 实例成员“{0}”
- java - 我在 Selenium 中的程序没有停止执行是什么?
- bash - 这里是与VI交互的文档
- c - 如何在C中用零初始化数组[int] [int]?
- android-studio - Android studio >> 按钮无法正常工作
- javascript - Azure 地图示例
- python - 当差异很小时,Python Datetime Time Difference 以分钟为单位给出 -999999999
- django - 自 Django 更新以来,模板渲染抛出“'int' object has no attribute 'encode'”