1

我有一个 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).

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

换句话说,它从具有设置窗口 t+k 的起点进行迭代,其中 k 是某个预先指定的窗口长度,并在该特定窗口长度上迭代地应用 lm 函数。

我试过像这样使用 lapply:

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

但是,我收到以下错误:

r[x, ] 中的错误:维数不正确

如果我删除 [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 是否在欺骗我,或者我的代码是否有问题。

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

4

1 回答 1

1

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

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)

})
于 2017-06-24T10:21:18.890 回答