在R中插入另一个系列的系列

时间:2011-03-29 07:02:47

标签: r interpolation

假设我有一个随机时间序列,我想在另一个时间序列上插值。我怎么能在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中使用插值函数。我应该在这里使用时间序列数据结构。

1 个答案:

答案 0 :(得分:3)

这并不是对OP的Q的直接回答,而是说明approx()如何运作,以便OP可以制定更好的Q

你的Q毫无意义。 approx()的工作原理是获取参考的x和y坐标集,然后进行插值,以便在y范围内的n个位置查找x ,或在用户提供的指定xout位置。

因此,在您的通话中,您未提供yx不包含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

这更接近你想要的吗?