修改通常的hpfilter函数来忽略na的

时间:2011-10-29 09:51:55

标签: r xts

我是一个新的R用户,试图快速学习,但我自己无法解决这个问题。我主要使用经济时间序列 - 因此,尝试以xts多列格式维护我的数据集,例如:

> head(USDATAq)
         tq   ngdp    rgdp  profit
1947 Q1   0  237.2  1770.7    20.7
1947 Q2   1  240.4  1768.0    23.9
1947 Q3   2  244.5  1766.5    23.8
1947 Q4   3  254.3  1793.3    25.5
1948 Q1   4  260.3  1821.8    29.4
1948 Q2   5  267.3  1855.3    31.2

我应用hpfilter功能进行过滤。在此网站上Elsewhere,我发现此实现使用coredata函数将hpfilter应用于xts对象:

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

我的问题是:

如何修改该函数,使其适用于具有NA观测值的变量(目前,如果有任何NA,它会计算整个日期范围的NA)?

我可以将数据集作为na.omit(USDATAq)传递,但这会将数据集中的所有变量缩减到最小观察值。但是,在不同日期之前可以使用不同的变量,其次是NA。我想最终将函数应用于循环或mapply中数据集的每一列,以便函数使用该系列的所有可用观察结果返回每个过滤的系列。

3 个答案:

答案 0 :(得分:2)

谢谢@ ran2。我研究了你的建议并设法解决问题 - 但是,以一种相当不优雅的方式。首先,我无法让任何'apply family'函数在xts对象上正常工作,从而保持其结构。普通适用于apply(x,MARGIN = 2,..),用于列式应用程序显示出承诺,但在'coredata'声明中停滞不前。 lapply等产生了损坏的清单。

然后我去了for循环。但是因为x&lt; -na.omit(x)改变了变量的长度,所以它不能替换循环内的原始值。

> for(i in 1:ncol(USDATAq)) {
+ USDATAq[,i]<-hpfilter(USDATAq[,i])
+ }
  

NextMethod(.Generic)中的错误:         要替换的项目数量不是替换长度的倍数

所以,我不得不向hpfilter添加不合适的代码,以便将结果“合并”回原始(带NA),然后返回变量。此合并将按日期(因此,长度)的2个变量与NA填充到结果中。然后,此结果可以在循环中替换原始结果。总之,我不得不将hpfilter修改为:

hpfilter <- function(x,lambda=2){
y<-na.omit(x)
eye <- diag(length(y))
coredata(y) <- solve(eye + lambda * crossprod(diff(eye, lag=1, d=2)), coredata(y))
xy<-merge(x,y) 
return(xy[,2])
}

然后使用上面的循环,最终获得无错结果。然而,我对R的了解是如此简陋,以至于可能有更简单的方法来做到这一点。但是,至少,我现在可以继续。感谢所有人指出我正确的方向。我仍然欢迎进一步更正我上面的代码。

答案 1 :(得分:1)

我认为你走在正确的轨道上。为什么不在这个函数里面添加na.omit呢?在创建eye矩阵之前? x<-na.omit(x)。那么你所要做的就是将单变量系列传递给它而不是整个data.frames。换句话说:保持函数原样,添加na.omit并将其与lapply(或任何形式的apply家族(sapply,tapply,lapply)最适合你。

答案 2 :(得分:0)

使用动物园对象时,使用attributes()而不是coredata()会更清晰,然后您可以直接合并到动物园对象中。 (我没有为xts对象尝试过这个):

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