【问题标题】:missing value when calculating running medians?计算运行中位数时缺少值?
【发布时间】:2012-08-27 22:54:51
【问题描述】:

我想平滑时间序列以避免虚假的抖动/错误。换句话说,我想做一些非常局部的鲁棒平滑。

我在 zoo 包中遇到了 rollmean 和 rollmedian,但遇到了问题,因为我的向量中有一个 NA。然后我在某处读到那些动物园功能使用 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 参数。

如何运行以处理 NA? 顺便说一下,rollmean 返回一个直到 NA 为止都是正确的向量,然后为之后的每个值返回 NA。

【问题讨论】:

  • Zoo 中的 rollmeanrollmean 旨在提高速度,因此有一定的限制,因此它们运行得更快——如他们的帮助文件中所述。如果您的情况不符合这些限制,您仍然可以使用 rollapply 在这种情况下,您可以提供您想要的任何功能,例如rollapply(x, k, function(x) median(x, na.rm = TRUE)) 。请注意,帮助文件中说:“‘rollmean’的默认方法不处理包含‘NA’的输入。在这种情况下,请改用‘rollapply’。”

标签: r missing-data


【解决方案1】:

使用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.locfna.approxna.splinena.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。我正在阅读动物园的帮助。我刚刚发现在时间序列中猜测 NA 的函数过多。 na.omit 令人不满意,因为它丢弃了 NA,它给出的向量长度比原始向量短,这会弄乱针对时间戳或其他变量的绘图。
【解决方案2】:

caTools package 中查看runquantile

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多