如何从滚动回归中提取残差标准误差
How to extract te residual standard error from rolling regressions
我正在尝试获取滚动回归的残差标准差(R 摘要中的残差标准误差)。我正在尝试对总共 4000 天的 20 天股票 return 进行滚动回归。我可以做滚动回归,我可以从常规 lm 回归中得到残差标准差,但不能用于滚动回归。
我的数据类似于下面的,其中数据框有多个股票的 returns,向量是一个索引 return:
data<-as.data.frame(matrix(rexp(20000, rate=.1), ncol=20))
vector<-rexp(1000,rate=0.1)
我可以为 lm 回归生成 sigma:sigma(lm(data$V1~vector))
我可以使用 library(roll)
和 roll_lm(vector,data$V1,width=20)
以及 library(rollRegres)
和 roll_regres(data$V1~vector,width=20)
生成滚动回归
有没有办法从这种滚动回归中得到残差标准误差/残差标准差/西格玛?
我想得到一个只包含残差标准差的数据框。
谢谢!
如果您阅读 summary.lm 的代码,残差标准误差是残差平方和 (rss) / 残差自由度 (rdf) 的平方根。由于 roll_lm 不保留它,您需要使用系数来获得预测并再次计算:
data<-as.data.frame(matrix(rexp(20000, rate=.1), ncol=20))
vector<-rexp(1000,rate=0.1)
library(roll)
WI = 20
rlm = roll_lm(vector,data$V1,width=WI)
rdf = WI - ncol(rlm$coefficients)
下面我们遍历每个 window,得到预测并计算 rss,然后从那里得到 sigma:
sigma = sapply(1:(nrow(data)-WI+1),function(i){
# basically intercept + predictor * coef
pred = cbind(rep(1,WI),vector[i:(i+WI-1)]) %*% rlm$coefficients[WI+i-1,]
rss = sum((data$V1[i:(i+WI-1)] - pred)^2)
sqrt(rss/rdf)
})
我们可以将其包装在一个函数中,该函数将 x,y 作为输入:
roll_w_sigm = function(x,y,WI=20){
rlm = roll_lm(x=vector,y=y,width=WI)
rdf = WI - ncol(rlm$coefficients)
rlm$sigma = sapply(1:(length(y)-WI+1),function(i){
pred = cbind(rep(1,WI),vector[i:(i+WI-1)]) %*% rlm$coefficients[WI+i-1,]
rss = sum((y[i:(i+WI-1)] - pred)^2)
sqrt(rss/rdf)
})
rlm
}
对于 1 列:
res = roll_w_sigm(vector,data$V1)
head(res$sigma)
[1] 9.102188 9.297425 9.324338 9.509460 7.849201 7.993087
对于所有列:
lapply(data,function(i)roll_w_sigm(vector,i))
我正在尝试获取滚动回归的残差标准差(R 摘要中的残差标准误差)。我正在尝试对总共 4000 天的 20 天股票 return 进行滚动回归。我可以做滚动回归,我可以从常规 lm 回归中得到残差标准差,但不能用于滚动回归。 我的数据类似于下面的,其中数据框有多个股票的 returns,向量是一个索引 return:
data<-as.data.frame(matrix(rexp(20000, rate=.1), ncol=20))
vector<-rexp(1000,rate=0.1)
我可以为 lm 回归生成 sigma:sigma(lm(data$V1~vector))
我可以使用 library(roll)
和 roll_lm(vector,data$V1,width=20)
以及 library(rollRegres)
和 roll_regres(data$V1~vector,width=20)
有没有办法从这种滚动回归中得到残差标准误差/残差标准差/西格玛?
我想得到一个只包含残差标准差的数据框。
谢谢!
如果您阅读 summary.lm 的代码,残差标准误差是残差平方和 (rss) / 残差自由度 (rdf) 的平方根。由于 roll_lm 不保留它,您需要使用系数来获得预测并再次计算:
data<-as.data.frame(matrix(rexp(20000, rate=.1), ncol=20))
vector<-rexp(1000,rate=0.1)
library(roll)
WI = 20
rlm = roll_lm(vector,data$V1,width=WI)
rdf = WI - ncol(rlm$coefficients)
下面我们遍历每个 window,得到预测并计算 rss,然后从那里得到 sigma:
sigma = sapply(1:(nrow(data)-WI+1),function(i){
# basically intercept + predictor * coef
pred = cbind(rep(1,WI),vector[i:(i+WI-1)]) %*% rlm$coefficients[WI+i-1,]
rss = sum((data$V1[i:(i+WI-1)] - pred)^2)
sqrt(rss/rdf)
})
我们可以将其包装在一个函数中,该函数将 x,y 作为输入:
roll_w_sigm = function(x,y,WI=20){
rlm = roll_lm(x=vector,y=y,width=WI)
rdf = WI - ncol(rlm$coefficients)
rlm$sigma = sapply(1:(length(y)-WI+1),function(i){
pred = cbind(rep(1,WI),vector[i:(i+WI-1)]) %*% rlm$coefficients[WI+i-1,]
rss = sum((y[i:(i+WI-1)] - pred)^2)
sqrt(rss/rdf)
})
rlm
}
对于 1 列:
res = roll_w_sigm(vector,data$V1)
head(res$sigma)
[1] 9.102188 9.297425 9.324338 9.509460 7.849201 7.993087
对于所有列:
lapply(data,function(i)roll_w_sigm(vector,i))