Выполнить множественную регрессию с разными столбцами - PullRequest
0 голосов
/ 30 апреля 2018

Как я могу сделать множественную скользящую регрессию с y1 как зависимой и y2, y3 и т.д. как независимыми переменными в отдельных регрессиях:

См. Пример ниже:

library(xts)

df=data.frame(y1=rnorm(300),y2=rnorm(300),y3=rnorm(300),y4=rnorm(300),y5=rnorm(300),y6=rnorm(300))
data <- xts(df, Sys.Date()-300:1)

Ниже я делаю скользящую корреляцию y1 по y2

rollingb <- rollapply(zoo(data),
                          width=20,
                          FUN = function(Z)
                          {
                            t = lm(formula=y1~ y2, data = as.data.frame(Z), na.rm=T);
                            return(t$coef)
                          },
                          by.column=FALSE, align="right")

результат выглядит хорошо

plot(rollingb)

Однако теперь я хочу протестировать y1 ~ y3, y1 ~ y4 и т. Д. (У меня всего набор данных из 120 столбцов)

следующий пост был близок, но я не смог воспроизвести кодировку:

https://stackoverflow.com/questions/39438484/r-how-to-do-rolling-regressions-for-multiple-return-data-at-once-with-the-depe

Как настроить rollb , чтобы выполнить работу?

Предоставленное решение @Yannis Vassiliadis работает, однако возникает следующий вопрос: как правильно вывести все коэффициенты (бета-версии) в матрицу / data.frame с соответствующими датами (как в xts)?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы можете использовать map из purrr, чтобы построить список формул по линиям y1 ~ y2 и y1 ~ y3. Затем используйте каждую из этих формул в lm.

# these are the packages we are using
library(purrr)
library(useful)
library(coefplot)

# here's your data
df=data.frame(y1=rnorm(300),y2=rnorm(300),y3=rnorm(300),y4=rnorm(300),y5=rnorm(300),y6=rnorm(300))

# keep track of the response variable
response <- 'y1'
# we'll assume all the other variables are predictors
predictors <- setdiff(names(df), response)

# fit a bunch of models
models <- predictors %>% 
    # for each predictor build a formula like y1 ~ y2
    map(~build.formula(response, .x)) %>% 
    # for each of those fit a model
    map(lm, data=df)

# plot them for good measure
multiplot(models)
0 голосов
/ 30 апреля 2018

Как насчет этого?

roll_lm <- lapply(2:ncol(data), function(x) rollapply(zoo(data[, c(1, x)]),
                          width=20,
                          FUN = function(Z)
                          { Z = as.data.frame(Z);
                            t = lm(formula=Z[, 1]~Z[, 2]);
                            return(t$coef)
                          },
                          by.column=FALSE, align="right"))

Вывод представляет собой список с ncol(data) - 1 элементами, где элемент ith является результатом скользящей регрессии y1 на yi.

Также вы можете добавить:

names(roll_lm) <- paste0("y1~y",2:6) 
roll_lm2 <- plyr::rbind.fill.matrix(roll_lm) 
roll_lm3 <- cbind(roll_lm2, rep(names(roll_lm), each = 281)) # just to keep track of the names
...