如何在 R 中的滚动 window 中跳过 NA 列
How to skip an NA column in a rolling window in R
想象数据:
>dput(mydata)
structure(c(9.3424, 9.3424, 9.3983, 9.5102, 9.3144, 9.4822, NA,
NA, NA, NA, NA, NA, 7.8478, 8.1167, 7.6421, 7.4048, 5.3479, 5.3004,
NA, NA, NA, NA, NA, NA, 13.4319, 13.6184, 13.805, 13.8983, 13.8983,
13.805), .Dim = c(6L, 5L), .Dimnames = list(NULL, c("1", "2",
"3", "4", "5")))
我想做的是在滚动 window 中应用算法,算法所做的是 运行 抽样方法,然后分别为每一列生成一些汇总统计信息。这些列不会以任何方式相互影响。问题是数据中有 NA。我想要发生的是,当滚动 window 充满 NA 时,我希望滚动 window 跳过该列,并在摘要统计中放置一个 NA 值。
示例:
mydata<-sp.val[,c(1:5)]
summarrry<-matrix(0,nrow=5,ncol=2)
roller<-5
for (u in 1:roller){
for (j in 1:5){ #50 is the assets consider using 498
testdata<-mydata[(u:(u+365)),]
lin<-lm(testdata[,1]~testdata[,j],data=as.data.frame(testdata))
summarrry[j,]<-coef(lin)
print(summarrry)
}
}
这个returns错误:
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
0 (non-NA) cases
这是由于 NA 列。
因此我想跳过滚动 window 的列:要么全是 NA (length(which.na(data))==window
),要么只有一个数值 (length(which.na(data))==(window-1)
)。
期望的输出:
运行上面returns这个:
第 1 列是截距,第 2 列是系数。
[,1] [,2]
[1,] 2.971253e-15 1
[2,] 0.000000e+00 0
[3,] 0.000000e+00 0
[4,] 0.000000e+00 0
[5,] 0.000000e+00 0
并且由于 NA 提到的错误而停止。
我想要发生的事情:
[,1] [,2]
[1,] 2.971253e-15 1
[2,] NA NA
[3,] 2.455878 1.841197
[4,] NA NA
[5,] 2.5868 0.5759558
您的示例代码不可重现(由于 u+365 而出现越界错误)。但是,为什么不在那里添加一个 if
语句呢?
summarrry<-matrix(0,nrow=5,ncol=2)
roller<-5
for (u in 1:roller){
for (j in 1:5){ #50 is the assets consider using 498
testdata<-mydata[(u:(u+365)),]
# check if there are any non-NAs in the column and then calculate the lm:
if(any(!is.na(testdata[,j]))) lin<-lm(testdata[,1]~testdata[,j],data=as.data.frame(testdata)) else lin<-NA
summarrry[j,]<-if (!is.na(lin)) coef(lin) else c(NA,NA)
print(summarrry)
}
}
(老实说,我不确定您要实现的目标 - {}
可能需要也可能不需要)
想象数据:
>dput(mydata)
structure(c(9.3424, 9.3424, 9.3983, 9.5102, 9.3144, 9.4822, NA,
NA, NA, NA, NA, NA, 7.8478, 8.1167, 7.6421, 7.4048, 5.3479, 5.3004,
NA, NA, NA, NA, NA, NA, 13.4319, 13.6184, 13.805, 13.8983, 13.8983,
13.805), .Dim = c(6L, 5L), .Dimnames = list(NULL, c("1", "2",
"3", "4", "5")))
我想做的是在滚动 window 中应用算法,算法所做的是 运行 抽样方法,然后分别为每一列生成一些汇总统计信息。这些列不会以任何方式相互影响。问题是数据中有 NA。我想要发生的是,当滚动 window 充满 NA 时,我希望滚动 window 跳过该列,并在摘要统计中放置一个 NA 值。
示例:
mydata<-sp.val[,c(1:5)]
summarrry<-matrix(0,nrow=5,ncol=2)
roller<-5
for (u in 1:roller){
for (j in 1:5){ #50 is the assets consider using 498
testdata<-mydata[(u:(u+365)),]
lin<-lm(testdata[,1]~testdata[,j],data=as.data.frame(testdata))
summarrry[j,]<-coef(lin)
print(summarrry)
}
}
这个returns错误:
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
0 (non-NA) cases
这是由于 NA 列。
因此我想跳过滚动 window 的列:要么全是 NA (length(which.na(data))==window
),要么只有一个数值 (length(which.na(data))==(window-1)
)。
期望的输出: 运行上面returns这个: 第 1 列是截距,第 2 列是系数。
[,1] [,2]
[1,] 2.971253e-15 1
[2,] 0.000000e+00 0
[3,] 0.000000e+00 0
[4,] 0.000000e+00 0
[5,] 0.000000e+00 0
并且由于 NA 提到的错误而停止。 我想要发生的事情:
[,1] [,2]
[1,] 2.971253e-15 1
[2,] NA NA
[3,] 2.455878 1.841197
[4,] NA NA
[5,] 2.5868 0.5759558
您的示例代码不可重现(由于 u+365 而出现越界错误)。但是,为什么不在那里添加一个 if
语句呢?
summarrry<-matrix(0,nrow=5,ncol=2)
roller<-5
for (u in 1:roller){
for (j in 1:5){ #50 is the assets consider using 498
testdata<-mydata[(u:(u+365)),]
# check if there are any non-NAs in the column and then calculate the lm:
if(any(!is.na(testdata[,j]))) lin<-lm(testdata[,1]~testdata[,j],data=as.data.frame(testdata)) else lin<-NA
summarrry[j,]<-if (!is.na(lin)) coef(lin) else c(NA,NA)
print(summarrry)
}
}
(老实说,我不确定您要实现的目标 - {}
可能需要也可能不需要)