滚动回归 4 年的每日数据,每个新回归和不同的因变量提前一个月
Roll regression for 4 years of daily data which moves one month ahead for each new regression and for different dependent variables
我有 5 个自变量(附加数据中的 B-F 列)和一些因变量(附加数据中的 G-M 列),我需要针对所有独立变量对每个因变量进行多元回归。回归必须有 4 年数据的 window,并且每个新估计都必须提前一个月。我需要提取系数并对每个系数进行 vasicek 调整(截距除外)。该调整只是:
adjustment of betas
数据看起来像
而整个数据是:
自变量放在 B-F 列中,因变量放在 G-M 列中。我一直在努力解决这个问题,并且构建了两部分代码。首先,我提取了每个因变量的回归系数,并根据 vasicek 调整对它们进行了调整,但没有使用手机 windows 我需要:
depvar <- c("LYB_UN_Equity" ,"AXP_UN_Equity", "VZ_UN_Equity", "AVGO_UW_Equity", "BA_UN_Equity", "CAT_UN_Equity", "JPM_UN_Equity")
regresults <- lapply(depvar, function(dv) {
tmplm <- lm(get(dv) ~ Mkt + SMB + HML + RMW + CMA, data=newdata
# ,subset=(Newdata$Fecha > "1996-01-01" & Newdata$Fecha < "1999-12-31"), na.action = na.exclude )
k=length(tmplm$cofficients)-1
SSE=sum(tmplm$residuals**2)
n=length(tmplm$residuals)
SE=sqrt(SSE/(n-(1-k))
coef(tmplm)*(summary(tmplm)$coef[,2]/SE+summary(tmplm)$coef[,2]) +coef(tmplm)*(SE/SE+summary(tmplm)$coef[,2])
})
allresults <- data.frame(depvar = depvar,
do.call(rbind, regresults))
names(allresults)[2] <- "intercept"
allresults}
它有效,但正如我所说,我需要滚动 windows 4 年的每日数据,每个新的估计都会提前一个月,所以我尝试使用嵌套 for 循环但它没有用:
for (j in 1:7) {
for (i in 1:length(newdata)) {
#try(
Model<-lm(newdata[seq(i,1056,24),j+6] ~ newdata[seq(i,1056,24), 2:6])
#, silent=T)
betas <- as.matrix(coefficients(Model))
}}
错误是:
Error in model.frame.default(formula = newdata[seq(i, 1056, 24), j + 6] ~ : invalid type (list) for variable 'newdata[seq(i, 1056, 24), j + 6]'
我是初学者,非常感谢您的帮助
问题中没有足够的数据 运行 4 年并且缺少因变量的值所以这里是一个使用 w
3 个月(而不是4 年)和一组简化的统计数据,可以通过更改输入和 reg
.
进行调整
请注意,yearmon class 将仅由年和月组成的日期存储为年 + 分数,其中分数 = 0、1/12、...、11/12 表示一月、二月、... 12月所以w个月间隔的长度是w/12.
library(zoo)
# inputs
set.seed(123)
ndata <- data.frame(date = as.Date("2000-01-01") + 0:365,
z = rnorm(366))
A <- sqrt(0:365)
B <- (0:365)^0.25
w <- 3 # number of trailing months to regress over
depvars <- c("A", "B")
indep <- c("date", "z")
reg <- function(ym_, depvar, indep, data, w, ym) {
ok <- ym > ym_ - w/12 & ym <= ym_
fo <- reformulate(indep, depvar)
fm <- lm(fo, data, subset = ok)
co <- coef(fm)
n <- nobs(fm)
c(co, n = n)
}
ym <- as.yearmon(ndata$date)
ym_u <- tail(unique(ym), -(w-1))
L <- Map(function(depvar) {
data.frame(yearmon = ym_u,
t(sapply(ym_u, reg,
depvar = depvar, indep = indep, data = ndata, w = w, ym = ym)),
check.names = FALSE)
}, depvars)
L
给出以下数据框列表,其中 yearmon 是执行回归的 w 个月期间最后一个月的年份和月份,n 是该期间的天数。
$A
yearmon (Intercept) date z n
1 Mar 2000 -931.0836 0.08520186 -3.783475e-02 91
2 Apr 2000 -645.7504 0.05930666 5.638294e-03 90
3 May 2000 -536.6141 0.04942836 3.528984e-03 92
4 Jun 2000 -468.3192 0.04326379 -6.769498e-03 91
5 Jul 2000 -420.6956 0.03897671 -7.307754e-05 92
6 Aug 2000 -384.5289 0.03573000 1.343427e-03 92
7 Sep 2000 -356.8805 0.03325475 -1.272157e-03 92
8 Oct 2000 -333.4633 0.03116400 1.980825e-03 92
9 Nov 2000 -314.3980 0.02946651 2.223839e-04 91
10 Dec 2000 -298.0596 0.02801567 -2.949753e-04 92
$B
yearmon (Intercept) date z n
1 Mar 2000 -206.66238 0.019006840 -7.802128e-03 91
2 Apr 2000 -110.66468 0.010294703 1.301456e-03 90
3 May 2000 -83.11581 0.007801199 8.920903e-04 92
4 Jun 2000 -67.34099 0.006377318 -1.520903e-03 91
5 Jul 2000 -57.03138 0.005449255 -1.435477e-05 92
6 Aug 2000 -49.58352 0.004780660 2.702669e-04 92
7 Sep 2000 -44.11908 0.004291454 -2.438281e-04 92
8 Oct 2000 -39.65054 0.003892493 3.683646e-04 92
9 Nov 2000 -36.12215 0.003578342 4.162776e-05 91
10 Dec 2000 -33.18009 0.003317091 -5.103712e-05 92
或者如果首选数据框,则:
dplyr::bind_rows(L, .id = "depvar")
给予:
depvar yearmon (Intercept) date z n
1 A Mar 2000 -931.08360 0.085201863 -3.783475e-02 91
2 A Apr 2000 -645.75036 0.059306657 5.638294e-03 90
3 A May 2000 -536.61413 0.049428357 3.528984e-03 92
4 A Jun 2000 -468.31918 0.043263786 -6.769498e-03 91
5 A Jul 2000 -420.69558 0.038976709 -7.307754e-05 92
6 A Aug 2000 -384.52887 0.035729997 1.343427e-03 92
7 A Sep 2000 -356.88052 0.033254748 -1.272157e-03 92
8 A Oct 2000 -333.46329 0.031163998 1.980825e-03 92
9 A Nov 2000 -314.39800 0.029466506 2.223839e-04 91
10 A Dec 2000 -298.05960 0.028015670 -2.949753e-04 92
11 B Mar 2000 -206.66238 0.019006840 -7.802128e-03 91
12 B Apr 2000 -110.66468 0.010294703 1.301456e-03 90
13 B May 2000 -83.11581 0.007801199 8.920903e-04 92
14 B Jun 2000 -67.34099 0.006377318 -1.520903e-03 91
15 B Jul 2000 -57.03138 0.005449255 -1.435477e-05 92
16 B Aug 2000 -49.58352 0.004780660 2.702669e-04 92
17 B Sep 2000 -44.11908 0.004291454 -2.438281e-04 92
18 B Oct 2000 -39.65054 0.003892493 3.683646e-04 92
19 B Nov 2000 -36.12215 0.003578342 4.162776e-05 91
20 B Dec 2000 -33.18009 0.003317091 -5.103712e-05 92
备注
我不清楚问题中统计计算的意图。我确实在 this document 第 8 页的顶部找到了公式,但它似乎与问题中提到的不同。无论如何,至少问题中的代码似乎需要对某些未平方的项目进行平方,并注意 coef(fm)
、sigma(fm)
和 diag(vcov(fm))
是系数,残差标准误差和系数标准误差平方。
我有 5 个自变量(附加数据中的 B-F 列)和一些因变量(附加数据中的 G-M 列),我需要针对所有独立变量对每个因变量进行多元回归。回归必须有 4 年数据的 window,并且每个新估计都必须提前一个月。我需要提取系数并对每个系数进行 vasicek 调整(截距除外)。该调整只是:
adjustment of betas
数据看起来像
而整个数据是:
自变量放在 B-F 列中,因变量放在 G-M 列中。我一直在努力解决这个问题,并且构建了两部分代码。首先,我提取了每个因变量的回归系数,并根据 vasicek 调整对它们进行了调整,但没有使用手机 windows 我需要:
depvar <- c("LYB_UN_Equity" ,"AXP_UN_Equity", "VZ_UN_Equity", "AVGO_UW_Equity", "BA_UN_Equity", "CAT_UN_Equity", "JPM_UN_Equity")
regresults <- lapply(depvar, function(dv) {
tmplm <- lm(get(dv) ~ Mkt + SMB + HML + RMW + CMA, data=newdata
# ,subset=(Newdata$Fecha > "1996-01-01" & Newdata$Fecha < "1999-12-31"), na.action = na.exclude )
k=length(tmplm$cofficients)-1
SSE=sum(tmplm$residuals**2)
n=length(tmplm$residuals)
SE=sqrt(SSE/(n-(1-k))
coef(tmplm)*(summary(tmplm)$coef[,2]/SE+summary(tmplm)$coef[,2]) +coef(tmplm)*(SE/SE+summary(tmplm)$coef[,2])
})
allresults <- data.frame(depvar = depvar,
do.call(rbind, regresults))
names(allresults)[2] <- "intercept"
allresults}
它有效,但正如我所说,我需要滚动 windows 4 年的每日数据,每个新的估计都会提前一个月,所以我尝试使用嵌套 for 循环但它没有用:
for (j in 1:7) {
for (i in 1:length(newdata)) {
#try(
Model<-lm(newdata[seq(i,1056,24),j+6] ~ newdata[seq(i,1056,24), 2:6])
#, silent=T)
betas <- as.matrix(coefficients(Model))
}}
错误是:
Error in model.frame.default(formula = newdata[seq(i, 1056, 24), j + 6] ~ : invalid type (list) for variable 'newdata[seq(i, 1056, 24), j + 6]'
我是初学者,非常感谢您的帮助
问题中没有足够的数据 运行 4 年并且缺少因变量的值所以这里是一个使用 w
3 个月(而不是4 年)和一组简化的统计数据,可以通过更改输入和 reg
.
请注意,yearmon class 将仅由年和月组成的日期存储为年 + 分数,其中分数 = 0、1/12、...、11/12 表示一月、二月、... 12月所以w个月间隔的长度是w/12.
library(zoo)
# inputs
set.seed(123)
ndata <- data.frame(date = as.Date("2000-01-01") + 0:365,
z = rnorm(366))
A <- sqrt(0:365)
B <- (0:365)^0.25
w <- 3 # number of trailing months to regress over
depvars <- c("A", "B")
indep <- c("date", "z")
reg <- function(ym_, depvar, indep, data, w, ym) {
ok <- ym > ym_ - w/12 & ym <= ym_
fo <- reformulate(indep, depvar)
fm <- lm(fo, data, subset = ok)
co <- coef(fm)
n <- nobs(fm)
c(co, n = n)
}
ym <- as.yearmon(ndata$date)
ym_u <- tail(unique(ym), -(w-1))
L <- Map(function(depvar) {
data.frame(yearmon = ym_u,
t(sapply(ym_u, reg,
depvar = depvar, indep = indep, data = ndata, w = w, ym = ym)),
check.names = FALSE)
}, depvars)
L
给出以下数据框列表,其中 yearmon 是执行回归的 w 个月期间最后一个月的年份和月份,n 是该期间的天数。
$A
yearmon (Intercept) date z n
1 Mar 2000 -931.0836 0.08520186 -3.783475e-02 91
2 Apr 2000 -645.7504 0.05930666 5.638294e-03 90
3 May 2000 -536.6141 0.04942836 3.528984e-03 92
4 Jun 2000 -468.3192 0.04326379 -6.769498e-03 91
5 Jul 2000 -420.6956 0.03897671 -7.307754e-05 92
6 Aug 2000 -384.5289 0.03573000 1.343427e-03 92
7 Sep 2000 -356.8805 0.03325475 -1.272157e-03 92
8 Oct 2000 -333.4633 0.03116400 1.980825e-03 92
9 Nov 2000 -314.3980 0.02946651 2.223839e-04 91
10 Dec 2000 -298.0596 0.02801567 -2.949753e-04 92
$B
yearmon (Intercept) date z n
1 Mar 2000 -206.66238 0.019006840 -7.802128e-03 91
2 Apr 2000 -110.66468 0.010294703 1.301456e-03 90
3 May 2000 -83.11581 0.007801199 8.920903e-04 92
4 Jun 2000 -67.34099 0.006377318 -1.520903e-03 91
5 Jul 2000 -57.03138 0.005449255 -1.435477e-05 92
6 Aug 2000 -49.58352 0.004780660 2.702669e-04 92
7 Sep 2000 -44.11908 0.004291454 -2.438281e-04 92
8 Oct 2000 -39.65054 0.003892493 3.683646e-04 92
9 Nov 2000 -36.12215 0.003578342 4.162776e-05 91
10 Dec 2000 -33.18009 0.003317091 -5.103712e-05 92
或者如果首选数据框,则:
dplyr::bind_rows(L, .id = "depvar")
给予:
depvar yearmon (Intercept) date z n
1 A Mar 2000 -931.08360 0.085201863 -3.783475e-02 91
2 A Apr 2000 -645.75036 0.059306657 5.638294e-03 90
3 A May 2000 -536.61413 0.049428357 3.528984e-03 92
4 A Jun 2000 -468.31918 0.043263786 -6.769498e-03 91
5 A Jul 2000 -420.69558 0.038976709 -7.307754e-05 92
6 A Aug 2000 -384.52887 0.035729997 1.343427e-03 92
7 A Sep 2000 -356.88052 0.033254748 -1.272157e-03 92
8 A Oct 2000 -333.46329 0.031163998 1.980825e-03 92
9 A Nov 2000 -314.39800 0.029466506 2.223839e-04 91
10 A Dec 2000 -298.05960 0.028015670 -2.949753e-04 92
11 B Mar 2000 -206.66238 0.019006840 -7.802128e-03 91
12 B Apr 2000 -110.66468 0.010294703 1.301456e-03 90
13 B May 2000 -83.11581 0.007801199 8.920903e-04 92
14 B Jun 2000 -67.34099 0.006377318 -1.520903e-03 91
15 B Jul 2000 -57.03138 0.005449255 -1.435477e-05 92
16 B Aug 2000 -49.58352 0.004780660 2.702669e-04 92
17 B Sep 2000 -44.11908 0.004291454 -2.438281e-04 92
18 B Oct 2000 -39.65054 0.003892493 3.683646e-04 92
19 B Nov 2000 -36.12215 0.003578342 4.162776e-05 91
20 B Dec 2000 -33.18009 0.003317091 -5.103712e-05 92
备注
我不清楚问题中统计计算的意图。我确实在 this document 第 8 页的顶部找到了公式,但它似乎与问题中提到的不同。无论如何,至少问题中的代码似乎需要对某些未平方的项目进行平方,并注意 coef(fm)
、sigma(fm)
和 diag(vcov(fm))
是系数,残差标准误差和系数标准误差平方。