Math - weighted average?
posted by Kate on .
I need to create some type of formula that will allow me to interpolate values at specific points in a data set. My data is something like this: I have a list of times, and there are values associated with those times like this:
1 100 103 105
2 103 101 107
3 102 104 108
4.5 107 107 105
7 105 106 104
I need to correct the times (and the corresponding values) so that each timestamp is one second apart. My professor said that the best way to do this would be with a weighted average.
I'm finding it difficult to find a formula that seems correct. I tried solving for the correct time value, ie:
4 = ((3+4.5)/2)x
Where x= the unknown weight, 4 is the corrected timestamp value, and 3 and 4.5 are the known time values. This gives me an X of 16/15. This process works when I know what the value should be (as with the timestamps), but I don't know what the interpolated reading values should be. I thought that maybe once I found the "weight" from the timestamps I could use it to interpolate the readings, but this doesn't seem to provide a reasonable answer. (ie, plugging in 16/15 for x in the equation ((102+107)/2)x provides a value of 111.47, which doesn't make sense). I also thought about multiplying the average by some sort of percent difference from the target value, but this doesn't seem to work either.
The dataset I have is very large so ideally I'd like to find a formula that I can use in a program to do the calculations for me, rather than doing each calculation by hand. Any help or insight would be appreciated.
if you understand interpolation, and you seem to, just think of it this way.
If the value you want is, say, 2/3 of the way from one known value to the next, the readings will also be 2/3 of the way from one value to the next.
so, if you want to place values at 1-unit intervals, you need to step through the given timestamps and whenever you find two timestamps greater than one unit apart, interpolate.
3 and 4.5 are greater than 1 unit apart, so, since 4 is 2/3 of the way between 3 and 4.5, you will generate values 2/3 of the way between those at 3, and those at 4.5.
Since 7 is more than 1 unit away from 4.5, you need to generate data points for times of 5 and 6.
5 is 1/5 of the way from 4 to 7.5
6 is 3/5 of the way.
so, given x-values and y-values,
if xn+1 - xn > 1,
for each number xk between xn and xn+1,
yk = yn + (xk-xn)/(xn+1-xn) * (yn+1-yn)
small oops. 5 is 2/7 of the way from 4 to 7.5, and 6 is 4/7, and 7 is 6/7.
This made a lot of sense, thank you for responding! It was able to incorporate it into my program and it seems to work.