此处是R编程问题。
因此,我尝试运行多个滚动窗口回归并保存每个回归的beta。在给定的示例中,我想对前5个Obs在X1上回归Y。然后保存beta(斜率系数)。然后在下一个5(从第2行到第6行)上运行并保存下一个Beta。我想针对不同的X值执行三遍此操作。 我的数据如下所示:
Row Y X1 X2 X3
1 1 2 3 NA
2 1 3 5 NA
3 1 4 6 NA
4 2 4 6 4
5 3 3 4 8
6 4 4 6 7
7 3 5 5 3
8 5 4 6 7
我尝试运行的代码是一个循环,如下所示:
#Rows equals the number of rows in my obs matrix.
for (j in 1:3) {
for (i in 1:(Rows-4)) {
Model<- lm(data[((i+0):(4+i)),1] ~ data[((i+0):(4+i)),j])
betas[i,j] <- coefficients(Model)[2]
}
}
问题是我的Beta矩阵仅给我X3第三列的NA。所以我得到的是:
Row X1 X2 X3
1 coef coef NA
2 coef coef NA
3 coef coef NA
4 coef coef NA
但是,我想得到的是以下几行内容:
#my beta matrix looks like this
Row X1 X2 X3
1 coef coef NA
2 coef coef NA
3 coef coef NA
4 coef coef coef
换句话说,因为最后一列(X3)具有一些初始NA,所以即使在其回归的窗口不包含NA的情况下,也为我提供了所有将来系数值的NA。我试图弄乱na.omit命令无济于事。
有人对如何进行这种循环回归有解决方案吗? 已经非常感谢。一切顺利
答案 0 :(得分:0)
我们可以采取一种outer
方法,将任意函数应用于元素两个对象(列表/向量)的所有组合。
我们需要row.list
,其中包含五个递增的序列,
row.list <- lapply(1:(nrow(dat)-4), function(x) x:(x+4))
# [[1]]
# [1] 1 2 3 4 5
#
# [[2]]
# [1] 2 3 4 5 6
#
# [[3]]
# [1] 3 4 5 6 7
#
# [[4]]
# [1] 4 5 6 7 8
和我们的解释变量的向量ev
。
ev <- c("X1", "X2", "X3")
我们还需要regFUN
,它使用reformulate
从字符串创建公式,
regFUN <- Vectorize(function(x, i) lm(reformulate(x, "Y"), dat[i, -1])$coe[2])
,最后我们使用outer
将其应用于两个对象的所有元素组合。
res <- t(outer(ev, row.list, regFUN))
`colnames<-`(res, ev)
# X1 X2 X3
# [1,] 1.428571e-01 -0.05882353 0.2500000
# [2,] 3.333333e-01 -0.12500000 0.3461538
# [3,] 1.648597e-15 -0.37500000 0.1764706
# [4,] 0.000000e+00 0.37500000 0.2872340
数据:
dat <- read.table(text="Row Y X1 X2 X3
1 1 2 3 NA
2 1 3 5 NA
3 1 4 6 NA
4 2 4 6 4
5 3 3 4 8
6 4 4 6 7
7 3 5 5 3
8 5 4 6 7", header=TRUE)
答案 1 :(得分:0)
问题归结为使用 j 引用的列。由于您需要填写一个空矩阵,但忽略 data 中的第一列,因此添加1以跳过用作因变量的第一列。而且由于第4行的窗口大于第3行的NA
行,因此所有行都应该有回归结果:
for (j in 1:3) {
for (i in 1:(Rows-4)) {
Model<- lm(data[i:(4+i),1] ~ data[i:(4+i), j+1])
betas[i,j] <- coefficients(Model)[2]
}
}
betas
# [,1] [,2] [,3]
# [1,] 1.428571e-01 -0.05882353 0.2500000
# [2,] 3.333333e-01 -0.12500000 0.3461538
# [3,] 1.648597e-15 -0.37500000 0.1764706
# [4,] 0.000000e+00 0.37500000 0.2872340
答案 2 :(得分:0)
我找到了解决问题的方法。问题是,一旦我开始计算最终列(X3s)回归,就会显示一条错误消息。
提供正确解决方案的代码如下:
for (j in 1:3) {
for (i in 1:(Rows-4)) {
try(Model<- lm(data[i:(4+i),1] ~ data[i:(4+i), j+1]), silent=T)
betas[i,j] <- coefficients(Model)[2]
}
}
尝试的包含使我能够继续运行循环,并在最后一列中获得最终值。感谢大家的帮助。