Как найти центроид временного ряда? Центроид используется в гидрологии для определения временного интервала между дождем и стоком.

Центроид также называется центром тяжести гидрографа (среднее значение даты и времени, взвешенное по значению). Я привожу наглядный пример, чтобы было понятно. Наиболее важная необходимая информация - это время центроида, в случае ниже 08:29.

Hydrograph with centroid marked with a cross

Кто-нибудь знает, как это можно вычислить? Я использую xts для своих временных рядов, но, вероятно, могу конвертировать. Вот мой пример данных:

flow <- structure(c(0, 0.1, 1.21, 3.26, 5.54, 7.5, 9.12, 9.59, 9.41, 
                 8.82, 7.89, 6.74, 5.94, 5.3, 3.67, 3.06, 2.08, 1.46, 0.95, 0.54, 
                 0.13, 0.02, 0), .Dim = c(23L, 1L), index = structure(c(1156918500, 
                 1156919400, 1156920300, 1156921200, 1156922100, 1156923000, 1156923900, 
                 1156924800, 1156925700, 1156926600, 1156927500, 1156928400, 1156929300, 
                 1156930200, 1156931100, 1156932000, 1156932900, 1156933800, 1156934700, 
                 1156935600, 1156936500, 1156937400, 1156938300), tzone = "GMT", 
                 tclass = c("POSIXct", "POSIXt")), class = c("xts", "zoo"), 
                 .indexCLASS = c("POSIXct", "POSIXt"), 
                 tclass = c("POSIXct", "POSIXt"), .indexTZ = "GMT", tzone = "GMT", 
                 .Dimnames = list(NULL, structure("Flow", .Dim = c(1L, 1L))))

Я не мог найти никакого кода R для этого ни здесь, ни с помощью Google.

r
1
Johanna Sörensen 11 Фев 2021 в 19:17

1 ответ

Лучший ответ

Вот ответы - спасибо @pseudospin и @ g-grothendieck!

Версия 1

as.POSIXct(sum(flow * attr(flow, 'index'))/sum(flow), origin = "1970-01-01")

Версия 2

tt <- as.numeric(time(flow))
as.POSIXct(weighted.mean(tt, flow), origin = "1970-01-01")
2
Johanna Sörensen 15 Фев 2021 в 08:49