R:未给出第一个或最后一个值时按索引/组对NA的值进行插值

时间:2018-07-11 22:25:09

标签: r interpolation missing-data

我有一些面板数据,其中包含15年不同经济指标的县数据(我为此创建了一个索引)。我要插入的值中缺少数据。但是,由于这些值按年份随机丢失,因此线性插值无效,它只能为我提供第一个和最后一个数据点之间的插值。这是一个问题,因为我需要整个系列的插值。

既然所有系列都有5个以上的数据点,那么是否有任何代码可以根据特定系列中已经存在的数据对系列进行插值?

我首先想到了索引数据以尝试运行循环,但是随后我发现了按组进行线性插值的代码。后者解决了某些NA时,并未对所有NA进行插值。这是我的数据示例,该数据会插值一些数据,但不是全部。

SELECT * FROM ( SELECT email,password,user_role, id as customer_id,id as user_id, 1 as preference FROM table1 WHERE email = 'raj@demo.com' UNION SELECT email,password,user_role, customer_id,id, 2 as preference FROM table2 WHERE email = 'doc@demo.com' ) T ORDER BY preference LIMIT 1

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)

任何帮助将不胜感激。我对R很陌生,从未使用过循环,但我查找了其他“按组插补”帮助。当第一个点和最后一个点也是NA时,似乎也没有解决填充数据的问题。

1 个答案:

答案 0 :(得分:0)

也许这可以帮助:

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函数内部使用了近似值,因此可以传递近似值的参数来调整行为。

您在示例中使用的参数:方法=“线性”,规则= 1,f = 0,关系=平均值是标准参数。如果要使用这些,则无需添加任何内容。

否则,您将使用以下示例更改循环中的部分:

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