首页 > 解决方案 > 使用 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,但不删除它们,那将是非常棒的。谢谢!

标签: r

解决方案


这是一种丢弃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

推荐阅读