r - 使用 dplyr 将 hpfilter 应用于具有 NA 的分组变量
问题描述
我正在尝试将 hpfilter 应用于我的数据集中具有面板结构(id + year)的变量之一,然后将过滤后的系列添加到我的数据集中。只要我在其中一个变量中没有任何 NA,它就可以正常工作,但是如果其中一个 id 缺少值,则会产生错误。这样做的原因是该hpfilter
函数不起作用NAs
(它只产生 NA)。
这是一个可重现的示例:
df1 <- read.table(text="country year X1 X2 W
A 1990 10 20 40
A 1991 12 15 NA
A 1992 14 17 41
A 1993 17 NA 44
B 1990 20 NA 45
B 1991 NA 13 61
B 1992 12 12 67
B 1993 14 10 68
C 1990 10 20 70
C 1991 11 14 50
C 1992 12 15 NA
C 1993 14 16 NA
D 1990 20 17 80
D 1991 16 20 91
D 1992 15 21 70
D 1993 14 22 69
", header=TRUE, stringsAsFactors=FALSE)
我的方法是使用该dplyr
group_by
函数按国家/地区将 hpfilter 应用于变量X1
:
library(mFilter)
library(plm)
# Organizing the Data as a Panel
df1 <- pdata.frame(df1, index = c("country","year"))
# Apply hpfilter to X1 and add trend to the sample
df1 <- df1 %>% group_by(country) %>% mutate(X1_trend = mFilter::hpfilter(na.exclude(X1), type = "lambda", freq = 6.25)$trend)
但是,这会产生以下错误:
Error in `[[<-.data.frame`(`*tmp*`, col, value = c(11.1695436493374, 12.7688604220353, :
replacement has 15 rows, data has 16
发生错误是因为在应用 hp 过滤器(由 NAs)后过滤的系列被缩短了。
由于我有一个包含许多国家/地区的大型数据集,如果有一种解决方法,在将系列传递给 hpfilter 时可能会忽略 NA,但不删除它们,那将是非常棒的。谢谢!
解决方案
这是一种丢弃NA
和计算的方法trend
:
df2 <- df1 %>% group_by(country) %>%
filter(!is.na(X1)) %>%
pdata.frame(., index = c("country","year")) %>%
mutate(X1_trend = mFilter::hpfilter(X1, type = "lambda", freq = 6.25)$trend)
> df2
country year X1 X2 W X1_trend
1 A 1990 10 20 40 11.16954
2 A 1991 12 15 NA 12.76886
3 A 1992 14 17 41 14.18105
4 A 1993 17 NA 44 15.09597
5 B 1990 20 NA 45 15.17450
6 B 1992 12 12 67 14.38218
7 B 1993 14 10 68 13.45663
8 C 1990 10 20 70 12.75429
9 C 1991 11 14 50 12.71858
10 C 1992 12 15 NA 13.35221
11 C 1993 14 16 NA 14.38293
12 D 1990 20 17 80 15.32211
13 D 1991 16 20 91 15.61990
14 D 1992 15 21 70 15.47486
15 D 1993 14 22 69 15.14639
编辑:为了在最终输出中保留缺失值,我们再进行一项操作:
df3 <- merge(df1,df2, by = colnames(df1),all.x = T)
> df3
country year X1 X2 W X1_trend
1 A 1990 10 20 40 11.16954
2 A 1991 12 15 NA 12.76886
3 A 1992 14 17 41 14.18105
4 A 1993 17 NA 44 15.09597
5 B 1990 20 NA 45 15.17450
6 B 1991 NA 13 61 NA
7 B 1992 12 12 67 14.38218
8 B 1993 14 10 68 13.45663
9 C 1990 10 20 70 12.75429
10 C 1991 11 14 50 12.71858
11 C 1992 12 15 NA 13.35221
12 C 1993 14 16 NA 14.38293
13 D 1990 20 17 80 15.32211
14 D 1991 16 20 91 15.61990
15 D 1992 15 21 70 15.47486
16 D 1993 14 22 69 15.14639
推荐阅读
- c++ - boost::unique_lock 析构函数错误,状态已损坏
- tabulator - 从 Tabulator JSON 下载中排除已删除的列
- node.js - NodeJS返回JSON,但不能正确地返回客户端
- rust - 运行当前目录之外的 Rust 程序
- c - 如果连续按下按钮,如何立即检测?
- json - 如何查看 git 已删除文件的内容(在我的情况下为 json 文件),然后对其进行解析以进行处理(如清理)?
- javascript - 如何循环遍历 api 数组中的多个对象
- hangout - 将 Webhook 发布到现有线程
- laravel - Laravel 5.7 - 渴望加载关系的关系
- ios - 我应该使用 presentViewController 回到第一个视图控制器吗?