r-循环使用NA值进行滚动窗口回归



这里是一个R-编程问题。

因此,我尝试运行多个滚动窗口回归,并为每个回归保存测试版。在我给出的例子中,我想在X1上回归前5个obs的Y。然后保存β(斜率系数(。然后运行下一个5(所以第2行到第6行(并保存下一个测试版。对于不同的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]
}
}

问题是,我的贝塔矩阵只给了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命令,但没有用。

关于如何进行循环回归,有人有解决方案吗?已经很感激了。所有最好的

问题归结为用j引用列。由于您需要填写一个空矩阵,但忽略数据中的第一列,因此添加一个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

在线演示

我们可以使用outer方法将任意函数应用于元素和对象(列表/向量(的所有组合。

我们需要一个递增序列为5的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

以及我们的解释变量的向量CCD_ 4。

ev <- c("X1", "X2", "X3")

我们还需要我们的regFUN,它使用reformulate从字符串创建公式,

regFUN <- Vectorize(function(x, i) lm(reformulate(x, "Y"), dat[i, -1])$coe[2])

并且我们最后使用CCD_ 7将其应用于我们的两个对象的元素的所有组合。

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)

我找到了这个问题的解决方案。问题是,一旦我开始计算最后一列(X3(回归,就会显示一条错误消息。

提供正确解决方案的代码如下:

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]
}
}

try的加入使我能够继续运行循环,并在最后一列中获得最终值。感谢大家的帮助。

最新更新