使用R中的data.table用面板数据的预测填充列
我有一个带有“实体”和“年份”的面板数据。我有一个列“x”,它的值与时间序列类似。我想创建一个新的列“xp”,其中,对于每个“实体”,我为每个“年”提供从前5年的预测中获得的值。如果之前可用的值少于5个,则xp=NA 出于通用性考虑,forecast是R中内置函数的输出,该函数来自一些包(如“forecast”)中的两个预定义函数。如果使用特定函数更容易,那么让我们使用forecast(auto.arima(x.L5:x.L1),h=1) 现在,我在R中使用data.table,因为它比我在数据集上进行的所有其他操作都快得多 然而,我想做的不是数据。表101和我正在与之斗争。 如果你能抽出一点时间来帮助我,我将不胜感激。 谢谢 以下是我想做的事情的摘录:使用R中的data.table用面板数据的预测填充列,r,function,time-series,data.table,lag,R,Function,Time Series,Data.table,Lag,我有一个带有“实体”和“年份”的面板数据。我有一个列“x”,它的值与时间序列类似。我想创建一个新的列“xp”,其中,对于每个“实体”,我为每个“年”提供从前5年的预测中获得的值。如果之前可用的值少于5个,则xp=NA 出于通用性考虑,forecast是R中内置函数的输出,该函数来自一些包(如“forecast”)中的两个预定义函数。如果使用特定函数更容易,那么让我们使用forecast(auto.arima(x.L5:x.L1),h=1) 现在,我在R中使用data.table,因为它比我在数据
entity year x xp
1 1980 21 NA
1 1981 23 NA
1 1982 32 NA
1 1983 36 NA
1 1984 38 NA
1 1985 45 42.3 =f((21,23,32,36,38))
1 1986 50 48.6 =f((23,32,36,38,45))
2 1991 2 NA
2 1992 4 NA
2 1993 6 NA
2 1994 8 NA
2 1995 10 NA
2 1996 12 12.4 =f((2,4,6,8,10))
2 1997 14 13.9 =f((4,6,8,10,12))
...
根据Eddi的建议,我找到了一种使用rollapply的方法:
DT <- data.table(mydata)
DT <- DT[order(entity,year)]
DT[,xp:=rollapply(.SD$x,5,timeseries,align="right",fill=NA,by="entity"]
DT在zoo
中签出rollappy
我无法使用rollappy by entity。可能您的数据排序不正确,请在运行命令之前尝试运行setkey(您的_DT,entity,year)
;您还可以添加一个print
语句来查看哪个组失败,例如DT[,xp:={print(entity);rollappy(…)},by=entity]
并调试该组的函数谢谢。来自每个实体的年数。解决了。你可以用对你有帮助的确切答案自我回答你的问题,这样其他人也可以学习。
timeseries <- function(x){
fit <- auto.arima(x)
value <- as.data.frame(forecast(fit,h=1))[1,1]
return(value)
}