【问题标题】:rollapply with zoo and sub-daily data使用动物园和次日数据滚动应用
【发布时间】:2014-09-08 13:31:06
【问题描述】:

我有一个数据集,其中包含不等间距的观察结果,并且观察结果经常每天发生不止一次。我想将一个函数应用于我的数据窗口,但我希望这些窗口是按时间而不是按行定义的。例如,我想在我的数据集中计算第 1-5 天、第 2-6 天等的平均值,第 1-5 天可能对应于第 1-13 行,第 2-6 天对应于第 3 行- 18等

我看到rollapply 函数接受zoo 对象,并且我认为它会像我上面描述的那样工作(即将函数应用于由时间定义的窗口而不是由行定义的窗口)。但是,情况似乎并非如此:

my.ts = zoo( 1:100, as.Date("201401","%Y%j")+1:100 )
mean1 = rollapply( my.ts, 3, mean, align="right" )
my.ts = zoo( 1:100, as.Date("201401","%Y%j")+1:100/2 )
mean2 = rollapply( my.ts, 3, mean, align="right" )
all( mean1==mean2 )

我希望mean2mean1 不同,因为mean2 每天有两次观察而不是一次。但是,rollapply 似乎使用行来定义窗口,而不是来自zoo 对象的时间。有解决办法吗?或者,可能我应该使用其他一些函数来代替rollapply

【问题讨论】:

    标签: r time-series zoo rollapply


    【解决方案1】:

    rollapply 记录在 ?rollapply 中,因此无需猜测它是如何工作的。

    要做你想做的事,用 NA 填充缺失的天数,然后执行平均值。例如,每三天而不是每三个观察值取平均值:

    library(zoo)
    
    # test data
    tt <- as.Date("2000-01-01") + c(1, 2, 5, 6, 7, 8, 10)
    z <- zoo(seq_along(tt), tt)
    
    # fill it out to a daily series, zm, using NAs
    g <- zoo(, seq(start(z), end(z), "day")) # zero width zoo series on a grid
    zm <- merge(z, g)
    
    rollapply(zm, 3, mean, na.rm = TRUE, fill = NA)
    

    【讨论】:

    • 感谢您的回复!我认为您可能误解了我的问题……我每天有多个观察结果,有时数量不同。我希望 rollapply 每三天计算一次均值,并使用这三天内发生的所有观察结果。
    • 如果您的数据是每小时的,那么创建一个定期的每小时系列并采用相同的方法。如果是按分钟制作定期的按分钟系列等。请在未来提供有代表性的数据,以便更好地传达您想要的内容。
    • 啊,我明白了,好的。因此,如果我在一天中的观察间隔不规则,我需要将这一天分成几块,并为没有观察的块添加 NA。谢谢!
    猜你喜欢
    • 2012-01-12
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2017-08-31
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多