R - 估算缺失值

4

假设我有这样一个表格:

Date        Sales
09/01/2017  9000
09/02/2017  12000
09/03/2017  0
09/04/2017  11000
09/05/2017  14400
09/06/2017  0
09/07/2017  0
09/08/2017  21000
09/09/2017  15000
09/10/2017  23100
09/11/2017  0
09/12/2017  32000
09/13/2017  8000

以下是表格中的数据示例

这个表中的值是由一个我无法访问的R程序估算的(目前它是一个黑匣子)。 现在有一些带0的日期,这些日期往往由于我们的摄入/ ETL过程中的问题而出现。 我需要估算缺少数据的日期的值。

我们的方法是:

  • 从缺失数据之前的日期到缺失数据之后的日期画一条线
  • 从该线条中估算缺失日期的值

如果只有一个缺失数据的日子在两个良好的日子之间,直接使用简单平均数即可。 如果有两个或更多连续的缺失数据的日子,则平均数无法使用,因此我正在尝试制定一种方法来估计多个数据点的值。

绿线和红线的交点将给出所需的值

这种方法在R中可以使用吗? 我对R完全不了解,因此我真的不确定这是否可行。


以下答案可行,但您也可以使用“zoo”包和“na.spline”来完成相同的事情。 - CCurtis
2个回答

6
您可以使用函数approxfun进行线性插值填充数值。
## Your data
df = read.table(text="Date        Sales
09/01/2017  9000
09/02/2017  12000
09/03/2017  0
09/04/2017  11000
09/05/2017  14400
09/06/2017  0
09/07/2017  0
09/08/2017  21000
09/09/2017  15000
09/10/2017  23100
09/11/2017  0
09/12/2017  32000
09/13/2017  8000",
header=TRUE, stringsAsFactors=FALSE)
df$Date = as.Date(df$Date, format="%m/%d/%Y")


## Create function for linear interpolation
Interp = approxfun(df[df$Sales > 0, ])

## Use function to fill in interpolated values
Vals = Interp(df$Date[df$Sales == 0])
df$Sales[df$Sales == 0] = Vals
plot(df, type="l")
grid()

Interpolated values


4
我们还可以使用imputeTS包中的na.interpolation函数。na.interpolation的默认方法是线性插值,但如果需要,我们也可以指定其他方法。
library(dplyr)
library(imputeTS)

dt2 <- dt %>%
  replace(. == 0, NA) %>%
  mutate(Sales = na.interpolation(Sales))

dt2
         Date Sales
1  09/01/2017  9000
2  09/02/2017 12000
3  09/03/2017 11500
4  09/04/2017 11000
5  09/05/2017 14400
6  09/06/2017 16600
7  09/07/2017 18800
8  09/08/2017 21000
9  09/09/2017 15000
10 09/10/2017 23100
11 09/11/2017 27550
12 09/12/2017 32000
13 09/13/2017  8000

数据

dt <- read.table(text = "Date        Sales
09/01/2017  9000
                 09/02/2017  12000
                 09/03/2017  0
                 09/04/2017  11000
                 09/05/2017  14400
                 09/06/2017  0
                 09/07/2017  0
                 09/08/2017  21000
                 09/09/2017  15000
                 09/10/2017  23100
                 09/11/2017  0
                 09/12/2017  32000
                 09/13/2017  8000",
                 header = TRUE, stringsAsFactors = FALSE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接