【问题标题】:R: Interpolation of values for NAs by indices/groups when first or last values aren't givenR:当未给出第一个或最后一个值时,按索引/组对 NA 的值进行插值
【发布时间】: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 %&gt;% group_by(index) %&gt;% mutate(valueIpol = na.approx(value, na.rm = FALSE)) %&gt;% fill(valueIpol, .direction = 'up') %&gt;% fill(valueIpol, .direction = 'down')
  • 我不确定你的意思。我希望可以根据系列中已经存在的值的趋势对它们进行插值。
  • 刚刚意识到,您的原始代码已经可以工作了....只需将 rule = 1 替换为 rule = 2。NA 是因为 rule = 1 忽略了尾随/前导 NA。

标签: r interpolation missing-data


【解决方案1】:

也许这会有所帮助:

library(imputeTS)
for(i in unique(data$index)) {
  data[data$index == i,] <- na.interpolation(data[data$index == i,])
}

仅当组本身已按年份排序时才有效。 (在您的示例中就是这种情况)

输出如下所示:

> data
  index year     value
1      1 2001 20864.135
2      1 2002 20753.867
3      1 2003 19231.046
4      1 2004 17708.224
5      1 2005 12483.767
6      1 2006 12896.251
7      1 2007 11604.686
8      1 2008 10313.121
9      1 2009  9021.556
10     1 2010 10612.955
11     1 2011 12204.353
12     1 2012 13795.752
13     1 2013 16663.741
14     1 2014 19349.992
15     1 2015 19349.992
16     2 2001   151.108
17     2 2002   151.108
18     2 2003   151.108
19     2 2004   151.108
20     2 2005   151.108
21     2 2006   151.108
22     2 2007   151.108
23     2 2008   151.108
24     2 2009   107.205
25     2 2010    90.869
26     2 2011   104.142
27     2 2012   116.394
28     2 2013   128.646
29     2 2014   128.646
30     2 2015   128.646

由于 na.interpolation 函数内部使用了 approx,所以可以传递 approx trough 的参数来调整行为。

您在示例中使用的参数:method = "linear", rule = 1, f = 0, ties = mean 是标准参数。如果你想使用这些,你不必添加任何东西。

否则,您将更改循环中的部分,例如:

  data[data$index == i,] <- na.interpolation(data[data$index == i,], ties ="ordered", f = 1, rule = 2)

【讨论】:

  • 有没有办法根据系列中已经存在的值对 NA 进行插值?而不是重复最后一个已知值(索引 2,值 128.646)
  • 嗯...没有办法插入这些值。尾随/领先的 NA 需要外推/预测。这不适用于基于 zoo:na.approx、approx、imputeTS::interpolation 的解决方案。也看看我在你原来的帖子下的评论。您的代码已经运行,只是规则参数设置错误。
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多