Используя ваш фрагмент данных в объекте dat
, мы можем делать то, что (я думаю) вы хотите. Сначала мы напишем небольшую функцию-обертку, которая соответствует сглаживающему сплайну через smooth.spline()
, а затем прогнозируем ответ от этого сплайна для набора n
местоположений. Вы запрашиваете n = 48
, поэтому мы будем использовать его по умолчанию.
Вот одна из таких функций-оболочек:
SSpline <- function(x, y, n = 48, ...) {
## fit the spline to x, and y
mod <- smooth.spline(x, y, ...)
## predict from mod for n points over range of x
pred.dat <- seq(from = min(x), to = max(x), length.out = n)
## predict
preds <- predict(mod, x = pred.dat)
## return
preds
}
Мы проверяем это работает для первой строки ваших данных:
> res <- SSpline(time, dat[1, 2:9])
> res
$x
[1] 0.000000 0.893617 1.787234 2.680851 3.574468 4.468085 5.361702
[8] 6.255319 7.148936 8.042553 8.936170 9.829787 10.723404 11.617021
[15] 12.510638 13.404255 14.297872 15.191489 16.085106 16.978723 17.872340
[22] 18.765957 19.659574 20.553191 21.446809 22.340426 23.234043 24.127660
[29] 25.021277 25.914894 26.808511 27.702128 28.595745 29.489362 30.382979
[36] 31.276596 32.170213 33.063830 33.957447 34.851064 35.744681 36.638298
[43] 37.531915 38.425532 39.319149 40.212766 41.106383 42.000000
$y
[1] 0.052349585 0.001126837 -0.049851737 -0.100341294 -0.150096991
[6] -0.198873984 -0.246427429 -0.292510695 -0.336721159 -0.378381377
[11] -0.416785932 -0.451229405 -0.481006377 -0.505411429 -0.523759816
[16] -0.535714043 -0.541224748 -0.540251293 -0.532753040 -0.518689349
[21] -0.498019582 -0.470750611 -0.437182514 -0.397727107 -0.352796426
[26] -0.302802508 -0.248157388 -0.189272880 -0.126447574 -0.059682959
[31] 0.011067616 0.085850805 0.164713260 0.247701633 0.334851537
[36] 0.425833795 0.519879613 0.616194020 0.713982047 0.812448724
[41] 0.910799082 1.008296769 1.104781306 1.200419068 1.295380186
[46] 1.389834788 1.483953003 1.577904960
> plot(time, dat[1, 2:9])
> lines(res, col = "blue")
, что дает:
Кажется, это работает, поэтому теперь мы можем применить функцию к набору данных, оставив только компонент $y
объекта, возвращаемого SSpline()
. Для этого мы используем apply()
:
> res2 <- apply(dat[, 2:9], 1,
+ function(y, x, ...) { SSpline(x, y, ...)$y },
+ x = time)
> head(res2)
1 2 3 4 5 6
[1,] 0.052349585 -0.02500000 0.21250000 -0.06117869 -0.02153366 -0.02295792
[2,] 0.001126837 -0.04293509 0.17175460 -0.10994988 -0.06538250 -0.06191095
[3,] -0.049851737 -0.06407856 0.12846458 -0.15838412 -0.10899505 -0.10074427
[4,] -0.100341294 -0.09168227 0.08005550 -0.20614476 -0.15213426 -0.13933920
[5,] -0.150096991 -0.12899810 0.02395291 -0.25289514 -0.19456304 -0.17757705
[6,] -0.198873984 -0.17927793 -0.04241763 -0.29829862 -0.23604434 -0.21533911
Теперь res2
содержит 48 строк и 6 столбцов, 6 столбцов относятся к каждой строке dat
, используемой здесь. Если вы хотите наоборот, просто транспонируйте res2
: t(res2)
.
Мы можем увидеть, что было сделано с помощью простого matplot()
вызова:
> matplot(x = seq(min(time), max(time), length = 48),
+ y = res2, type = "l")
, который производит: