R циркуляр - Центр распределения - Среднее

У меня есть набор данных с количеством вхождений по месяцам, и я хотел бы рассчитать центр распределения / средний месяц. Если возможно, я также хотел бы иметь доверительные интервалы.

Я прочитал руководства для циркулярных и CircStats и посмотрел на подобные вопросы здесь и здесь.

Мне удалось получить, казалось бы, разумный результат в некоторых случаях, но не в других, и я еще не выяснил, как рассчитать доверительный интервал.

Чтобы проиллюстрировать мою точку зрения, вот некоторые фиктивные данные:

library(CircStats)

# The number of observations by month (Jan-Dec):
obsMonths1 <- c(12,15,1,2,3,1,1,4,1,2,7,1) 
obsMonths2 <- c(1,1,1,1,2,10,11,2,1,1,2,1)

# Convert data to radians:
obsRadians1 <- (obsMonths1/12*2)*pi
obsRadians2 <-(obsMonths2/12*2)*pi

# Calculate circular mean:
mean1 <- circ.mean(obsRadians1-1)#assume January is 0
mean2 <- circ.mean(obsRadians2-1)#assume January is 0

# Convert radians to months:
mean1*12/(2*pi)+12 
mean2*12/(2*pi)+12 

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

1 ответ

Похоже, ваш код не имеет проблем. Вы спросили "доверительный интервал", но не похоже, чтобы вы проводили какие-либо статистические тесты или процедуры начальной загрузки. Я не уверен, как бы вы рассчитали доверительный интервал без этих результатов в первую очередь. Если вы уверены, что поступили правильно, возможно, вы захотите поднять этот вопрос в сообществе StackExchange, специализирующемся на математике и статистике.

Я согласен, что ваши расчеты в основном верны; Я думаю, что это твоя интуиция не так, как я иллюстрирую ниже с некоторыми картинками.

library(CircStats)
# The number of observations by month (Jan-Dec):
obsMonths1 <- c(12,15,1,2,3,1,1,4,1,2,7,1) 
obsMonths2 <- c(1,1,1,1,2,10,11,2,1,1,2,1)

Я сделал преобразование в и из радиан немного по-другому; по модулю (%%) оператор автоматически конвертирует 12 в ноль. Я добавил 11, чтобы сделать январь ==0, но сохранить все позитивно...

to_rad <- function(x) (x+11 %% 12)/12*2*pi
## check results
stopifnot(to_rad(1)==0,to_rad(7)==pi,to_rad(4)==pi/2,to_rad(10)==3*pi/2)

И преобразовать обратно:

from_rad <- function(x) (12/(2*pi)*x)+1
## check round-trip with an arbitrary number
stopifnot(isTRUE(all.equal(from_rad(to_rad(7.931)),7.931)))

Конверсия:

(m1 <- from_rad(circ.mean(to_rad(obsMonths1))))  ## 1.77
(m2 <- from_rad(circ.mean(to_rad(obsMonths2))))  ## 0.93

Самозагрузочный код:

bootquant <- function(x,n=1000,alpha=0.05) {
    bootsamp  <- replicate(n,
                           from_rad(circ.mean(to_rad(sample(x,replace=TRUE)))))
    qq <- quantile(bootsamp,c(alpha/2,1-alpha/2))
    names(qq) <- c("lwr","upr")
    return(qq)
}
(bq1 <- bootquant(obsMonths1))
##      lwr      upr 
## 1.076794 2.670130 
(bq2 <- bootquant(obsMonths2))
##      lwr      upr 
## 0.231873 1.414766 

Я не уверен, что доверял бы начальной загрузке для таких небольших наборов данных; Вы также можете проверить ?circ.disp функция от CircStats...

library(ggplot2)
dd <- data.frame(OM1=obsMonths1,OM2=obsMonths2)
ggplot(dd,aes(x=OM1,y=1))+stat_sum()+coord_polar()+
    scale_x_continuous(limits=c(0,12), breaks=c(0,3,6,9,12))+
    annotate(geom="point",y=1,x=m1,colour="red")+
    annotate(geom="segment",x=bq1[["lwr"]],xend=bq1[["upr"]],y=1,yend=1,colour="red")

ggplot(dd,aes(x=OM2,y=1))+stat_sum()+coord_polar()+
    scale_x_continuous(limits=c(0,12), breaks=c(0,3,6,9,12))+
    annotate(geom="point",y=1,x=m2,colour="red")+
    annotate(geom="segment",x=bq2[["lwr"]],xend=bq2[["upr"]],y=1,yend=1,colour="red")

Другие вопросы по тегам