按组插值估算缺失
impute missing with interpolation by groups
我正在尝试通过多个组的插值来估算缺失值 NA
。
我只是子集一个简单的例子:
Year ST CC ID MP PS
2002 15 3 3 NA 1.5
2003 15 3 3 NA 1.5
2004 15 3 3 193 1.5
2005 15 3 3 193 1.5
2006 15 3 3 348 1.5
2007 15 3 3 388 1.5
2008 15 3 3 388 1.5
1999 53 33 1 NA 3.4
2000 53 33 1 NA 3.4
2002 53 33 1 NA 2.9
2003 53 33 1 NA 2.6
2004 53 33 1 NA 2.6
2005 53 33 1 170 3.8
2006 53 33 1 170 3.0
2007 53 33 1 330 4.2
2008 53 33 1 330 5.0
我用了na.approx()
但是错了。似乎我的数据在每个组的第一次观察中都有缺失值。
setDT(dt)[, MP_interpolate := na.approx(MP, na.rm = T), .(Year, ST, CC, ID)]
setDT(dt)[, MP_interpolate := if(length(na.omit(MP))<2) MP else na.approx(MP, na.rm=TRUE), .(Year, ST, CC, ID)]
我也试过包 imputeTS
但没有用。
两者都不正确。这是否意味着使用插值来估算缺失不是一个好主意?
我不确定哪种插补方式更好(不想使用 mean
或 median
)。我正在考虑使用 PS
趋势来估算 MP
。 (只是我的想法,不是问题)
如果组的开头和结尾有 NA
个值,则应使用 na.rm = FALSE
以获得与输入大小相同的输出。使用 na.rm = TRUE
,前导和尾随 NA
被删除。
此外,您不应该按 year
分组,因为那样只会给您一组观察值。
library(data.table)
setDT(dt)
dt[, MP_interpolate := as.integer(zoo::na.approx(MP, na.rm = FALSE)), .(ST, CC, ID)]
数据
dt <- structure(list(Year = c(2002L, 2003L, 2004L, 2005L, 2006L, 2007L,
2008L, 1999L, 2000L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L,
2008L), ST = c(15L, 15L, 15L, 15L, 15L, 15L, 15L, 53L, 53L, 53L,
53L, 53L, 53L, 53L, 53L, 53L), CC = c(3L, 3L, 3L, 3L, 3L, 3L,
3L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L), ID = c(3L,
3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
MP = c(NA, NA, 193L, 193L, 348L, 388L, 388L, NA, NA, NA,
NA, NA, 170L, 170L, 330L, 330L), PS = c(1.5, 1.5, 1.5, 1.5,
1.5, 1.5, 1.5, 3.4, 3.4, 2.9, 2.6, 2.6, 3.8, 3, 4.2, 5)),
class = "data.frame", row.names = c(NA, -16L))
您可以在 ave
中尝试 imputeTS::na_kalman
。这也可以推断出您可能想要的东西。
library(imputeTS)
dt$MP.imp <- with(dt, ave(MP, ST, CC, ID, FUN=na_kalman))
# Year ST CC ID MP PS MP.imp
# 1 2001 15 3 3 NA 1.5 193.0000
# 2 2002 15 3 3 NA 1.5 193.0000
# 3 2003 15 3 3 NA 1.5 193.0000
# 4 2004 15 3 3 193 1.5 193.0000
# 5 2005 15 3 3 193 1.5 193.0000
# 6 2006 15 3 3 348 1.5 348.0000
# 7 2007 15 3 3 388 1.5 388.0000
# 8 2008 15 3 3 388 1.5 388.0000
# 9 1999 53 33 1 NA 3.4 170.2034
# 10 2000 53 33 1 NA 3.4 166.3867
# 11 2002 53 33 1 NA 2.9 164.4496
# 12 2003 53 33 1 NA 2.6 165.0018
# 13 2004 53 33 1 NA 2.6 168.6527
# 14 2005 53 33 1 170 3.8 170.0000
# 15 2006 53 33 1 170 3.0 170.0000
# 16 2007 53 33 1 330 4.2 330.0000
# 17 2008 53 33 1 330 5.0 330.0000
您可能希望在 ave
中包含 year
,否则在您的示例数据中它不会起作用。
我正在尝试通过多个组的插值来估算缺失值 NA
。
我只是子集一个简单的例子:
Year ST CC ID MP PS
2002 15 3 3 NA 1.5
2003 15 3 3 NA 1.5
2004 15 3 3 193 1.5
2005 15 3 3 193 1.5
2006 15 3 3 348 1.5
2007 15 3 3 388 1.5
2008 15 3 3 388 1.5
1999 53 33 1 NA 3.4
2000 53 33 1 NA 3.4
2002 53 33 1 NA 2.9
2003 53 33 1 NA 2.6
2004 53 33 1 NA 2.6
2005 53 33 1 170 3.8
2006 53 33 1 170 3.0
2007 53 33 1 330 4.2
2008 53 33 1 330 5.0
我用了na.approx()
但是错了。似乎我的数据在每个组的第一次观察中都有缺失值。
setDT(dt)[, MP_interpolate := na.approx(MP, na.rm = T), .(Year, ST, CC, ID)]
setDT(dt)[, MP_interpolate := if(length(na.omit(MP))<2) MP else na.approx(MP, na.rm=TRUE), .(Year, ST, CC, ID)]
我也试过包 imputeTS
但没有用。
两者都不正确。这是否意味着使用插值来估算缺失不是一个好主意?
我不确定哪种插补方式更好(不想使用 mean
或 median
)。我正在考虑使用 PS
趋势来估算 MP
。 (只是我的想法,不是问题)
如果组的开头和结尾有 NA
个值,则应使用 na.rm = FALSE
以获得与输入大小相同的输出。使用 na.rm = TRUE
,前导和尾随 NA
被删除。
此外,您不应该按 year
分组,因为那样只会给您一组观察值。
library(data.table)
setDT(dt)
dt[, MP_interpolate := as.integer(zoo::na.approx(MP, na.rm = FALSE)), .(ST, CC, ID)]
数据
dt <- structure(list(Year = c(2002L, 2003L, 2004L, 2005L, 2006L, 2007L,
2008L, 1999L, 2000L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L,
2008L), ST = c(15L, 15L, 15L, 15L, 15L, 15L, 15L, 53L, 53L, 53L,
53L, 53L, 53L, 53L, 53L, 53L), CC = c(3L, 3L, 3L, 3L, 3L, 3L,
3L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L), ID = c(3L,
3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
MP = c(NA, NA, 193L, 193L, 348L, 388L, 388L, NA, NA, NA,
NA, NA, 170L, 170L, 330L, 330L), PS = c(1.5, 1.5, 1.5, 1.5,
1.5, 1.5, 1.5, 3.4, 3.4, 2.9, 2.6, 2.6, 3.8, 3, 4.2, 5)),
class = "data.frame", row.names = c(NA, -16L))
您可以在 ave
中尝试 imputeTS::na_kalman
。这也可以推断出您可能想要的东西。
library(imputeTS)
dt$MP.imp <- with(dt, ave(MP, ST, CC, ID, FUN=na_kalman))
# Year ST CC ID MP PS MP.imp
# 1 2001 15 3 3 NA 1.5 193.0000
# 2 2002 15 3 3 NA 1.5 193.0000
# 3 2003 15 3 3 NA 1.5 193.0000
# 4 2004 15 3 3 193 1.5 193.0000
# 5 2005 15 3 3 193 1.5 193.0000
# 6 2006 15 3 3 348 1.5 348.0000
# 7 2007 15 3 3 388 1.5 388.0000
# 8 2008 15 3 3 388 1.5 388.0000
# 9 1999 53 33 1 NA 3.4 170.2034
# 10 2000 53 33 1 NA 3.4 166.3867
# 11 2002 53 33 1 NA 2.9 164.4496
# 12 2003 53 33 1 NA 2.6 165.0018
# 13 2004 53 33 1 NA 2.6 168.6527
# 14 2005 53 33 1 170 3.8 170.0000
# 15 2006 53 33 1 170 3.0 170.0000
# 16 2007 53 33 1 330 4.2 330.0000
# 17 2008 53 33 1 330 5.0 330.0000
您可能希望在 ave
中包含 year
,否则在您的示例数据中它不会起作用。