【问题标题】:Calculate trend at each points in time series data in R计算R中时间序列数据中每个点的趋势
【发布时间】:2023-03-03 10:31:01
【问题描述】:

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

year production

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

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

Y=Yt+Yc+ε

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

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

提前感谢您的帮助:)

【问题讨论】:

    标签: r time-series regression trend


    【解决方案1】:

    你只有一个自变量:年份 所以你能做的最好的就是Y=Yt+ε
    这可以通过lm(production ~ year, data = data) 完成

    【讨论】:

    • 这对我不起作用。我必须分离气候产量,文献说总产量可以分为趋势产量、气候产量和随机误差,可以使用线性回归方法来分离气候产量。这里是详细参考doi.org/10.1007/s00704-018-2397-5
    【解决方案2】:

    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))
    

    更新

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

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2019-01-08
      • 2014-09-04
      • 1970-01-01
      • 2021-07-15
      • 2011-09-26
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      相关资源
      最近更新 更多