Проблемы с опрокидыванием в уравнении регрессии - PullRequest
0 голосов
/ 28 сентября 2019

Я работаю с ежедневными данными о запасах и пытаюсь вычислить ежемесячные бета-версии в месяце t из ежедневных данных о запасах за период времени t-11 месяцев (например, бета в декабре включает ежедневные данные о запасах с января по декабрь включительно).Кроме того, я хочу включить минимум 150 наблюдений в уравнение регрессии. -> Ссылка на скриншот данных

Я хочу рассчитать бета-версию, рассчитав коэффициенты регрессии избыточной доходности акций на избыточную рыночную доходность за последние 12 месяцев.В моих примерах данных перечислены избыточные доходы каждой акции (акции классифицируются по номеру) и рыночная доходность mktrf в последнем столбце.

Я получил следующий код, но, к сожалению, не могу найти ошибку: Я использовал width = 252 за последние 12 месяцев в днях, но пока не включил в код обязательное условие минимум 150 наблюдений.У меня также есть проблемы с NA, когда акция была исключена из списка.Я искал на форуме, и я могу найти только тот же код, который у меня есть в ответах, поэтому я не знаю, что я делаю неправильно.

rollingbeta <- rollapply(joined_data,
                     width=252,
                     FUN = function(x) {
                       t = lm(formula=paste0(" ` ", x , " ` ~ mktrf"), data = x, na.rm=T);
                       return(t$coef) },
                     by.column=TRUE, 
                      align="right")

В идеале, я хочу получить выводв том же формате данных, что и моя входная таблица.

Есть идеи по этому поводу?Буду признателен за любую помощь!

Вот пример, созданный с помощью dput:

структура (список (дата = структура (с (16804, 16805, 16806, 16807, 16808, 16811,16812, 16813, 16814, 16815), класс = "Дата"), 10001 = с (NA, -0,0132978723404255, +0,0148247978436657, +0,0146082337317397, +0,0196335078534031, +0,0346598202824133, +0,0235732009925558, 0, -0,0145454545454544, -0,0172201722017221), 93436 =с (Н.А., 8.95215075422673e-05, -0,0196482119679542, -0,0154766252739225, -0,0215627173661025, -0,0149289099526067, +0,0101996632186674, -0,0460065723674811, +0,0293045779042485, -0,00577165583470751), mktrf = с (-0.0159, 0.0012, -0.0135, -0.0244, -0.0111,-6e-04, 0.0071, -0.0267, 0.0165, -0.0214)), row.names = c (NA, 10L), class = "data.frame")

1 Ответ

0 голосов
/ 28 сентября 2019

Я не могу прочитать ваши данные, но, используя BOD (который поставляется с R), мы выполняем скользящую регрессию, используя окно из 5 строк, или, если 5 строк недоступны, тогда используем количество доступных строк при условии, по крайней мере, 3строки доступны.Также мы проверяем, что есть как минимум 3 полных дела.

Мы делаем выше, используя вектор ширины, а не одну ширину.Этот вектор указывает, сколько строк использовать. Если доступно как минимум 5 строк, мы используем 5, а в противном случае используем количество доступных строк;однако, если количество доступных строк меньше 3, то мы используем 3, что приведет к созданию NA для этой строки.

В пределах coefs мы также проверяем, есть ли менее 3 завершенных случаев, и возвращаемNA, если да.

library(zoo)

n <- nrow(BOD)  # 6
w <- pmax(pmin(1:n, 5), 3)  # 3 3 3 4 5 5

coefs <- function(x) {
  if (sum(complete.cases(x)) >= 3) coef(lm(as.data.frame(x))) else c(NA, NA)
}
rollapplyr(BOD[2:1], w, coefs, by.column = FALSE, fill = NA)

дает:

     (Intercept)     Time
[1,]          NA       NA
[2,]          NA       NA
[3,]    1.833333 5.350000
[4,]    5.450000 3.180000
[5,]    7.750000 2.030000
[6,]   10.674324 1.301351

Это дает то же самое:

rbind(c(NA, NA), 
      c(NA, NA), 
      coefs(BOD[1:3, 2:1]), 
      coefs(BOD[1:4, 2:1]), 
      coefs(BOD[1:5, 2:1]), 
      coefs(BOD[2:6, 2:1]))

Обновление

Короче dputдобавленный вывод дал синтаксическую ошибку, но на этот раз он был достаточно коротким, чтобы я смог отредактировать его (см. примечание в конце) во что-то, что работает.

Мы используем ширину 8 или если доступно менее 8мы используем минимум 4, иначе мы возвращаем NA.Также мы используем как минимум 3 полных случая, если coefs.

Мы конвертируем DF в объект зоопарка и предполагаем, что последний (3-й столбец) является зависимой переменной, а два других столбца являются независимыми переменными.

library(zoo)

n <- nrow(DF)  # 10
w <- pmax(pmin(1:n, 8), 4)  #  [1] 4 4 4 4 5 6 7 8 8 8


coefs <- function(x) {
  if (sum(complete.cases(x)) >= 3) coef(lm(as.data.frame(x))) else c(NA, NA)
}

z <- read.zoo(DF)[, c(3, 1, 2)]
rollapplyr(z, w, coefs, by.column = FALSE, fill = NA)

давая этому объекту зоопарка:

            (Intercept)     `10001`    `93436`
2016-01-04           NA          NA         NA
2016-01-05           NA          NA         NA
2016-01-06           NA          NA         NA
2016-01-07 -0.031077046 -2.44567879 -2.7398798
2016-01-08 -0.034601587 -2.65028219 -3.2757924
2016-01-11  0.003069533  0.35951677  1.2452355
2016-01-12 -0.001737647  0.15052197  0.7341502
2016-01-13 -0.001773568  0.09143210  0.5979455
2016-01-14 -0.001173643  0.07543222  0.6164919
2016-01-15 -0.005337689  0.28461054  0.6305395

Примечание

DF <- structure(list(date = structure(c(16804, 16805, 16806, 16807, 
16808, 16811, 16812, 16813, 16814, 16815), class = "Date"), `10001` = c(NA, 
-0.0132978723404255, 0.0148247978436657, 0.0146082337317397, 
0.0196335078534031, 0.0346598202824133, 0.0235732009925558, 0, 
-0.0145454545454544, -0.0172201722017221), `93436` = c(NA, 8.95215075422673e-05, 
-0.0196482119679542, -0.0154766252739225, -0.0215627173661025, 
-0.0149289099526067, 0.0101996632186674, -0.0460065723674811, 
0.0293045779042485, -0.00577165583470751), mktrf = c(-0.0159, 
0.0012, -0.0135, -0.0244, -0.0111, -6e-04, 0.0071, -0.0267, 0.0165, 
-0.0214)), row.names = c(NA, 10L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...