Улучшение моей OLS Rolling регрессии с lapply - PullRequest
0 голосов
/ 11 ноября 2018

Это код моей скользящей регрессии:

# betas from rolling regression will be in betas_rolling_250 matrix
fixed.window<-30
models<-c("A~B+E","A~B+C","A~B+D","A~B+C","A~B+F","A~B+B","A~B+F","A~B+C")
betas_rolling_250<-matrix(,nrow=length(models),ncol=250-fixed.window)
rownames(betas_rolling_250)<-models;

#Sample Matrix

sample_matrix_250<-matrix(rexp(10, rate=.1),nrow=250, ncol=6)
colnames(sample_matrix_250)<-c("A","B","C","D","E","F")

for(i in 1:(length(sample_matrix_250[,1])-fixed.window)){
  for(k in 1:length(rownames(betas_rolling_250))){
    coefs<-lm(rownames(betas_rolling_250)[k],data=as.data.frame(sample_matrix_250[(221-i):(251-i),]))$coefficients[3]
    betas_rolling_250[k,i]<-coefs }
}

Первый вопрос:

Возможно ли реализовать это с помощью функции lapply?

Я спрашиваю об этом, потому что мне придется сделать это 4 раза. Потому что у меня больше 4-х разных размеров: (sample_matrix_220, sample_matrix_200 и sample_matrix_180). Я не хочу, чтобы мой код был огромным.

Я думал об использовании списка. Вот почему я думал о функции lapply.

Возможно ли это?

1 Ответ

0 голосов
/ 11 ноября 2018

Рассмотрите возможность обобщения вашей настройки, передав единственную измененную переменную, размер столбца матрицы, в качестве входного параметра. Затем прошёл список числовых значений в вызове lapply.

Ниже заменяет любые 250 на переменные (корректируйте по мере необходимости). Статические модели и fixed.window должны назначаться один раз за пределы функции.

get_coeffs <- function(mat_size) {
    betas_rolling <- matrix(,nrow=length(models), ncol=mat_size-fixed.window)
    rownames(betas_rolling) <- models

    sample_matrix <- matrix(rexp(10, rate=.1), nrow=mat_size, ncol=6)
    colnames(sample_matrix) <- LETTERS[1:6]

    for(i in 1:(length(sample_matrix[,1])-fixed.window)){
       for(k in 1:length(rownames(betas_rolling))){
          coefs <- lm(rownames(betas_rolling)[k],
                      as.data.frame(sample_matrix[(mat_size-fixed.window)-i):(mat_size+1-i),]))$coefficients[3]
          betas_rolling[k,i] <- coefs 
       }
    }

    return(betas_rolling)
}

matrix_list <- lapply(c(180, 200, 220, 250), get_coeffs)
...