过滤掉数据有限的滚动平均结果
filter out rolling mean results with limited data
我正在尝试计算时间序列的滚动平均值。我对计算没有任何问题,但是,查看结果,时间序列中的某些位置会根据一个或两个被一长串缺失值包围的值发生滚动平均值。我希望滚动平均值仅在执行滚动平均值的时间范围内大于 50% 的数据时发生。如果只有不到 50% 的数据可用,则该索引的结果应为 NaN
.
我写了一些示例代码来展示我正在努力完成的事情。
#Create example data
set.seed(12)
dat1=runif(20,min=0,max=10)
dat2=dat1
ind=which(dat2 %in% sample(dat2,5))
#in this case ind=c(4, 7, 8, 13, 16)
dat2[ind]=NA
dat3=dat1
ind2=which(dat3 %in% sample(dat3,12))
#in this case ind2=c(2, 5, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18)
dat3[ind2]=NA
#create a time series
now <- Sys.time()
tseq <- seq(from = now, length.out = 20, by = "mins")
#data in zoo format
dat1=zoo(dat1,tseq)
dat2=zoo(dat2,tseq)
dat3=zoo(dat3,tseq)
#rolling mean using roll apply
dat1rollmean=rollapply(dat1,width=5,align='center',FUN=function(x) mean(x,na.rm=T))
dat2rollmean=rollapply(dat2,width=5,align='center',FUN=function(x) mean(x,na.rm=T))
dat3rollmean=rollapply(dat3,width=5,align='center',FUN=function(x) mean(x,na.rm=T))
#doesn't work
dat3newrollmean=rollmean(dat3,5)
#desired rolling mean result
dat2des=dat2rollmean
dat2des[4]=NaN
dat3des=dat3rollmean
dat3des[c(4:14)]=NaN
在这个例子中,dat1 是一个完整的数据集,我的 rollapply(宽度为 5)函数运行良好,dat2 和 dat3 有不同程度的缺失数据。在这种情况下,我希望我的结果用 NaN
替换对少于 2 个数据点执行 rollapply 的任何点。那将是 dat2rollmean
的索引 4 和 dat3rollmean
的索引 4-14。我将如何编写一个函数来查找这些数据不足的实例并将生成的滚动平均结果替换为 NaN
?
使用下面定义的Mean
:
Mean <- function(x) if (sum(is.na(x)) < length(x) / 2) mean(x, na.rm = TRUE) else NaN
res1 <- rollapply(dat1, 5, Mean)
identical(res1, dat1rollmean)
## [1] TRUE
res2 <- rollapply(dat2, 5, Mean)
identical(res2, dat2des)
## [1] TRUE
res3 <- rollapply(dat3, 5, Mean)
identical(res3, dat3des)
## [1] TRUE
我正在尝试计算时间序列的滚动平均值。我对计算没有任何问题,但是,查看结果,时间序列中的某些位置会根据一个或两个被一长串缺失值包围的值发生滚动平均值。我希望滚动平均值仅在执行滚动平均值的时间范围内大于 50% 的数据时发生。如果只有不到 50% 的数据可用,则该索引的结果应为 NaN
.
我写了一些示例代码来展示我正在努力完成的事情。
#Create example data
set.seed(12)
dat1=runif(20,min=0,max=10)
dat2=dat1
ind=which(dat2 %in% sample(dat2,5))
#in this case ind=c(4, 7, 8, 13, 16)
dat2[ind]=NA
dat3=dat1
ind2=which(dat3 %in% sample(dat3,12))
#in this case ind2=c(2, 5, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18)
dat3[ind2]=NA
#create a time series
now <- Sys.time()
tseq <- seq(from = now, length.out = 20, by = "mins")
#data in zoo format
dat1=zoo(dat1,tseq)
dat2=zoo(dat2,tseq)
dat3=zoo(dat3,tseq)
#rolling mean using roll apply
dat1rollmean=rollapply(dat1,width=5,align='center',FUN=function(x) mean(x,na.rm=T))
dat2rollmean=rollapply(dat2,width=5,align='center',FUN=function(x) mean(x,na.rm=T))
dat3rollmean=rollapply(dat3,width=5,align='center',FUN=function(x) mean(x,na.rm=T))
#doesn't work
dat3newrollmean=rollmean(dat3,5)
#desired rolling mean result
dat2des=dat2rollmean
dat2des[4]=NaN
dat3des=dat3rollmean
dat3des[c(4:14)]=NaN
在这个例子中,dat1 是一个完整的数据集,我的 rollapply(宽度为 5)函数运行良好,dat2 和 dat3 有不同程度的缺失数据。在这种情况下,我希望我的结果用 NaN
替换对少于 2 个数据点执行 rollapply 的任何点。那将是 dat2rollmean
的索引 4 和 dat3rollmean
的索引 4-14。我将如何编写一个函数来查找这些数据不足的实例并将生成的滚动平均结果替换为 NaN
?
使用下面定义的Mean
:
Mean <- function(x) if (sum(is.na(x)) < length(x) / 2) mean(x, na.rm = TRUE) else NaN
res1 <- rollapply(dat1, 5, Mean)
identical(res1, dat1rollmean)
## [1] TRUE
res2 <- rollapply(dat2, 5, Mean)
identical(res2, dat2des)
## [1] TRUE
res3 <- rollapply(dat3, 5, Mean)
identical(res3, dat3des)
## [1] TRUE