2017-06-24 65 views
0

在一起我​​有一个DF如下:使用lapply和LM功能中的R

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估计,如果k = 5,第二个模型t=1, t=2,...,t=6估计,依此类推。

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

我一直在使用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是否在玩弄我,或者我的代码有什么问题。

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

回答

0

我附上一个可能的解决方案。这个想法是在函数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) 

}) 
+0

非常感谢您! 此外,仅供参考,我注意到,我在我的问题有一个重要的(但愚蠢的)错误。本质上,我写了as.data.frame(t,r)而不是data.frame(t,r),因此只有一个r的向量而不是几个观察值。 通过改变这个错误,我设法得到不同的系数和残差。 无论如何,感谢很多的解决方案,它看起来非常整洁,很容易遵循。 =) – Mattia

+0

谢谢你的评论:) –