我是一个新的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
中数据集的每一列,以便函数使用该系列的所有可用观察结果返回每个过滤的系列。
答案 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)
}