"круговое" среднее в R
Учитывая набор данных месяцев, как рассчитать "средний" месяц, принимая во внимание, что месяцы являются круговыми?
months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333
В этом фиктивном примере среднее значение должно быть в январе или декабре. Я вижу, что есть пакеты для циклической статистики, но я не уверен, что они соответствуют моим потребностям здесь.
1 ответ
Я думаю
months <- c(1,1,1,2,3,5,7,9,11,12,12,12)
library("CircStats")
conv <- 2*pi/12 ## months -> radians
Теперь пересчитайте месяцы в радианы, вычислите среднее значение по кругу и верните обратно в месяцы. Я вычитаю 1 здесь, предполагая, что январь в "0 радианах"/12 часов...
(res1 <- circ.mean(conv*(months-1))/conv)
Результат -0,3457. Вы можете захотеть:
(res1 + 12) %% 12
что дает 11,65, то есть частично в течение декабря (так как мы все еще находимся в 0= январь, 11= декабрьская шкала)
Я думаю, что это правильно, но не проверил это слишком тщательно.
Для чего это стоит, CircStats::circ.mean
Функция очень проста - она может не стоить затрат на загрузку пакета, если это все, что вам нужно:
function (x)
{
sinr <- sum(sin(x))
cosr <- sum(cos(x))
circmean <- atan2(sinr, cosr)
circmean
}
Включая умную альтернативу @A.Webb из комментариев:
m <- mean(exp(conv*(months-1)*1i))
12+Arg(m)/conv%%12 ## 'direction', i.e. average month
Mod(m) ## 'intensity'