2017-04-14 81 views
1

我的目標是計算一系列指南針度數的平均值和標準偏差。由於我可能會超過360/0分,因此我無法使用標準均值或sd計算。使用圓圈計算指南針方向的標準差

我一直在R中使用圓形包裝,這似乎給了我正確的手段(雖然在穿越360標記而不是正值時使用負值)。但是sd值太小了。任何想法可能是錯誤的,或更好的方法來計算指南針方向的mean和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) 

回答

1

當您加載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加載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 
+0

如果我使用測試儀<-c(340,360,20 ),我得到了一個190的標準差。我希望找到一個可以彌合360/0點的SD計算,併爲這些數字給出20的標準差 – Vinterwoo