2017-06-24 63 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

謝謝你的評論:) –