基于 r 中标志列的面板数据插值

Interpolation of panel data based on a flag column in r

我有一个时间序列面板数据集,其结构如下:

df <- data.frame(
  year = c(2012L, 2013L, 2014L, 2012L, 2013L, 2014L),
  id = c(1L, 1L, 1L, 2L, 2L, 2L),
  c = c(11L, 13L, 13L, 16L, 15L, 15L),
flag = c(FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)
)

#>   year id  c flag
#> 1 2012  1 11 FALSE
#> 2 2013  1 26 TRUE
#> 3 2014  1 13 FALSE
#> 4 2012  2 16 FALSE
#> 5 2013  2 15 FALSE
#> 6 2014  2 19 FALSE

我想做一个线性插值,只要标志列中有相应的 TRUE 值,c 列中的值就会通过对其前后的值进行平均来插值。例如因为值 26 有一个 TRUE 标志,我希望它被替换为 11 和 13 的平均值,即 12。 我尝试编写一个函数,但在面板数据设置中无法正确实现它。

我想到的一个选项是使用子集 ?stats::filter,它本质上是一个移动平均线,基于将两边的值乘以 0.5,并将当前值乘以 0。

df$c[df$flag] <- stats::filter(df$c, c(0.5,0,0.5))[df$flag]
df

#  year id  c  flag
#1 2012  1 11 FALSE
#2 2013  1 12  TRUE
#3 2014  1 13 FALSE
#4 2012  2 16 FALSE
#5 2013  2 15 FALSE
#6 2014  2 15 FALSE

您可以 replace c 值,其中 flagTRUENA,然后用 na.approx 从 [=17] 插入值=].

library(dplyr)

df %>% mutate(c = zoo::na.approx(replace(c, flag, NA)))

#  year id  c  flag
#1 2012  1 11 FALSE
#2 2013  1 12  TRUE
#3 2014  1 13 FALSE
#4 2012  2 16 FALSE
#5 2013  2 15 FALSE
#6 2014  2 15 FALSE