Как сохранить результаты регрессии из цикла for в списке под уникальным именем?

Я запускаю квантильные регрессии с несколькими скользящими окнами для данных о запасах, так что результирующий результат представляет собой файл xts с коэффициентами, оцениваемыми в каждый момент времени. Окончательные оценки затем аппроксимируются из квантилей. Затем 5 регрессий объединяются в цикл с использованием аргумента for для всех моих акций.

Что я пытаюсь сделать? Мне нужно зациклить и сохранить выходные данные xts, которые выглядят так, как показано ниже, в списке и под уникальным именем, чтобы я мог использовать их позже на следующем этапе моей методологии. .

           (Intercept)      rmrf        smb         hml        rmw        cma
2015-05-21 -0.001070362 0.9647046 -0.1206183 -0.05204882 0.01866969 -0.0361021
2015-05-22 -0.001070362 0.9647046 -0.1206183 -0.05204882 0.01866969 -0.0361021
2015-05-26 -0.001070362 0.9647046 -0.1206183 -0.05204882 0.01866969 -0.0361021
2015-05-27 -0.001070362 0.9647046 -0.1206183 -0.05204882 0.01866969 -0.0361021
2015-05-28 -0.001070362 0.9647046 -0.1206183 -0.05204882 0.01866969 -0.0361021
2015-05-29 -0.001070362 0.9647046 -0.1206183 -0.05204882 0.01866969 -0.0361021

Моя проблема возникает в конце, когда я хочу сохранить свой результат в списке. Это происходит потому, что я хочу, чтобы имя набора данных совпадало с именем столбца, для которого я выполняю регрессию.

Код был упрощен до одной регрессии. Моя лучшая попытка решить это ниже:

testlist <- list()

    for(i in 1:ncol(stocks) {

stock_data <- stocks[,i]


 # merge data together 
    regression_input <- merge(stock_data, rmrf, smb, hml, rmw, cma, rf)
    #rename 
    colnames(regression_input) = c("stock_returns" , "rmrf" , "smb" , "hml" , "rmw" , "cma" , "rf")

        quantile005 <- as.xts(                 
            rollapply(zoo(regression_input),
                      width=200,
                      FUN = function(Z) 
                      { 
                        t = rq(stock_returns ~ rmrf + smb + hml + rmw + cma, tau=0.05, data = as.data.frame(Z),
                               method="br", model = TRUE); 
                        return(t$coef) 
                      },
                      by.column=FALSE, align="right")
              )

    final_estimators <- # additional calculations are performed with results stored here 

#save
name <-  paste(rownames(i), sep = "")
testlist[[name]] <- final_estimators
}

Кроме того: эта команда, похоже, не читает имя моей строки, даже если она находится вне цикла.

> name <-  paste(rownames(return_data[,1]), sep = "")
> name
character(0)
> 

ИЗМЕНИТЬ РЕШЕНИЕ

Похоже, решение уже было для меня. проблема заключалась в том, что функция colnames извлекает имена только из объекта dataframe. вот окончательная версия кода.

# Create list to store dataframes


testlist <- list()


# Loop over entire regression methodology 


for(i in 1:ncol(test_3_stocks)) {

  # Get regression input together
  stock_data <- test_3_stocks[,i] - ff_data[,7]/100
  regression_input <- merge(stock_data, rmrf, smb, hml, rmw, cma, rf)
  colnames(regression_input) = c("stock_returns" , "rmrf" , "smb" , "hml" , "rmw" , "cma" , "rf")

  #Rolling window regression -  Quantile coefficients data

  quantile005 <- as.xts( 

    rollapply(zoo(regression_input),
              width=200,
              FUN = function(Z) 
              { 
                t = rq(stock_returns ~ rmrf + smb + hml + rmw + cma, tau=0.05, data = as.data.frame(Z),
                       method="br", model = TRUE); 
                return(t$coef) 
              },
              by.column=FALSE, align="right")
  )
  print(tail(summary(quantile005)))

  tmp <- summary(quantile005)

  name <- colnames(as.data.frame(test_3_stocks[,i]))
  testlist[[name]] <- tmp

}

Конечный результат:

> tail(testlist$TEST1)
           (Intercept)       rmrf      smb      hml      rmw       cma
2015-05-21    1255.853   -7.16453 531.4655 1870.740 1422.398 -4034.082
2015-05-22    1256.221  -40.88781 512.3803 1700.796 1569.501 -3830.814
2015-05-26    1256.413 -152.42752 713.5793 1754.086 1452.681 -3771.936
2015-05-27    1256.707   15.39627 451.2127 1568.405 1246.730 -3665.781
2015-05-28    1257.893 -133.72554 705.0280 1816.560 1232.326 -4188.772
2015-05-29    1258.239 -148.11936 624.4424 1837.348 1098.122 -4301.114

person Alex Bădoi    schedule 23.08.2015    source источник


Ответы (2)


Так близко! Вы правильно изолировали часть кода, которая неправильно устанавливает имя:

name <- paste(rownames(return_data[,1]), sep = "")

Предполагая, что return_data выглядит как data.frame, который вы указали в верхней части своего поста, где имена строк являются датами, как в 2015-05-21, тогда это простая настройка:

name <- row.names(return_data)[i]
person aaryno    schedule 23.08.2015
comment
действительно очень близко! Я увидел ваш ответ, как только закончил свое последнее редактирование. спасибо за ваш ответ. работает в настоящее время. - person Alex Bădoi; 23.08.2015

Вы имеете в виду, что вам нужно объединить данные с одинаковыми именами строк? вы можете использовать функцию слияния (a, b, by = rownames (a))
Если вы хотите сохранить свои имена строк, вы можете сохранить их в одну конкретную переменную, а затем применить ее в окончательных кадрах данных.

(Перехват) означает, что вы не давали ему имени при выполнении регрессии, и это тоже имя.

person adamtongji    schedule 23.08.2015
comment
Привет, adamtongji, мне нужно временно сохранить название акции в цикле, а затем назвать файл данных этим именем, когда он будет помещен в список (позже мне нужно иметь возможность вызывать этот набор данных по этому имени из списка). Я думаю, что хранение 1000 наименований акций в векторе и вызов каждого из них 1 на 1, как я делаю регрессию, было бы более обратным способом позаботиться о моем прабломе, чем просто вызов его из i-й части цикла. Набор данных, содержащий мои выходные данные регрессии, отличается от набора данных в векторе regression_input, который содержит только возвращаемые данные. - person Alex Bădoi; 23.08.2015