Скользящая регрессия с расширяющимся окном - PullRequest
0 голосов
/ 03 марта 2020

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

Например, в приведенном ниже кадре данных я хотел бы извлечь коэффициенты lm (return ~ regress1 + regress 2), сгруппированные по категории K, используя все строки до интересующей строки. Таким образом, для строки 2 набор данных для регрессии будет строками 1: 2, для строки 3 будет строками 1: 3, для строки 4 будет просто строка 4, поскольку это первая строка с категориальной переменной K = B.

myinput <- data.frame(K = c("A", "A", "A", "B", "B", "B", "C", "C", "C"), 
                      date = c(1:3) , return = rnorm(9), regress1 = rnorm(9), regress2 = rnorm(9))

Я нашел очень полезную тему по этой теме c здесь: Скользящая регрессия с расширяющимся окном в R , но мне трудно применить ее к моему набору данных.

Если бы кто-нибудь мог помочь мне понять, как мне нужно адаптировать подход, который они использовали, это было бы очень признательно. Благодаря.

1 Ответ

1 голос
/ 03 марта 2020

Используя myinput, который воспроизводимо показан в примечании в конце, определите функцию reg для выполнения регрессии. Затем используйте rollapplyr с аргументом width, равным date, используя тот факт, что date равно 1, 2, 3 и т. Д. c. внутри группы и т. д. равно количеству строк для регрессии. Наконец, cbind результат возвращается к исходному фрейму данных.

library(zoo)

reg <- function(x) coef(lm(as.data.frame(x)))

r <- rollapplyr(zoo(myinput[3:5]), myinput$date, reg, by.column=FALSE, coredata=FALSE)
cbind(myinput, coef = coredata(r))

, дающий:

  K date      return   regress1   regress2 coef.(Intercept) coef.regress1 coef.regress2
1 A    1 -0.56047565 -0.4456620  0.7013559      -0.56047565            NA            NA
2 A    2 -0.23017749  1.2240818 -0.4727914      -0.47231761     0.1978137            NA
3 A    3  1.55870831  0.3598138 -1.0678237       0.15985654    -0.9479906    -1.6294374
4 B    1  0.07050839  0.4007715 -0.2179749       0.07050839            NA            NA
5 B    2  0.12928774  0.1106827 -1.0260044       0.15171486    -0.2026254            NA
6 B    3  1.71506499 -0.5558411 -0.7288912       1.05050327    -2.0789081     0.6735997
7 C    1  0.46091621  1.7869131 -0.6250393       0.46091621            NA            NA
8 C    2 -1.26506123  0.4978505 -1.6866933      -1.93165311     1.3389399            NA
9 C    3 -0.68685285 -1.9666172  0.8377870      -0.14625482     0.6376389     0.8515213

Примечание

set.seed необходимо использовать до использования случайного данные для того, чтобы сделать результат воспроизводимым. Мы использовали это:

set.seed(123)
myinput <- data.frame(K = c("A", "A", "A", "B", "B", "B", "C", "C", "C"), 
  date = 1:3, return = rnorm(9), regress1 = rnorm(9), regress2 = rnorm(9))
...