R - 估计缺失值
R - estimating missing values
假设我有一个 table 这样的:
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
table 中的值是由我无法访问的 R 程序估算的(它现在是一个黑盒子)。现在,由于我们 ingestion/ETL 过程中的问题,有几天的值往往为 0。我需要估计数据为 0 的日期的值。
我们的方法是:
- 从缺失数据之前的日期到右边的日期画一条线
在丢失数据后
- 估计行中缺失日期的值
现在,如果在两个好日子之间只有一天缺少数据,那么直接的方法就可以了。如果连续两天或更多天缺少数据,平均值将不起作用,因此我正在尝试制定一种方法来估算多个数据点的值。
这种方法在 R 中行得通吗?我在 R 完全是 n00b,所以我不确定这是否可行。
您可以使用函数 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()
我们还可以使用 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)
假设我有一个 table 这样的:
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
table 中的值是由我无法访问的 R 程序估算的(它现在是一个黑盒子)。现在,由于我们 ingestion/ETL 过程中的问题,有几天的值往往为 0。我需要估计数据为 0 的日期的值。
我们的方法是:
- 从缺失数据之前的日期到右边的日期画一条线 在丢失数据后
- 估计行中缺失日期的值
现在,如果在两个好日子之间只有一天缺少数据,那么直接的方法就可以了。如果连续两天或更多天缺少数据,平均值将不起作用,因此我正在尝试制定一种方法来估算多个数据点的值。
这种方法在 R 中行得通吗?我在 R 完全是 n00b,所以我不确定这是否可行。
您可以使用函数 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()
我们还可以使用 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)