360 -> 0'ı geçtiğinde bir açının eğilimini hesaplama
İki nesnenin göreceli konumunu tanımlayan bir açıyı ölçen bir değişkenim var (yani, 0-359 arasında değişebilir) ve bunun zaman içinde nasıl değiştiğini ölçmek istiyorum.
Örneğin, burada her yıl 1 derece değişen iki öğenin göreceli konumlarına sahibiz:
year <- seq(1981, 2020)
angle <- c(seq(341, 359), seq(0, 20))
Ancak burada eğimi almak, 2000 yılında meydana gelen "crossover" nedeniyle anlamsızdır. Bir takım farklı örneklerim var ve bazılarında bu sorun var, bazılarında yok. Hangi örneklemlerin bu sorunu yaşayacağını önceden bilmiyorum , ne zaman geçiş gerçekleştiğini bilmiyorum, bu yüzden sadece bir çeşit ofset uygulayamam (yani, son 20 yıla 360 ekleyemiyorum).
0 = 360 olduğu gerçeğini hesaba katarak açısal eğilimleri hesaplamanın kabul edilmiş bir yolu var mı?
Yanıtlar
Açıyı düşün $y$ her zaman $t$açıda küçük değişikliklerin birikimi olarak. Sembolik olarak, ne zaman$f(t)$ açının zamandaki değişim oranı $t$ ve $t_0$ gözlemlerin başlangıcıdır,
$$y(t) = y(t_0) + \int_{t_0}^t f(t)\,\mathrm{d}t.$$
Senin sorunun şu $y(t)$ modulo kaydedildi $360$ derece - belki bazı hatalarla $\epsilon(t).$ Yani sadece değerleri gözlemlediniz
$$y^{*}(t) = y(t) + \epsilon(t) \mod 360.$$
Bununla birlikte, yeniden inşa edebilirsiniz $y(t) + \epsilon(t)$Yeterince sık gözlem yapmanız şartıyla. Ardışık zamanlar için$t \lt s,$ farkına varmak
$$y^{*}(s) - y^{*}(t) = y(s) - y(t) + \epsilon(s) - \epsilon(t) \mod 360 = \int_t^s f(t)\,\mathrm{d}t + \delta$$
nerede $\delta$ hataların katkısına eşittir $\epsilon(s)-\epsilon(t)$ artı, belki de bazı integral katları$360$ arasında açısal bir kopuş olduğu zaman $y^{*}(t)$ ve $y^{*}(s).$Şimdi, toplam hatanın boyutu sağlandı$|\epsilon(s)-\epsilon(t)|$ daha az $180$derece ve açının birden fazla dönmemesi koşuluyla, bir kırılma olup olmadığını anlayabiliriz: eğer$|\epsilon(s)-\epsilon(t)| \gt 180,$ ekle veya çıkar $360$ derece $\delta$ onu aralığa yerleştirmek için $-180$ -e $+180$ derece.
Bu hataları doğrudan gözlemleyemesek de, artışları yapacak kadar sık örnekleme yapıyorsak $y(t_i) - y(t_{i-1})$oldukça küçükse, bu ayarlamayı sadece gözlemlenen farklılıklara uygularız. Böylece,
Her ne zaman $|y^{*}(s)-y^{*}(t)| \gt 180,$ ekle veya çıkar $360$ derece $\delta$ onu aralığa yerleştirmek için $-180$ -e $+180$ derece.
Eşdeğer olarak, modulo farkları hesaplayın $180$ ancak bunları şu aralıkta ifade edin: $-180$ -e $+180$ (geleneksel olduğu gibi) aralık yerine derece $0$ -e $360.$
Ayarlanan değeri diyelim $\delta^{*}(t,s),$ Böylece
$$y^{*}(s) - y^{*}(t) = \int_t^s f(t)\,\mathrm{d}t + \delta(t,s)^{*}.$$
Bu eşitliktir, eşitlik modülü değil$360.$ Şimdi açıları modulo kaydetmenin etkisini kaldırabiliriz $360$bu düzeltilmiş farklılıkları toplayarak. Zaman zaman gözlemler yapıldığında$t_0 \lt t_1\lt \cdots \lt t_n,$ sahibiz
$$\begin{aligned} y^{*}(t_i) &= y^{*}(t_0) + \left[y^{*}(t_1) - y^{*}(t_0)\right] + \cdots + \left[y^{*}(t_i) - y^{*}(t_{i-1})\right] \\ &=y(t_0) + \int_{t_0}^{t_i} f(t)\,\mathrm{d}t + \delta(t_0,t_1)^{*} + \delta(t_1,t_2)^{*} + \cdots + \delta(t_{i-1},t_i)^{*} \\ &= y(t_i) + \left[\epsilon(t_i) - \epsilon(t_0)\right]. \end{aligned}$$
Hesaplama modülü ile ilgili problem $360$gitti: artık yanıtı modellemek için istediğiniz herhangi bir prosedürü kullanabilirsiniz$y^{*}(t).$
İşte oldukça zor bir veri kümesine sahip bir örnek. Veriler modele göre oluşturulmuştur$y(t) = 30t \mod 360$ve 2020 ile 1980 yıllık olarak görülmektedir iid Normal standart sapma hata dağıtılmış$60$ derece (büyük miktarda).
Trend, ham verilerde zar zor farkediliyor, ancak açı ayarlama algoritması onları gözle görülür şekilde hizaladı. Ayarlanan verilere bir en küçük kareler modeli sığdırabiliriz, örneğin şu sonucu üreterek:
Ham veriler için genişletilmiş dikey ölçek, uyumun ayrıntılarını ve bunlardan sapmalarını gösterir. Bu arada, bu örnekte eğim tahmini şu şekildedir:$28.0 \pm 0.74$ derece, gerçek değerinden dikkate değer ölçüde farklı değil $30$ derece (bu karşılaştırmanın p değeri $1.1\%$).
Hataların standart sapması olduğunda şunu belirterek bitireceğim $\epsilon(t)$ büyük (büyüktür $180/2/\sqrt{2} \approx 64$derece, kabaca), bazen açısal ayar yanlış olacaktır. Bu, model kalıntılarında 360 derece civarında ani bir değişim olarak görünecektir. Böylece, model kalıntılarının rutin bir analizi bu tür sorunları tespit edebilir ve daha iyi bir uyum için ayarlanmış değerleri değiştirmenize olanak tanır. Bunun ayrıntıları modelinize ve montaj prosedürüne bağlı olacaktır.
Bu Rkod rakamları oluşturdu. "Açıları ayarla" da açı ayarının nasıl verimli bir şekilde hesaplanabileceğini gösterir.
#
# Specify the data-generation process.
#
year <- 1980:2020 # Dates to use
beta <- 30 # Annual rate of change
sigma <- 60 # Error S.D.
#
# Generate the data.
#
set.seed(17)
angle <- (year * beta + rnorm(length(year), 0, sigma)) %% 360
X <- data.frame(year, angle)
#
# Adjust the angles.
#
X$`total angle` <- with(X, { d <- (diff(angle) + 180) %% 360 - 180 cumsum(c(angle[1], d)) }) # # Fit a model to the adjusted angles. # fit <- lm(`total angle` ~ year, X) # # Analyze the fit. # b <- coefficients(fit) y.hat <- predict(fit) #--Compute dates the fit must wrap around from 360 to 0: y.breaks <- seq(floor(min(y.hat) / 360)*360, max(y.hat), by=360) year.breaks <- (y.breaks - b[1]) / b[2] #--Make the plots: u <- ceiling(max(X$`total angle`)/360)
par(mfcol=c(1,2))
#--The fits:
plot(X$year, X$angle, pch=19, ylim=c(0, 360), yaxp=c(0, 360, 4),
col="gray", ylab="Angle (degrees)", xlab="Year",
main="Raw Data and Fit")
for (x in year.breaks)
abline(c(-x * b[2], b[2]), col="Red", lwd=2)
plot(X$year, X$`total angle`, ylim=c(0,u*360), yaxp=c(0, u*360, u),
xlab="Year", ylab="Total angle",
main="Adjusted Data and Fit")
abline(fit, col="Red", lwd=2)
#--The raw data:
plot(X$year, X$angle, ylim=c(0,u*360), yaxp=c(0, u*360, u),
pch=19, col="gray", ylab="Angle (degrees)", xlab="Year",
main="Raw Data")
plot(X$year, X$`total angle`, ylim=c(0,u*360),
yaxp=c(0, u*360, u),
xlab="Year", ylab="Total angle",
main="Adjusted Data")
par(mfcol=c(1,1))