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