首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NA值循环滚动窗口回归

使用NA值循环滚动窗口回归
EN

Stack Overflow用户
提问于 2020-05-09 23:03:04
回答 2查看 160关注 0票数 1

这是一个R-编程问题。

因此,我尝试运行多个滚动窗口回归,并为每个回归保存betas。在我给定的例子中,我想对前5个obs在X1上回归Y。然后保存beta (斜率系数)。然后运行下一个5(因此第2行到第6行),并保存下一个测试版。对于不同的X值,我想这样做三次。我的数据如下所示:

代码语言:javascript
复制
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

我尝试运行的代码是一个循环,如下所示:

代码语言:javascript
复制
#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的第三列的NAs。所以我得到的是:

代码语言:javascript
复制
Row X1     X2   X3 
 1  coef  coef  NA
 2  coef  coef  NA
 3  coef  coef  NA
 4  coef  coef  NA

然而,我想要得到的是以下内容:

代码语言:javascript
复制
#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)有一些初始NAs,所以它为所有未来系数值提供NAs,即使它回归的窗口是NA空闲的。我尝试过使用na.omit命令,但都无济于事。

关于如何进行这种循环回归,有没有人有解决方案?已经很感激了。万事如意

EN

回答 2

Stack Overflow用户

发布于 2020-05-09 23:31:48

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

我们需要一个5的递增序列的row.list

代码语言:javascript
复制
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

代码语言:javascript
复制
ev <- c("X1", "X2", "X3")

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

代码语言:javascript
复制
regFUN <- Vectorize(function(x, i) lm(reformulate(x, "Y"), dat[i, -1])$coe[2])

最后,我们使用outer将其应用于两个对象的元素的所有组合。

代码语言:javascript
复制
res <- t(outer(ev, row.list, regFUN))

结果

代码语言:javascript
复制
`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

数据:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2020-05-10 03:18:03

我已经找到了解决这个问题的办法。问题是,一旦我开始计算最终列(X3s)回归,就会显示一条错误消息。

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

代码语言:javascript
复制
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允许我继续运行循环,并获得最后一列中的最终值。感谢大家的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61698834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档