Подтвердить что ты не робот

"круговое" среднее значение в R

Учитывая набор данных за несколько месяцев, как я могу рассчитать "средний" месяц, учитывая, что месяцы являются круговыми?

months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333

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

4b9b3361

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