Интеграция выборочных данных в R - PullRequest
2 голосов
/ 02 июля 2011

У меня есть некоторые данные измерений, отобранные с течением времени, и я хочу интегрировать их, набор тестовых данных содержит ~ 100000 выборок (~ 100 с, 1000 Гц) данных.

Мой первый подход был (table содержит метку времени (0..100 с) и значение каждой точки данных (обе double с))

# 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)

, но каким-то образом интеграция выполняется вечно (как бесконечный цикл и съедаетодин процессор полностью).Поэтому я посмотрел на значения:

> 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

, это работает (время вычисления <3 с), но следующая оценка (должна быть такой же) </p>

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

тоже никогда не заканчивается.И даже этот (который на самом деле является СУБинтегралом того, что работает выше) НЕ завершается:

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

Мне кажется немного случайным, когда он работает, а когда нет.Я делаю что-то не так или я могу как-то улучшить процесс?

Спасибо!

(СОВЕТ: точки выборки не обязательно распределены одинаково )

1 Ответ

3 голосов
/ 02 июля 2011

Ekhem, ты знаешь, что можешь просто подвести итог?cumsum сделает это быстро:

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

Для неравных различий вы можете использовать:

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

Нет необходимости в более сложных числах, поскольку данные в этом случае оченьплотная выборка;тем не менее, всегда будут лучшие методы, чем использование интерполятора.

...