在 R 中一起使用 lapply 和 lm 函数

Using lapply and the lm function together in R

我有一个df如下:

   t         r
1   0 100.00000
2   1 135.86780
3   2 149.97868
4   3 133.77316
5   4  97.08129
6   5  62.15988
7   6  50.19177

等等...

我想使用 lm(r~t) 应用滚动回归。

但是,我想为每次迭代估计一个模型,其中迭代发生在设定的时间 window t+k。本质上,第一个模型应该用 t=0,t=1,...t=5 估计,如果 k = 5,第二个模型用 t=1, t=2,...,t=6 估计,依此类推。

换句话说,它从一个集合 window t+k 开始迭代,其中 k 是一些预先指定的 window 长度,并将 lm 函数应用于该特定 window 迭代长度。

我试过这样使用 lapply:

mdls = lapply(df, function(x) lm(r[x,]~t))

但是,我收到以下错误:

Error in r[x, ] : incorrect number of dimensions

如果我删除 [x,],每次迭代都会给我相同的模型,换句话说,使用所有观察值。

如果我使用 rollapply:

coefs = rollapply(df, 3, FUN = function(x) coef(lm(r~t, data = 
as.data.frame(x))), by.column = FALSE, align = "right")

res = rollapply(df, 3, FUN = function(z) residuals(lm(r~t, data = 
as.data.frame(z))), by.column = FALSE, align = "right")

其中:

 t = seq(0,15,1)
 r = (100+50*sin(0.8*t))
 df = as.data.frame(t,r)

我有 15 个模型,但它们都是在整个数据集上估计的,提供相同的截距和系数。这很奇怪,因为我设法让 rollapply 在新脚本中测试它之前工作。由于某种原因它不再起作用,所以我很困惑是 R 是在耍我,还是我的代码有问题。

如何调整这些方法以确保它们按照我的意愿进行迭代?

我附上了一个可能的解决方案。这个想法是在函数 rollapply 中使用向量 1: nrow (df) 来指示我们想要 select.

的行
df = data.frame(t = 0:6, r = c(100.00000, 135.86780, 149.97868, 133.77316, 97.08129, 62.15988, 50.19177))
N = nrow(df)

require(zoo)

# Coefficients
coefs <- rollapply(data = 1:N, width = 3, FUN = function(x){

  r = df$r[x]
  t = df$t[x]

  out <- coef(lm(r~t))

  return(out)

})

# Residuals
res <- rollapply(data = 1:N, width = 3, FUN = function(x){

  r = df$r[x]
  t = df$t[x]

  out <- residuals(lm(r~t))

  return(out)

})