gpt4 book ai didi

r - 修改通常的 hpfilter 函数以忽略 na 的

转载 作者:行者123 更新时间:2023-12-04 20:19:40 24 4
gpt4 key购买 nike

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

最佳答案

谢谢@ran2。我按照你的建议工作并设法解决了问题——但是,以一种相当不雅的方式。首先,我无法让任何“应用系列”功能在 xts 对象上正常工作,从而保持其结构。使用 apply(x, MARGIN=2,..) 进行按列应用的普通应用显示出 promise ,但在“核心数据”语句中停滞不前。 lapply 等产生了错误的列表。

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

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

Error in NextMethod(.Generic) : number of items to replace is not a multiple of replacement length



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

关于r - 修改通常的 hpfilter 函数以忽略 na 的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com