【问题标题】:Integration sampled data in R在 R 中集成采样数据
【发布时间】:2011-09-27 00:38:32
【问题描述】:

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

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

# 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

它可以工作(计算时间

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

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

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

对我来说,当它起作用和不起作用时,它似乎有点随机。我做错了什么还是我可以以某种方式改进流程?

谢谢!

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

【问题讨论】:

  • integrate() 努力查看函数在何处归零。以前曾报道过不稳定的结果。在详细信息部分中您阅读:“像所有数值积分例程一样,这些例程在有限的点集上评估函数。如果函数在几乎所有范围内近似恒定(特别是零),则结果和错误可能估计可能严重错误。”

标签: r integration interpolation measurement


【解决方案1】:

Ekhem,你知道你可以总结一下吗? cumsum 会很快做到这一点:

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

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

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

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

【讨论】:

  • 只有在所有 t 的差异为 1 的情况下,这才是积分。
  • 正确,cumsum 方法仅适用于所有数据值均等分布的情况。然后你可以使用cumsum(table$val[1:length(table$val)-1]) * (table$t[2]-table$t[1])。不幸的是,我的数据不一定平均分布:-(
  • @Johannes 据我所知,它们是——差异可以忽略不计。不过我会升级我的答案。
  • @mbq:对:该数据集应该具有均匀分布的样本。无论如何,我不能假设,我想有一个通用的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2018-06-18
相关资源
最近更新 更多