2

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

我一直在使用 R 中的圆形包装,这似乎给了我正确的方法(尽管在越过 360 标记时使用负值而不是正值)。但是 sd 值太小了。关于可能出了什么问题,或者计算指南针方向的平均值和标准差的更好方法有什么想法吗?

下面的代码是我尝试测试我在各种罗盘方向上的平均值和 sd 计算,并与标准平均值和 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)
4

1 回答 1

2

当你加载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

如果要sd在加载后使用 base circular,请使用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
于 2017-04-14T16:20:01.970 回答