或换句话说:我如何保持我的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)
}
但是,我觉得这种笨拙和累赘。是否有一种更优雅的方式(也许我应该上课......)?
答案 0 :(得分: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)
}
您也可以使用子集来更改(但不追加)时间序列中的值:
hpfilter <- function(x,lambda=1600){
eye <- diag(length(x))
x[] <-
solve(eye+lambda*crossprod(diff(eye,lag=1,d=2)),x)
return(x)
}
答案 1 :(得分:5)
使用coredata
包中的zoo
函数,您可以访问ts
或zoo
对象的数据部分。我会把你的代码改为
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