R - 从 window 内的回归中提取 beta 和 alpha
R - extracting beta and alpha from regression within a window
我有这个数据框:
structure(list(X_ = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Y_ = c(0.00485082338451504,
-0.0168046606213001, 0.0271922543834244, 0.00553894528785559,
0.0459064669618974, 0.0735144938632293, 0.0368605806880207, 0.0597490764776278,
0.0244300474780141, 0.00904348896641594), Window_5 = c(-4, -3,
-2, -1, 0, 1, 2, 3, 4, 5), Window_2 = c(-1, 0, 1, 2, 3, 4, 5,
6, 7, 8)), row.names = c(NA, -10L), class = c("tbl_df", "tbl",
"data.frame"), na.action = structure(c(`1` = 1L), class = "exclude"))
X_ Y_ Window_5 Window_2
<dbl> <dbl> <dbl> <dbl>
1 1 0.00485 -4 -1
2 2 -0.0168 -3 0
3 3 0.0272 -2 1
4 4 0.00554 -1 2
5 5 0.0459 0 3
6 6 0.0735 1 4
7 7 0.0369 2 5
9 9 0.0244 4 7
10 10 0.00904 5 8
其中 Window_5 = X_-5
和 Window_2 = X_-2
。我正在寻找简单回归线的 beta 和 alpha,其中 alpha 和 beta:
然而,挑战是我需要为每一行提供这些参数,给定 X_
的 window。例如,对于 X_=7
,回归线应仅考虑 X_
从 Window_5
开始并在 Window_2
结束的行,在本例中 X_=7
window 将从 X_=2
到 X_=5
.
所以,预期的输出是:(我在 excel 中做了这个并仔细检查了它,所以值应该是正确的)
PS:如果能加上错误就好了,但严格来说不需要。
我的代码看起来应该可以满足您的要求。虽然它不是“整洁的”......(它应该使用 purrr::pmap
+ broom::tidy
+ ...)
wfun <- function(i, data) {
start <- data$Window_5[i]
end <- data$Window_2[i]
if (start<=0) return(data.frame(Alpha=NA,Alpha_SE=NA,
Beta=NA, Beta_SE=NA))
cc <- coef(summary(lm(Y_ ~ X_, data=data[start:end,])))
data.frame(Alpha=cc["(Intercept)","Estimate"],
Alpha_SE=cc["(Intercept)","Std. Error"],
Beta=cc["X_","Estimate"],
Beta_SE=cc["(Intercept)","Std. Error"])
}
res <- lapply(seq(nrow(dd)),wfun, data=dd)
do.call(rbind,res)
如果您只需要固定宽度的滑动 window 回归(在您的情况下为 4,但与示例的格式不完全相同),也许看看 rollRegres 包?
library(rollRegres)
roll_regres(Y_ ~ X_, data = dd, width=4)
我有这个数据框:
structure(list(X_ = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Y_ = c(0.00485082338451504,
-0.0168046606213001, 0.0271922543834244, 0.00553894528785559,
0.0459064669618974, 0.0735144938632293, 0.0368605806880207, 0.0597490764776278,
0.0244300474780141, 0.00904348896641594), Window_5 = c(-4, -3,
-2, -1, 0, 1, 2, 3, 4, 5), Window_2 = c(-1, 0, 1, 2, 3, 4, 5,
6, 7, 8)), row.names = c(NA, -10L), class = c("tbl_df", "tbl",
"data.frame"), na.action = structure(c(`1` = 1L), class = "exclude"))
X_ Y_ Window_5 Window_2
<dbl> <dbl> <dbl> <dbl>
1 1 0.00485 -4 -1
2 2 -0.0168 -3 0
3 3 0.0272 -2 1
4 4 0.00554 -1 2
5 5 0.0459 0 3
6 6 0.0735 1 4
7 7 0.0369 2 5
9 9 0.0244 4 7
10 10 0.00904 5 8
其中 Window_5 = X_-5
和 Window_2 = X_-2
。我正在寻找简单回归线的 beta 和 alpha,其中 alpha 和 beta:
然而,挑战是我需要为每一行提供这些参数,给定 X_
的 window。例如,对于 X_=7
,回归线应仅考虑 X_
从 Window_5
开始并在 Window_2
结束的行,在本例中 X_=7
window 将从 X_=2
到 X_=5
.
所以,预期的输出是:(我在 excel 中做了这个并仔细检查了它,所以值应该是正确的)
PS:如果能加上错误就好了,但严格来说不需要。
我的代码看起来应该可以满足您的要求。虽然它不是“整洁的”......(它应该使用 purrr::pmap
+ broom::tidy
+ ...)
wfun <- function(i, data) {
start <- data$Window_5[i]
end <- data$Window_2[i]
if (start<=0) return(data.frame(Alpha=NA,Alpha_SE=NA,
Beta=NA, Beta_SE=NA))
cc <- coef(summary(lm(Y_ ~ X_, data=data[start:end,])))
data.frame(Alpha=cc["(Intercept)","Estimate"],
Alpha_SE=cc["(Intercept)","Std. Error"],
Beta=cc["X_","Estimate"],
Beta_SE=cc["(Intercept)","Std. Error"])
}
res <- lapply(seq(nrow(dd)),wfun, data=dd)
do.call(rbind,res)
如果您只需要固定宽度的滑动 window 回归(在您的情况下为 4,但与示例的格式不完全相同),也许看看 rollRegres 包?
library(rollRegres)
roll_regres(Y_ ~ X_, data = dd, width=4)