2017-08-29 72 views
2

餵我目前工作的一個迴歸分析用下面的代碼:R /滾動迴歸與擴展數據幀

for (i in 1:ncol(Ret1)){ 
    r2.out[i]=summary(lm(Ret1[,1]~Ret1[,i]))$r.squared 
} 
r2.out 

此代碼運行每個列的簡單OLS迴歸在數據幀agianst第一列並提供這些迴歸的R^2。 在時刻處,迴歸使用列中的所有數據點。 我需要現在是代碼,而不是使用列中的所有數據點只是使用數據點的滾動窗口。所以他計算了30天內R^2在整個時間幀內的滾動窗口。輸出是一個Matrix,每個(1,i)對的每個滾動窗口都有R^2。

此代碼將軋製迴歸一部分,但不會使迴歸爲每個(1,i)的對。

dolm <- function(x) summary(lm(Ret1[,1]~Ret1[,i]))$r.squared 
     rollapplyr(Ret1, 30, dolm, by.column = FALSE) 

我真的很感謝您可以提供任何幫助。

回答

1

使用內置anscombe數據幀,我們退步y1柱對x1然後x2,等我們使用的3這裏的寬度用於說明目的。

xnames應設置爲變量x的名字。在anscombe數據集中,以x開頭的列名稱是x變量。作爲另一個例子,如果所有的列都是除第一個以外的x個變量,則可以使用xnames <- names(DF)[-1]

我們定義的R平方函數,rsq這需要索引使用,ix和x變量名xname。然後我們sapply超過xnames和每個rollapply超過索引1:n

library(zoo) 

xnames <- grep("x", names(anscombe), value = TRUE) 
n <- nrow(anscombe) 
w <- 3 
rsq <- function(ix, xname) summary(lm(y1 ~., anscombe[c("y1", xname)], subset = ix))$r.sq 
sapply(xnames, function(xname) rollapply(1:n, w, rsq, xname = xname)) 

給出尺寸的以下結果N - W + 1中由長度(xnames):

   x1   x2   x3  x4 
[1,] 2.285384e-01 2.285384e-01 2.285384e-01 0.0000000 
[2,] 3.591782e-05 3.591782e-05 3.591782e-05 0.0000000 
[3,] 9.841920e-01 9.841920e-01 9.841920e-01 0.0000000 
[4,] 5.857410e-01 5.857410e-01 5.857410e-01 0.0000000 
[5,] 9.351609e-01 9.351609e-01 9.351609e-01 0.0000000 
[6,] 8.760332e-01 8.760332e-01 8.760332e-01 0.7724447 
[7,] 9.494869e-01 9.494869e-01 9.494869e-01 0.7015512 
[8,] 9.107256e-01 9.107256e-01 9.107256e-01 0.3192194 
[9,] 8.385510e-01 8.385510e-01 8.385510e-01 0.0000000 

變化

1)也將是可以顛倒的順序rollapplysapply取代最後一行代碼:

rollapply(1:n, 3, function(ix) sapply(xnames, rsq, ix = ix)) 

2)另一種方法是用以下單個語句替換rsq和sapply/rollapply行的定義。它可能有點難以閱讀,所以你可能更喜歡第一種解決方案,但它確實需要一個簡化 - 即xname不再需要內部匿名函數的明確參數(取代上面的):

sapply(xnames, function(xname) rollapply(1:n, 3, function(ix) 
    summary(lm(y1 ~., anscombe[c("y1", xname)], subset = ix))$r.sq)) 

更新:有固定的線路現在是n <- nrow(anscombe)