Ответ 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'