[R] linear interpolation of multiple random time series
jim holtman
jholtman at gmail.com
Thu Jul 19 20:44:38 CEST 2007
This should do it for you:
> x <- read.table(textConnection("trial time x
+ 1 1 1
+ 1 5 4
+ 1 7 9
+ 1 12 20
+ 2 1 0
+ 2 3 5
+ 2 9 10
+ 2 13 14
+ 2 19 22
+ 2 24 32"), header=TRUE)
> # compute for each trial
> trial.list <- lapply(split(x, x$trial), function(set){
+ .xval <- seq(min(set$time), max(set$time))
+ .yval <- approx(set$time, set$x, xout=.xval)$y
+ cbind(trial=set$trial[1], time=.xval, x=.yval)
+ })
> do.call('rbind', trial.list)
trial time x
[1,] 1 1 1.000000
[2,] 1 2 1.750000
[3,] 1 3 2.500000
[4,] 1 4 3.250000
[5,] 1 5 4.000000
[6,] 1 6 6.500000
[7,] 1 7 9.000000
[8,] 1 8 11.200000
[9,] 1 9 13.400000
[10,] 1 10 15.600000
[11,] 1 11 17.800000
[12,] 1 12 20.000000
[13,] 2 1 0.000000
[14,] 2 2 2.500000
[15,] 2 3 5.000000
[16,] 2 4 5.833333
[17,] 2 5 6.666667
[18,] 2 6 7.500000
[19,] 2 7 8.333333
[20,] 2 8 9.166667
[21,] 2 9 10.000000
[22,] 2 10 11.000000
[23,] 2 11 12.000000
[24,] 2 12 13.000000
[25,] 2 13 14.000000
[26,] 2 14 15.333333
[27,] 2 15 16.666667
[28,] 2 16 18.000000
[29,] 2 17 19.333333
[30,] 2 18 20.666667
[31,] 2 19 22.000000
[32,] 2 20 24.000000
[33,] 2 21 26.000000
[34,] 2 22 28.000000
[35,] 2 23 30.000000
[36,] 2 24 32.000000
>
On 7/19/07, Mike Lawrence <Mike.Lawrence at dal.ca> wrote:
> Hi all,
>
> Looking for tips on how I might more optimally solve this. I have
> time series data (samples from a force sensor) that are not
> guaranteed to be sampled at the same time values across trials. ex.
>
> trial time x
> 1 1 1
> 1 5 4
> 1 7 9
> 1 12 20
> 2 1 0
> 2 3 5
> 2 9 10
> 2 13 14
> 2 19 22
> 2 24 32
>
> Within each trial I'd like to use linear interpolation between each
> successive time sample to fill in intermediary timepoints and x-
> values, ex.
>
> trial time x
> 1 1 1
> 1 2 1.75
> 1 3 2.5
> 1 4 3.25
> 1 5 4
> 1 6 6.5
> 1 7 9
> 1 8 11.2
> 1 9 13.4
> 1 10 15.6
> 1 11 17.8
> 1 12 20
> 2 1 0
> 2 2 2.5
> 2 3 5
> 2 4 5.83333333333333
> 2 5 6.66666666666667
> 2 6 7.5
> 2 7 8.33333333333333
> 2 8 9.16666666666667
> 2 9 10
> 2 10 11
> 2 11 12
> 2 12 13
> 2 13 14
> 2 14 15.3333333333333
> 2 15 16.6666666666667
> 2 16 18
> 2 17 19.3333333333333
> 2 18 20.6666666666667
> 2 19 22
> 2 20 24
> 2 21 26
> 2 22 28
> 2 23 30
> 2 24 32
>
>
> The solution I've coded (below) involves going through the original
> data frame line by line and is thus very slow (indeed, I had to
> resort to writing to file as with a large data set I started running
> into memory issues if I tried to create the new data frame in
> memory). Any suggestions on a faster way to achieve what I'm trying
> to do?
>
> #assumes the first data frame above is stored as 'a'
> arows = (length(a$x)-1)
> write('', 'temp.txt')
> for(i in 1:arows){
> if(a$time[i+1] > a$time[i]){
> write.table(a[i,], 'temp.txt', row.names = F, col.names = F, append
> = T)
> x1 = a$time[i]
> x2 = a$time[i+1]
> dx = x2-x1
> if(dx != 1){
> y1 = a$x[i]
> y2 = a$x[i+1]
> dy = y2-y1
> slope = dy/dx
> int = -slope*x1+y1
> temp=a[i,]
> for(j in (x1+1):(x2-1)){
> temp$time = j
> temp$x = slope*j+int
> write.table(temp, 'temp.txt', row.names = F, col.names = F,
> append = T)
> }
> }
> }else{
> write.table(a[i,], 'temp.txt', row.names = F, col.names = F, append
> = T)
> }
> }
> i=i+1
> write.table(a[i,], 'temp.txt', row.names = F, col.names = F, append = T)
>
> b=read.table('temp.txt',skip=1)
> names(b)=names(a)
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
--
Jim Holtman
Cincinnati, OH
+1 513 646 9390
What is the problem you are trying to solve?
More information about the R-help
mailing list