【发布时间】:2018-04-02 06:55:06
【问题描述】:
摘要 (tldr)
我需要对 不规则 时间序列(即间隔可能甚至不是周期性的,从 0, 1, 2, 3... 到 ...7, 20, 24, 28...)执行滚动回归,这是简单的数字,不一定需要日期/时间,但滚动窗口需要按时间。因此,如果我有一个不规则采样 600 秒且窗口为 30 的时间序列,则每 30 秒执行一次回归,而不是每 30 秒执行一次回归。
我已经阅读了示例,虽然我可以按时间复制滚动总和和中位数,但我似乎无法为回归计算出来。
问题
首先,我阅读了其他一些关于对不规则时间序列数据执行滚动函数的问题,例如:optimized rolling functions on irregular time series with time-based window,以及:Rolling window over irregular time series。
问题在于,到目前为止,所提供的示例对于sum 或median 等方程很简单,但我还没有弄清楚如何执行简单的滚动回归,即使用lm,即仍然基于相同的警告,即窗口基于不规则的时间序列。而且,我的时间序列要简单得多。不需要日期,只是“经过”的时间。
无论如何,正确处理对我来说很重要,因为在不规则时间(例如,时间间隔中的跳过)可能会高估或低估滚动回归中的系数,因为样本窗口将包括 额外时间。
所以我想知道是否有人可以帮助我创建一个以最简单的方式执行此操作的函数?该数据集基于随时间测量一个变量,即 2 个变量:time 和 response。时间以每 x 个经过的时间单位(秒、分钟,因此不是 日期/时间 格式)测量一次,但偶尔会变得不规则。
对于函数中的每一行,它应该基于 n 个时间单位的宽度执行线性回归。宽度不得超过 n 个单位,但可以下限(即减小)以适应不规则的时间采样。例如,如果宽度指定为 20 秒,但时间每 6 秒采样一次,则窗口将四舍五入为 18,而不是 24 秒。
我在这里查看了问题:How to calculate the average slope within a moving window in R,并且我在不规则的时间序列上测试了该代码,但它看起来像是基于规则的时间序列。
样本数据:
sample <-
structure(list(x = c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
29, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 47, 48,
49), y = c(50, 49, 48, 47, 46, 47, 46, 45, 44, 43, 44, 43, 42,
41, 40, 41, 40, 39, 38, 37, 38, 37, 36, 35, 34, 35, 34, 33, 32,
31, 30, 29, 28, 29, 28, 27, 26, 25, 26, 25, 24, 23, 22, 21, 20,
19)), .Names = c("x", "y"), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -46L))
我当前的代码(基于我之前提到的问题)。我知道它不是按时间划分的:
library(zoo)
clm <- function(z) coef(lm(y ~ x, as.data.frame(z)))
rollme <- rollapplyr(zoo(sample), 10, clm, by.column = F, fill = NA)
预期输出(手动计算)如下。输出不同于常规的滚动回归——只要时间间隔跳过 29(秒),数字就会不同:
NA
NA
NA
NA
NA
NA
NA
NA
NA
-0.696969697
-0.6
-0.551515152
-0.551515152
-0.6
-0.696969697
-0.6
-0.551515152
-0.551515152
-0.6
-0.696969697
-0.6
-0.551515152
-0.551515152
-0.6
-0.696969697
-0.6
-0.551515152
-0.551515152
-0.6
-0.696969697
-0.605042017
-0.638888889
-0.716981132
-0.597560976
-0.528301887
-0.5
-0.521008403
-0.642857143
-0.566666667
-0.551515152
-0.551515152
-0.6
-0.696969697
-0.605042017
-0.638888889
-0.716981132
我希望我提供了足够的信息,但让我知道(或给我一个指导某个地方的好例子)让我试试这个?
我尝试过的其他事情: 我尝试将时间转换为 POSIXct 格式,但我不知道如何执行 lm:
require(lubridate)
x <- as.POSIXct(strptime(sample$x, format = "%S"))
更新:添加了 tldr 部分。
【问题讨论】:
-
明确地说,任务是在协变量
x上回归时间y,超过一个滚动时间窗口,比如 20 个单位,时间差不相等。 -
检查您发布的代码的前几行输出,它给出的斜率系数与您按预期列出的一样。请准确说明问题所在。
-
对不起,我以为我说得够清楚了(但也许不是)。我会尽快编辑并澄清问题。
标签: r iteration linear-regression zoo