【问题标题】:Calculating SD of compass directions using Circular使用圆形计算指南针方向的 SD
【发布时间】:2017-09-10 20:21:15
【问题描述】:

我的目标是计算一系列罗盘度数的平均值和标准偏差。由于我可能会越过 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)

【问题讨论】:

    标签: r mean standard-deviation degrees radians


    【解决方案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
    

    如果要在加载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
    

    【讨论】:

    • 如果我使用 Tester
    猜你喜欢
    • 2015-09-07
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多