R 时间序列中的线性插值缺失值

R 时间序列中的线性插值缺失值,r,time-series,dplyr,linear-interpolation,R,Time Series,Dplyr,Linear Interpolation,我想在data.frame中添加最小和最大日期之间的所有缺失日期,并对所有缺失值进行线性插值,如 df <- data.frame(date = as.Date(c("2015-10-05","2015-10-08","2015-10-09", "2015-10-12","2015-10-14")), value = c(8,3,9,NA,5)) date va

我想在
data.frame
中添加最小和最大日期之间的所有缺失日期,并对所有缺失值进行线性插值,如

df <- data.frame(date = as.Date(c("2015-10-05","2015-10-08","2015-10-09",
                                  "2015-10-12","2015-10-14")),       
                 value = c(8,3,9,NA,5))

      date value
2015-10-05     8
2015-10-08     3
2015-10-09     9
2015-10-12    NA
2015-10-14     5

      date value approx
2015-10-05     8      8
2015-10-06    NA   6.33
2015-10-07    NA   4.67
2015-10-08     3      3
2015-10-09     9      9
2015-10-10    NA   8.20
2015-10-11    NA   7.40
2015-10-12    NA   6.60
2015-10-13    NA   5.80
2015-10-14     5      5

df这里有一种方法。我使用第一个和最后一个日期创建了一个数据框,其中包含一系列日期。使用
dplyr
包中的
full\u join()
,我合并了数据帧和
mydf
。然后,我在zoo包中使用
na.approx()
来处理
mutate()
部分中的插值

mydf <- data.frame(date = as.Date(c("2015-10-05","2015-10-08","2015-10-09",
                                    "2015-10-12","2015-10-14")),       
                   value = c(8,3,9,NA,5))

library(dplyr)
library(zoo)

data.frame(date = seq(mydf$date[1], mydf$date[nrow(mydf)], by = 1)) %>%
full_join(mydf, by = "date") %>%
mutate(approx = na.approx(value))

#         date value   approx
#1  2015-10-05     8 8.000000
#2  2015-10-06    NA 6.333333
#3  2015-10-07    NA 4.666667
#4  2015-10-08     3 3.000000
#5  2015-10-09     9 9.000000
#6  2015-10-10    NA 8.200000
#7  2015-10-11    NA 7.400000
#8  2015-10-12    NA 6.600000
#9  2015-10-13    NA 5.800000
#10 2015-10-14     5 5.000000
mydf%
完全联接(mydf,by=“date”)%>%
变异(近似值=近似值)
#日期值约为
#1  2015-10-05     8 8.000000
#2 2015-10-06 NA 6.333333
#3 2015-10-07 NA 4.666667
#4  2015-10-08     3 3.000000
#5  2015-10-09     9 9.000000
#6 2015-10-10 NA 8.200000
#7 2015-10-11北美7.400000
#8 2015-10-12北美6.600000
#9 2015-10-13北美5.800000
#10 2015-10-14     5 5.000000

以下是一些解决方案

1)zoo将数据帧转换为zoo系列,并使用带有连续日期的
xout=
na.approx
获得最终系列

library(zoo)
z <- read.zoo(mydf)
zz <- na.approx(z, xout = seq(start(z), end(z), "day"))
它可能更方便,让它在动物园的形式,所以你可以使用动物园的所有设施,但如果你需要它在数据框的形式只使用它

DF <- fortify.zoo(zz)
(如果需要zoo输出,请省略
fortify.zoo
部分)

2)base R如果没有这样的软件包,我们基本上可以做同样的事情:

n <- nrow(mydf)
with(mydf, data.frame(approx(date, value, xout = seq(date[1], date[n], "day"))))

n如果您使用Forecast软件包,我认为您的代码看起来会非常清晰和简单

library(forecast)
x <- zoo(df$value,df$date)
x <- as.ts(x)
x <- na.interp(x)
print(x)
库(预测)

x另一个简单的解决方案(使用IMPUTET):

库(输入)

我刚开始使用这个软件包,它让这类事情变得简单多了!
n <- nrow(mydf)
with(mydf, data.frame(approx(date, value, xout = seq(date[1], date[n], "day"))))
library(forecast)
x <- zoo(df$value,df$date)
x <- as.ts(x)
x <- na.interp(x)
print(x)
library(imputeTS)
x <- zoo(df$value,df$date)
x <- na.interpolation(x, option = "linear")
print(x)