我一直在R中丢失我的时间指数 - 我该怎么办呢?

Mat*_*ert 3 indexing r time-series

或者换一种说法:我如何保持我的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)
}
Run Code Online (Sandbox Code Playgroud)

但是,我觉得这种笨拙和累赘.是否有一种更优雅的方式(也许我应该上课......)?

Jor*_*eys 8

对于时间序列,子集和相当一些其他函数会导致转换为矩阵或向量.您不必重建时间序列,只需将原始属性传输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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

  return(x)
}
Run Code Online (Sandbox Code Playgroud)

  • 1+因为属性不够用. (3认同)

Ric*_*ron 5

使用包中的coredata函数,zoo您可以访问一个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)
}
Run Code Online (Sandbox Code Playgroud)

并运行

foo <- ts(rnorm(10), frequency = 4, start = c(1959, 2))
bar <- hpfilter(foo)
Run Code Online (Sandbox Code Playgroud)

产量

> 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           
Run Code Online (Sandbox Code Playgroud)