将波形拟合到一组点并从中选择离散间隔

时间:2012-05-01 17:31:37

标签: r curve-fitting waveform spline wavelet

我有一个data.frame的值,其中的样本间隔时间不是精确的小时。样品形成未知幅度和周期的振荡波。我想估计每一小时的价值。

      hours value
60 63.06667 22657
61 64.00000 21535
62 64.93333 20797
63 65.86667 20687
64 66.80000 20129
65 67.73333 19671
66 68.66667 19066
67 69.60000 19534
68 70.53333 19994
69 71.46667 19575
70 72.40000 21466

R中有没有办法可以在这个数据集上拟合曲线,然后在我给定的点(63,64,65,66 ......)进行采样?我知道spline()但不知道如何让它给出'小时'的确切整数值。

编辑:为了澄清,这是我希望得到的结果数据框(带有'value'的虚拟条目)

   hours value
63.00000 22800
64.00000 21535
65.00000 20780
66.00000 20500
67.00000 20011
68.00000 ...
69.00000 ...
70.00000 ...
71.00000 ...
72.00000 ...
73.00000 ...

重新创建数据的代码:

structure(list(hours = c(63.06666647, 63.9999998, 64.93333313, 
65.86666646, 66.79999979, 67.73333312, 68.66666645, 69.59999978, 
70.53333311, 71.46666644, 72.39999977), value = c(22657L, 21535L, 
20797L, 20687L, 20129L, 19671L, 19066L, 19534L, 19994L, 19575L, 
21466L)), .Names = c("hours", "value"), row.names = 60:70, class = "data.frame")

2 个答案:

答案 0 :(得分:1)

使用Sean的答案,但使用splinefun工具创建自己的插值函数。在小时值的向量上运行如此创建的函数,以计算这些精确值的插值。 ?splinefun页面上给出的示例非常清楚。

答案 1 :(得分:0)

样条拟合的简单方法可能是:

D <- structure(list(hours = c(63.06666647, 63.9999998, 64.93333313, 
65.86666646, 66.79999979, 67.73333312, 68.66666645, 69.59999978, 
70.53333311, 71.46666644, 72.39999977), value = c(22657L, 21535L, 
20797L, 20687L, 20129L, 19671L, 19066L, 19534L, 19994L, 19575L, 
21466L)), .Names = c("hours", "value"), row.names = 60:70, class = "data.frame")

sm <- smooth.spline(D$hours, D$value, spar = 0.5)

或者您喜欢的spar的平滑因素

plot(D$hours, D$value)
lines(sm, col = "red")

您可以通过

从平滑样条线访问每小时的拟合y值
sm$y
[1] 22421.54 21682.93 21023.05 20469.70 19998.72 19634.10 19448.09 19506.52 19783.97
[10] 20251.24 20891.14