计算移动中位数时出现缺失值?

4

我希望对时间序列进行平滑处理,以避免出现虚假的抖动/错误。换句话说,我想要进行一些非常局部的鲁棒平滑处理。

我在zoo包中发现了rollmean和rollmedian函数,但遇到了一个问题,因为我的向量中有一个NA值。后来我在某个地方读到,这些zoo函数使用runmed,其中就存在问题。

==示例==

median(c(1,1,1,2,2,2,7,NA,1,2,3,10,10,10),na.rm = TRUE)
runmed(c(1,1,1,2,2,2,7,NA,1,2,3,10,10,10),k=3)

第一行返回2,但如果没有包括na.rm = TRUE,则将返回NA。第二行返回Error in runmed(c(1, 1, 1, 2, 2, 2, 7, NA, 1, 2, 3, 10, 10, 10), k = 3) : NA/NaN/Inf in foreign function call (arg 1)。该行没有办法添加na.rm参数。

如何使runmed处理NA?顺便提一下,rollmean返回一个向量,在NA之前的值是正确的,之后的每个值都是NA。


2
rollmeanzoo中的rollmean旨在提高速度,因此具有某些限制,以便它们运行更快-如其帮助文件中所述。 如果您的情况不符合这些限制,则仍可以使用rollapply,在这种情况下,您可以提供任何函数,例如rollapply(x,k,function(x)median(x,na.rm = TRUE))。 请注意,帮助文件说:“‘rollmean’的默认方法无法处理包含‘NA’的输入。在这种情况下,请改用 ‘rollapply’。” - G. Grothendieck
2个回答

6

使用na.omit

runmed(na.omit(c(1,1,1,2,2,2,7,NA,1,2,3,10,10,10)),k=3)
# [1]  1  1  1  2  2  2  2  2  2  3 10 10 10
#attr(,"k")
#[1] 3

或者使用 zoo 中的 na.* 函数 (na.locf, na.approx, na.spline, na.aggregate 等)。

runmed(na.locf(c(1,1,1,2,2,2,7,NA,1,2,3,10,10,10)),k=3)
#[1]  1  1  1  2  2  2  7  7  2  2  3 10 10 10
#attr(,"k")
#[1] 3

感谢@GSee。我正在阅读zoo帮助文档。我刚刚发现了大量的函数来猜测时间序列中的NA值。na.omit不令人满意,因为它会删除NA值,导致向量长度比原始长度短,这将破坏针对时间戳或其他变量的绘图。 - Farrel

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接