【问题标题】:I lose my time index in R all the time – what can I do about it?我在 R 中一直丢失我的时间索引 - 我该怎么办?
【发布时间】:2011-04-15 09:18:36
【问题描述】:

或者换一种说法:我怎样才能保持我的 ts 索引? 大多数时候,我在计算中使用时间序列,它不再是 ts 对象。编写函数返回一个ts对象并保留索引信息时应该遵循什么策略?

例如:

#standard Hodrick Prescott Filter
hpfilter <- function(x,lambda=1600){
eye <- diag(length(x))
result <- solve(eye+lambda*crossprod(diff(eye,lag=1,d=2)),x)

### this is what I am talking about :) 
### intuitively i´d maybe add something like this 
result <- ts(result,start=start(x),end=end(x),frequency=frequency(x))
###

return(result)
}

但是,我觉得这个笨拙和繁琐。有没有更优雅的方法(也许我应该上课..)?

【问题讨论】:

    标签: r indexing time-series


    【解决方案1】:

    对于时间序列,子集和相当多的其他函数会导致转换为矩阵或向量。不必重新构建时间序列,只需将原始ts 的属性转移到结果中即可。

    hpfilter <- function(x,lambda=1600){
      eye <- diag(length(x))
      result <-
          solve(eye+lambda*crossprod(diff(eye,lag=1,d=2)),x)
    
      attributes(result) <- attributes(x)
      return(result)
    }
    

    您也可以使用子集来更改(但不能附加)时间序列中的值:

    hpfilter <- function(x,lambda=1600){
      eye <- diag(length(x))
      x[] <-
        solve(eye+lambda*crossprod(diff(eye,lag=1,d=2)),x)
    
      return(x)
    }
    

    【讨论】:

    • 1+ 因为属性没有得到足够的使用。
    【解决方案2】:

    使用zoo 包中的coredata 函数,您可以访问tszoo 对象的数据部分。我会把你的代码改成

    library(zoo)
    
    #standard Hodrick Prescott Filter
    hpfilter <- function(x,lambda=1600){
        eye <- diag(length(x))
        coredata(x) <- solve(eye + lambda * crossprod(diff(eye, lag=1, d=2)), coredata(x))
    
        return(x)
    }
    

    然后运行

    foo <- ts(rnorm(10), frequency = 4, start = c(1959, 2))
    bar <- hpfilter(foo)
    

    产生

    > foo
               Qtr1       Qtr2       Qtr3       Qtr4
    1959             0.8939882 -1.8442215 -0.8959187
    1960 -0.2658590  0.5855087 -0.7167737 -1.9318533
    1961  0.3489802 -0.6300171 -0.6523006           
    > bar
               Qtr1       Qtr2       Qtr3       Qtr4
    1959            -0.3589312 -0.3939791 -0.4282439
    1960 -0.4618490 -0.4952099 -0.5286198 -0.5616964
    1961 -0.5941750 -0.6266472 -0.6591151           
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2021-10-01
      相关资源
      最近更新 更多