假设我有一个随机时间序列,我想在另一个时间序列上插值。我怎么能在R?中做到这一点?
# generate time interval series from exponential distribution
s = sort(rexp(10))
# scale between 0 and 1
scale01 = function(x){(x-min(x))/(max(x)-min(x))}
s = scale01(s)
> s
[1] 0.00000000 0.02804113 0.05715588 0.10630185 0.15778932 0.20391987 0.26066608 0.27265697 0.39100373
[10] 1.00000000
# generate random normal series
x = rnorm(20)
> x
[1] -0.82530658 0.92289557 0.39827984 -0.62416117 -1.69055539 -0.28164232 -1.32717654 -1.36992509
[9] -1.54352202 -1.09826247 -0.68260576 1.07307043 2.35298180 -0.41472811 0.38919315 -0.27325343
[17] -1.52592682 0.05400849 -0.43498544 0.73841106
# interpolate 'x' over 's' ?
> approx(x,xout=s)
$x
[1] 0.00000000 0.02804113 0.05715588 0.10630185 0.15778932 0.20391987 0.26066608 0.27265697 0.39100373
[10] 1.00000000
$y
[1] NA NA NA NA NA NA NA NA NA
[10] -0.8253066
>
我想在系列''上插入'x'系列。让我们假设'x'系列的时间间隔序列有20个元素在区间[0,1]上均匀分布。现在我想插入来自'x'的那10个元素,它们以's'描述的时间间隔出现。
编辑: 我认为这样做了。
> approx(seq(0,1,length.out=20), x, xout=s)
$x
[1] 0.00000000 0.02804113 0.05715588 0.10630185 0.15778932 0.20391987 0.26066608 0.27265697 0.39100373
[10] 1.00000000
$y
[1] -0.8253066 0.1061033 0.8777987 0.3781018 -0.6221134 -1.5566990 -0.3483466 -0.4703429 -1.4444105
[10] 0.7384111
感谢您的帮助。我想我现在明白了如何在R中使用插值函数。我应该在这里使用时间序列数据结构。
答案 0 :(得分:3)
这并不是对OP的Q的直接回答,而是说明approx()
如何运作,以便OP可以制定更好的Q
你的Q毫无意义。 approx()
的工作原理是获取参考的x和y坐标集,然后进行插值,以便在y
范围内的n
个位置查找x
,或在用户提供的指定xout
位置。
因此,在您的通话中,您未提供y
且x
不包含y
组件,因此我看不出这是如何运作的。
如果您想插入s
,那么您可以找到s
范围内任何值的时间间隔,然后:
> approx(s, seq_along(s), n = 20)
$x
[1] 0.00000000 0.05263158 0.10526316 0.15789474 0.21052632 0.26315789
[7] 0.31578947 0.36842105 0.42105263 0.47368421 0.52631579 0.57894737
[13] 0.63157895 0.68421053 0.73684211 0.78947368 0.84210526 0.89473684
[19] 0.94736842 1.00000000
$y
[1] 1.00000 26.25815 42.66323 54.79831 64.96162 76.99433 79.67388
[8] 83.78458 86.14656 89.86223 91.98513 93.36233 93.77353 94.19731
[15] 94.63652 95.26239 97.67724 98.74056 99.40548 100.00000
此处$y
包含在s
(0,1)范围内n = 20
等间距位置s
的插值。
修改:如果x
表示在未声明的时间间隔上的系列在0,1上统一,并且您希望插值为x
at时间间隔s
,那么你需要这样的东西:
> set.seed(1)
> x <- rnorm(20)
> s <- sort(rexp(10))
> scale01 <- function(x) {
+ (x - min(x)) / (max(x) - min(x))
+ }
> s <- scale01(s)
>
> ## interpolate x at points s
> approx(seq(0, 1, length = length(x)), x, xout = s)
$x
[1] 0.00000000 0.04439851 0.11870795 0.14379236 0.20767388 0.21218632
[7] 0.25498856 0.29079300 0.40426335 1.00000000
$y
[1] -0.62645381 0.05692127 -0.21465011 0.94393053 0.39810806 0.29323742
[7] -0.64197207 -0.13373472 0.62763207 0.59390132
这更接近你想要的吗?