интерполировать ряд над другим рядом в R - PullRequest
1 голос
/ 29 марта 2011

Предположим, если у меня есть случайный временной ряд, который я хочу интерполировать по другому временному ряду. Как бы я сделал это в 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' над серией 's'. Предположим, что ряд временного интервала для ряда 'x' имеет 20 элементов, равномерно распределенных по интервалу [0,1]. Теперь я хочу интерполировать те 10 элементов из «x», которые появляются через интервалы времени, описанные «s».

EDIT: Я думаю, что это делает работу.

> 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 Ответ

3 голосов
/ 29 марта 2011

Это не означает, что это прямой ответ на вопрос ОП, а скорее для иллюстрации того, как работает approx(), чтобы ОП мог сформулировать лучший 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 в n = 20 равномерно расположенных местах в диапазоне s (0,1).

Редактировать : если x представляет серию в неустановлено интервалы времени равномерны по 0,1, и вы хотите интерполированные значения x на интервалах времени 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

Это ближе к тому, что вы хотите?

...