Используя 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))