使用 Circular 计算罗盘方向的 SD

Calculating SD of compass directions using Circular

我的目标是计算一系列罗盘度数的平均值和标准偏差。由于我可能会超过 360/ 0 标记,因此我无法使用标准均值或 sd 计算。

我一直在使用 R 中的圆形包装,这似乎给了我正确的方法(尽管在超过 360 度标记时使用负值而不是正值)。但是 sd 值太小了。有什么想法可能是错误的,或者有更好的方法来计算罗盘方向的均值和标准差吗?

下面的代码是我尝试测试我在各种罗盘方向上的均值和标准差计算,并与标准均值和标准差计算进行比较(除非我越过 360/ 0 标记,否则它们应该一致)

library(circular)

Tester<-c(20,40,60)
Tester<-c(340,360,20)
Tester<-c(340,0,20)
Tester<-c(300,320,340)
Tester<-c(160,180,200)

ToCirc<- circular(Tester, type="angles", units="degrees",rotation="clock")

mean(ToCirc)
sd(ToCirc)
mean(Tester)
sd(Tester)

当您加载 circular 时,它有一个单独的 sd 函数以不同方式计算循环数据的标准偏差。

#DATA
Tester<-c(160,180,200)
ToCirc<- circular(Tester, type="angles", units="degrees",rotation="clock")


sd(ToCirc)
#[1] 0.2864803

#The above is equivalent to 
r = rho.circular(ToCirc) #Resultant Length
sqrt(-2*log(r)) #Then sd
#[1] 0.2864803

如果要在加载circular后使用base的sd,请使用sd.default

sd.default(ToCirc)
#[1] 20

#which is equal to
sd.default(Tester)
#[1] 20

或者自己计算一切

Tester<-c(340,360,20)
sine = sum(sin(Tester * pi/180)) #sin of each angle, convert to radian first
cosine = sum(cos(Tester * pi/180)) #cos of each angle, convert to radian first

Tester_mean = (atan2(sine, cosine) * 180/pi) %% 360

mu = (Tester - Tester_mean + 180) %% 360 - 180 #Difference of each angle from mean
Tester_sd = sqrt(sum(mu^2)/(length(Tester) - 1)) #Standard Deviation

Tester_mean
#[1] 0
Tester_sd
#[1] 20