如何创建多个不同的滞后
Posted
技术标签:
【中文标题】如何创建多个不同的滞后【英文标题】:How to create multiple different lags 【发布时间】:2015-01-16 02:47:03 【问题描述】:我正在尝试在代表多个滞后的数据框中创建新变量。我现在有一个时间序列“序列”,我想创建 10 个不同的变量,每个变量代表“序列”的某个滞后。因此,生成的数据框将具有原始变量“系列”,加上 10 个名为 (1, 2, 3, 4, ... 10) 的变量,这些变量代表该滞后数。我目前正在 for 循环中尝试这个:
for (i in 1:max.lag)
lag.death$"i" <- lag(tscampos, i)
但是读完这里之后,我怀疑我可能想使用其中一个应用函数?有任何想法吗?
【问题讨论】:
当你超出时间范围时,你想用零填充边吗?*apply
可能是一个解决方案,但如果我是你,我宁愿编写一个函数来在你需要的任何时候为你完成这项工作,而不是存储 10 个相同系列的滞后版本.. 等一下 ;)
等一下,你说的是实际的 R 的lag
函数吗?如果是,则此函数返回一个滞后的“时间序列对象”,该对象一旦卡在 data.frame 中,就与原始对象完全相同。如果你真的需要存储 10 个滞后版本的“系列”,那么将它们放入一个带有 lapply(0:9,lag,x=lag.death$series)
的列表中。
我以前也遇到过这个问题。当我想在分析中使用滞后时,我倾向于考虑为我需要的每个滞后添加新变量。但是,我发现对于我们在时间序列中使用的大多数 R 函数,它具有处理滞后的能力,并且您会在函数中找到滞后数作为选项。因此,您需要的只是原始变量以及代表时间序列的日期。
【参考方案1】:
你去吧:这个功能可以让你在需要时获得你的系列的滞后版本。 ('比我找到的将同一系列的每个滞后副本存储在 10 个不同的列中更好)
lag.death = data.frame(series = floor(runif(10,0,100)));
lag.death$serie
lagit4me = function(serie,lag)
n = length(serie);
pad = rep(0,lag);
return(c(pad,serie)[1:n]);
lagit4me(lag.death$serie,1);
lagit4me(lag.death$serie,3);
'然后可以对其进行调整以允许负滞后等。
(但如果你真的需要它:)
allIn1 = lapply(0:10,lagit4me,serie=lag.death$series);
allIn1 = data.frame(allIn1);
names(allIn1) = 0:10;
allIn1
享受:)
【讨论】:
仅供参考,您不需要任何这些分号 不,我没有,'只是一种习惯。我喜欢看到我的说明结束 :) 谢谢。我确实需要将滞后存储为新变量。第二个代码块没有为我运行 - 尝试将 allIn1 分配为数据框会引发错误(参数暗示不同的行数) 这是因为我没有让lagit4me
能够检查滞后系列的最终长度,它必须始终是n
,但如果滞后很大,可能会更多。我今晚会添加这张支票,或者你可能会在之前这样做;)
给你(功能编辑),现在更好用了吗?【参考方案2】:
您也可以使用 purrr::map(),类似于上面的 lapply()。这使用 dplyr::lag(),而不是 lagit4me()
library(dplyr)
library(purrr)
num.lags <- 0:10
list.lags <-
purrr::map(
.x = num.lags,
.f = ~ dplyr::lag(series, .x)
)
注意,您需要命名列表元素以强制转换为 data_frame
chr.lags <- paste0("lag_", num.series.lags)
names(list.model.subset.lags) <- chr.lags
tbl.model.subset.lags <-
dplyr::bind_rows(list.model.subset.lags)
这会产生一个包含 11 个变量、输入变量 (lag_0) 和 10 个滞后变量(带有 NA)的 tbl
print(tbl.model.subset.lags)
【讨论】:
以上是关于如何创建多个不同的滞后的主要内容,如果未能解决你的问题,请参考以下文章
如何将此 postgresql 滞后语句移植到 mysql?
如何在 Python Pandas 回归模型中使用滞后时间序列变量?