我有一个变量被认为是另一个变量的良好预测因子,但有一些滞后性。我不知道这个滞后的变量是什么,想从数据中估计它。
下面是一个例子。
library(tidyverse)
data <- tibble(
id = 1:100,
y = dnorm(1:100, 30, 20) * 1000,
x.shifted = y / 10 + runif(100) / 10,
x.actual = lag(x.shifted, 30)
)
data %>%
ggplot(aes(id, x.shifted)) +
geom_point() +
geom_point(aes(id, x.actual), color = 'blue') +
geom_point(aes(id, y), color = 'red')
这个模型 lm(y ~ x.actual, data)
会不太合适,但该模型 lm(y ~ x.shifted, data)
会是。在这里,我知道x一定是偏移了-30天,但是想象一下,我不知道,我只知道它在-30和+30之间。
我想到的直接方法是运行61个回归模型,从将x移位-30天的模型到将其移位+30天的模型,然后选择AIC或BIC最好的模型。然而,(a)这是否是正确的方法,(b)是否有R包已经可以做到这一点,并找到最佳的滞后?
你所描述的是 交叉相关 的两个变量。在R中,你可以很容易地用 ccf
.
然而,如果只是为了获得最佳滞后,我们可以简化为一个单行本,利用 sapply
以将所需的滞后数输入到该系统中。cor
函数,然后使用 which.max
来寻找最高的相关性。
which.max(sapply(1:50, function(i) cor(data$x.actual, lag(data$y, i), use = "complete")))
#> [1] 30