"круговое" среднее в 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'
Другие вопросы по тегам