滚动时序 (xts) 对象的斜率 window

Slope of time series (xts) object over rolling window

我正在比较两个时间序列以找出它们之间的趋同和差异。对于这种比较,我需要找到这些 xts 对象的滚动斜率。

输出预计在 +90 度到 -90 度的范围内,但是,所有角度都非常高(+89 度或 -89 度)。 None 个角度在中间范围内(例如 40 度或 50 度)。在时间序列 See the time-series here. 中可以清楚地看到,角度比我得到的要小得多。请参阅下面的代码。

也许这个时间序列中的值太高导致角度太高。

预期结果是 中间 +90 度到 -90 度的角度范围,而不仅仅是直方图最边的角度。 See Current Histogram here。这个直方图两边都偏斜了。

规范化时间序列不起作用,因为还有许多其他时间序列需要相互比较。 我确信这个问题一定有一个巧妙的解决方案,但我不知道。

pk <- structure(c(176475.776229, 801702.534136, 573531.310782, 763134.554794, 
    51032.510395, -1202277.491428, -1075865.007615, 164827.827364, 
    1361265.209786, 1127723.252118, 1203207.209536, 253001.450284, 
    -432815.684082, -1422078.007582, -1664445.275597, -2105884.398064, 
    -2692917.799029, -44481.693965, 1179531.342173, 1110848.076465, 
    143379.572703, 181772.06575, -101275.193071, 252103.218599, -947214.996499, 
    -2489067.257061, -2226433.431194, -1444275.476699, -1969694.906524, 
    -760675.705558, 899506.35791, 2362280.866488, 1381920.731308, 
    1084715.948833, 1470193.174884, 1624093.045166, 1223984.756996, 
    105135.024835, 467388.621885, -340023.436882, -1942657.241719, 
    -2868287.68536, -3188899.823682, -2023482.788343, -2083416.868433, 
    -760435.041761, -223620.863171, 1008599.460076, 929822.059922, 
    1286626.269563, 2115007.421729, 1263829.5103, 117011.837805, 
    -1810296.187432, -2147812.317081, -2926602.592077, -2121310.677489, 
    -1091714.667369, -1460359.83423, -1339758.147395, -2007100.150998, 
    -2968863.772891, -2581419.700941, -3102293.73078, -2773652.767461, 
    -2842639.167243, -2900330.04286, -3412296.674811, -3535923.326536, 
    -2910537.240885, -2973223.902763, -2089859.94917, -608387.42732, 
    -78974.410284, 414977.701612, -5468547.637958, -6880128.453481, 
    -10676399.836788, -13974736.268232, -15073872.927747, -12395505.578961, 
    -8406507.177235, -7270788.824168, -7218095.55522, -7511227.500782, 
    -7589981.076343, -6007998.653345, -6340495.773522, -6185343.701229, 
    -6305225.926088, -4294831.625218, -1752062.182139, 407152.408487, 
    3161681.381567, 4700389.19555, 3763376.707736, 1862677.049896, 
    489057.458062, -150496.024142, 957322.644424), class = c("xts", 
    "zoo"), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", src = "yahoo", updated = structure(1566047444.37875, class = c("POSIXct", 
    "POSIXt")), index = structure(c(1553644800, 1553731200, 1553817600, 
    1554076800, 1554163200, 1554249600, 1554336000, 1554422400, 1554681600, 
    1554768000, 1554854400, 1554940800, 1555027200, 1555286400, 1555372800, 
    1555459200, 1555545600, 1555891200, 1555977600, 1556064000, 1556150400, 
    1556236800, 1556496000, 1556582400, 1556668800, 1556755200, 1556841600, 
    1557100800, 1557187200, 1557273600, 1557360000, 1557446400, 1557705600, 
    1557792000, 1557878400, 1557964800, 1558051200, 1558310400, 1558396800, 
    1558483200, 1558569600, 1558656000, 1559001600, 1559088000, 1559174400, 
    1559260800, 1559520000, 1559606400, 1559692800, 1559779200, 1559865600, 
    1560124800, 1560211200, 1560297600, 1560384000, 1560470400, 1560729600, 
    1560816000, 1560902400, 1560988800, 1561075200, 1561334400, 1561420800, 
    1561507200, 1561593600, 1561680000, 1561939200, 1562025600, 1562112000, 
    1562284800, 1562544000, 1562630400, 1562716800, 1562803200, 1562889600, 
    1563148800, 1563235200, 1563321600, 1563408000, 1563494400, 1563753600, 
    1563840000, 1563926400, 1564012800, 1564099200, 1564358400, 1564444800, 
    1564531200, 1564617600, 1564704000, 1564963200, 1565049600, 1565136000, 
    1565222400, 1565308800, 1565568000, 1565654400, 1565740800, 1565827200, 
    1565913600), tzone = "UTC", tclass = "Date"), .Dim = c(100L, 
    1L), .Dimnames = list(NULL, "pk"))

    f <- function (x) {
      res <- lm(x ~ time(x))
      atan(coef(res)[[2]]) * (180/pi)
    }

    r <- rollapplyr(pk, 14, f)
    hist(r)

对我有用。我们不需要 summary 也不需要 by.column(反正只有一列)。

结果范围是 c(-90, 90) 到 3 位小数。

library(xts)

f <- function (x) {
  res <- lm(x ~ time(x))
  atan(coef(res)[[2]]) * 180 / pi
}

r <- rollapplyr(pk, 14, f)
round(range(r, na.rm = TRUE), 3)
## [1] -90  90

已添加

张贴者表示不需要规范化,但如果我们确实这样做了,那么我们可以针对 k 的各种值尝试此操作,也许 k=3,直到我们得到我们想要的。

r <- rollapplyr(k * 14 * pk / max(pk), 14, f)