在R中集成采样数据

时间:2011-07-01 20:20:42

标签: r integration interpolation measurement

我有一些测量数据随时间采样并希望对其进行整合,test dataset包含~100000个样本(~100s,1000Hz)的数据。

我的第一个方法是(table包含时间戳(0..100s)和每个数据点的值(两个double s))

# test dataset available (gzipped, 720k) here: http://tux4u.de/so.rtab.gz
table <- read.table("/tmp/so.rtab", header=TRUE)
time <- table$t
data <- table$val
start <- min(time)
stop <- max(time)
sampling_rate <- 1000
divs <- (max(time) - min(time)) * sampling_rate
data_fun <- approxfun(time, data, method="linear", 0, 0)
result <- integrate(data_fun, start, stop, subdivisions=divs)

但不知何故,集成会永远运行(就像一个无限循环并完全占用一个CPU)。所以我查看了这些值:

> start
[1] 0
> stop
[1] 98.99908
> divs
[1] 98999.08

奇怪的是,当我评估时

> integrate(data_fun, 0, 98, subdivisions=100000)$value + integrate(data_fun, 98, 99)$value
[1] 2.640055

它起作用(计算时间<3s)但是下面的评估(应该是相同的)

> integrate(data_fun, 0, 99, subdivisions=100000)$value

永远不会终止。甚至这一个(实际上是上面工作的那个的整体)也不会终止:

> integrate(data_fun, 0, 89, subdivisions=100000)$value

当它起作用时,它似乎有点随机,当它不起作用时。我做错了什么或者我能以某种方式改进过程吗?

谢谢!

(提示:采样点不一定均匀分布

1 个答案:

答案 0 :(得分:3)

Ekhem,你知道你可以总结一下吗? cumsum会快速执行此操作:

cumsum(table$val)*diff(table$t)[1]

对于不平等的差异,您可以使用:

cumsum(table$val[-nrow(table)]*diff(table$t))

不需要更复杂的数字,因为在这种情况下的数据是非常密集的采样;尽管如此,总会有比通过插补器更好的方法。