【发布时间】:2018-07-11 22:25:08
【问题描述】:
我有面板数据,其中包含 15 年不同经济指标的县数据(我已为其创建了一个索引)。我想插值的值中缺少数据。但是,由于这些值按年份随机丢失,因此线性插值不起作用,它只给我第一个和最后一个数据点之间的插值。这是一个问题,因为我需要整个系列的插值。
由于所有系列都有超过 5 个数据点,是否有任何代码可以根据特定系列中已经存在的数据对系列进行插值?
我首先考虑索引我的数据以尝试运行一个循环,但后来我发现了关于按组进行线性插值的代码。虽然后者解决了一些 NA,但它并没有插入所有这些。这是我的数据示例,它插入了一些数据,但不是全部。
library(dplyr)
data <- read.csv(text="
index,year,value
1,2001,20864.135
1,2002,20753.867
1,2003,NA
1,2004,17708.224
1,2005,12483.767
1,2006,12896.251
1,2007,NA
1,2008,NA
1,2009,9021.556
1,2010,NA
1,2011,NA
1,2012,13795.752
1,2013,16663.741
1,2014,19349.992
1,2015,NA
2,2001,NA
2,2002,NA
2,2003,NA
2,2004,NA
2,2005,NA
2,2006,NA
2,2007,NA
2,2008,151.108
2,2009,107.205
2,2010,90.869
2,2011,104.142
2,2012,NA
2,2013,128.646
2,2014,NA
2,2015,NA")
使用
interpolation<-data %>%
group_by(index) %>%
mutate(valueIpol = approx(year, value, year,
method = "linear", rule = 1, f = 0, ties = mean)$y)
我得到以下插值。
1,2001,20864.135
1,2002,20753.867
1,2003,19231.046
1,2004,17708.224
1,2005,12483.767
1,2006,12896.251
1,2007,11604.686
1,2008,10313.121
1,2009,9021.556
1,2010,10612.955
1,2011,12204.353
1,2012,13795.752
1,2013,16663.741
1,2014,19349.992
1,2015,NA
2,2001,NA
2,2002,NA
2,2003,NA
2,2004,NA
2,2005,NA
2,2006,NA
2,2007,NA
2,2008,151.108
2,2009,107.205
2,2010,90.869
2,2011,104.142
2,2012,116.394
2,2013,128.646
2,2014,NA
2,2015,NA
任何帮助将不胜感激。我对 R 很陌生,从未使用过循环,但我查找了其他“按组插值”帮助。当第一个点和最后一个点也是 NA 时,似乎没有什么可以解决填充数据的问题。
【问题讨论】:
-
对于第一个和最后一个都是NA的元素,你想怎么填充呢?试试
library(zoo); data %>% group_by(index) %>% mutate(valueIpol = na.approx(value, na.rm = FALSE)) %>% fill(valueIpol, .direction = 'up') %>% fill(valueIpol, .direction = 'down') -
我不确定你的意思。我希望可以根据系列中已经存在的值的趋势对它们进行插值。
-
刚刚意识到,您的原始代码已经可以工作了....只需将 rule = 1 替换为 rule = 2。NA 是因为 rule = 1 忽略了尾随/前导 NA。
标签: r interpolation missing-data