Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用分组插值法插补缺失_R_Data.table_Data Manipulation_Missing Data_Imputets - Fatal编程技术网

R 用分组插值法插补缺失

R 用分组插值法插补缺失,r,data.table,data-manipulation,missing-data,imputets,R,Data.table,Data Manipulation,Missing Data,Imputets,我试图通过多组插值来插补缺失值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

我试图通过多组插值来插补缺失值
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)]
setDT(dt)[,MP_插值:=na.近似值(MP,na.rm=T),(年份,ST,CC,ID)]

setDT(dt)[,MP_interpolate:=if(length(na.omit(MP))如果在组的开始和结束处有
na
值,则应使用
na.rm=FALSE
获得与输入大小相同的输出。使用
na.rm=TRUE
,删除开头和结尾的
na
s

此外,您不应该按
年进行分组,因为这样在一组中只会给您一次观察

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))

dt您可以在
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
库(输入)

dt$MP.imp我在新的专栏中得到了
NA
TRUE
。但是它对我来说很有用。我在那里也把
包装为.integer
,所以实际上你不应该得到逻辑值。你能检查我在帖子中共享的数据吗?得到警告消息:
警告消息:1:in
[.data.table
(setDT),
:=
(MP_interpolate,as.integer)(na.近似值(MP,第1组列'MP_interpolate':193(类型'integer')在RHS位置3处赋值给类型'logical'2:In
[.data.table
(setDT(dt),
:=
(MP_interpolate,as.integer)(na.近似值(MP,第2组列'MP_interpolate':170(类型'integer'))在RHS位置6,当分配给“logical”类型时,将其视为真。
即使在我共享的数据上,您也会得到这样的结果吗?您的
packageVersion('data.table')
?我有
'1.12.2'
packageVersion('data.table')):“1.12.8”
对于你的样本,我在每组的第一次观察中仍然得到了
NA
$MP\u插值:int-NA-NA 193 193 348 388 388 NA-NA…
你能解释一下
NA-kalman
是如何工作的吗?在
ID=1
中,
MP.imp
减少和增加。看起来很酷。@PeterChen在由提出的空间状态模型上。卡尔曼滤波器应用基于水平、趋势和季节性成分的平滑算法对缺失进行内部/外推,并处理非平稳数据。因此它不同于线性插值。谢谢。我认为它首先基于另一列进行插补,如插补
MP
ba基于
PS
…@PeterChen的趋势,实际上,它只是以单变量的方式对分组的时间序列进行插值。对于多变量插值,您可以进行预测,例如基于或使用多重插补,如(参数)或(非参数)。但这导致了一个更适合的统计讨论。
黄土回归
帮助很大。因为专栏中有很多
NA
,似乎我需要研究多元插值。谢谢