5

我是一个新的 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过滤功能。在这个站点的其他地方,我发现了这个实现,它使用该coredata函数应用于hpfilterxts 对象:

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,以便该函数使用该系列的所有可用观察结果返回每个过滤后的系列。

4

3 回答 3

3

谢谢@ran2。我根据您的建议努力并设法解决了这个问题——但是,以一种相当不雅的方式。首先,我无法让任何“应用系列”功能在 xts 对象上正常工作,从而保持其结构。使用 apply(x, MARGIN=2,..) 的普通应用显示了按列应用的承诺,但在“coredata”语句中停滞不前。lapply 等产生了损坏的列表。

然后我去了 for 循环。但是因为 x<-na.omit(x) 改变了变量的长度,所以不能替换原来的 inside 循环。

> 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 的了解非常初级,可能有更简单的方法可以做到这一点。但是,至少,我现在可以继续。感谢所有人为我指明正确的方向。我仍然欢迎对上面的代码进行进一步的更正。

于 2011-10-29T22:24:14.003 回答
1

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

于 2011-10-29T19:49:37.567 回答
0

对于 zoo 对象,使用它会稍微干净一些,attributes()而不是coredata()直接合并回 zoo 对象。(我还没有为 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)
}
于 2014-01-14T16:30:47.933 回答