การคำนวณแนวโน้มของมุมเมื่อข้าม 360 -> 0
ฉันมีตัวแปรที่วัดมุมที่อธิบายตำแหน่งสัมพัทธ์ของวัตถุสองชิ้น (กล่าวคือสามารถอยู่ในช่วง 0-359) และฉันต้องการหาปริมาณว่าสิ่งนี้เปลี่ยนแปลงไปอย่างไรตามกาลเวลา
ตัวอย่างเช่นที่นี่เรามีตำแหน่งสัมพัทธ์ของทั้งสองรายการเปลี่ยนไป 1 องศาต่อปี:
year <- seq(1981, 2020)
angle <- c(seq(341, 359), seq(0, 20))

อย่างไรก็ตามการใช้ความชันตรงนี้ไม่มีความหมายเนื่องจาก "ครอสโอเวอร์" ที่เกิดขึ้นในปี 2000 ฉันมีตัวอย่างที่แตกต่างกันจำนวนหนึ่งและบางตัวอย่างก็มีปัญหานี้และบางส่วนก็ไม่มี ผมไม่ทราบว่าเบื้องต้นซึ่งตัวอย่างจะมีปัญหานี้หรือเมื่อครอสโอเวอร์เกิดขึ้นดังนั้นผมจึงไม่สามารถใช้การจัดเรียงของการชดเชยบางส่วน (เช่นเพิ่ม 360 ในช่วง 20 ปีที่ผ่านมา)
มีวิธีที่ยอมรับในการคำนวณแนวโน้มเชิงมุมโดยคำนึงถึงข้อเท็จจริงที่ว่า 0 = 360 หรือไม่?
คำตอบ
ลองนึกถึงมุมกลับ $y$ เวลาไหนก็ได้ $t$เป็นการสะสมของการเปลี่ยนแปลงเล็กน้อยในมุม ในเชิงสัญลักษณ์เมื่อ$f(t)$ คืออัตราการเปลี่ยนแปลงของมุม ณ เวลา $t$ และ $t_0$ เป็นจุดเริ่มต้นของการสังเกต
$$y(t) = y(t_0) + \int_{t_0}^t f(t)\,\mathrm{d}t.$$
ปัญหาของคุณคือ $y(t)$ ได้รับการบันทึก modulo $360$ องศา - อาจมีข้อผิดพลาดบางอย่าง $\epsilon(t).$ นั่นคือคุณได้สังเกตเฉพาะค่า
$$y^{*}(t) = y(t) + \epsilon(t) \mod 360.$$
อย่างไรก็ตามคุณสามารถสร้างใหม่ได้ $y(t) + \epsilon(t)$หากคุณมีการสังเกตบ่อยพอสมควร เป็นเวลาต่อเนื่อง$t \lt s,$ แจ้งให้ทราบล่วงหน้า
$$y^{*}(s) - y^{*}(t) = y(s) - y(t) + \epsilon(s) - \epsilon(t) \mod 360 = \int_t^s f(t)\,\mathrm{d}t + \delta$$
ที่ไหน $\delta$ เท่ากับการมีส่วนร่วมของข้อผิดพลาด $\epsilon(s)-\epsilon(t)$ บวกบางทีอินทิกรัลพหุคูณของ$360$ เมื่อใดก็ตามที่มีการแบ่งเชิงมุมระหว่าง $y^{*}(t)$ และ $y^{*}(s).$ตอนนี้ระบุขนาดของข้อผิดพลาดทั้งหมด$|\epsilon(s)-\epsilon(t)|$ น้อยกว่า $180$องศาและหากมุมไม่ได้ไปรอบ ๆ มากกว่าหนึ่งครั้งเราจะทราบได้ว่าเกิดการแตกหักหรือไม่: ถ้า$|\epsilon(s)-\epsilon(t)| \gt 180,$ บวกหรือลบ $360$ องศาจาก $\delta$ เพื่อวางลงในช่วงเวลาจาก $-180$ ถึง $+180$ องศา
แม้ว่าเราจะไม่สามารถสังเกตข้อผิดพลาดเหล่านี้ได้โดยตรง แต่หากเราสุ่มตัวอย่างบ่อยพอที่จะเพิ่มขึ้น $y(t_i) - y(t_{i-1})$ค่อนข้างเล็กเราใช้การปรับเปลี่ยนนี้กับความแตกต่างที่สังเกตได้ ด้วยประการฉะนี้
เมื่อใดก็ตาม $|y^{*}(s)-y^{*}(t)| \gt 180,$ บวกหรือลบ $360$ องศาจาก $\delta$ เพื่อวางลงในช่วงเวลาจาก $-180$ ถึง $+180$ องศา
คำนวณความแตกต่างของโมดูโลในทางเดียวกัน $180$ แต่แสดงในช่วงจาก $-180$ ถึง $+180$ องศามากกว่า (ตามปกติ) ช่วงจาก $0$ ถึง $360.$
เรียกว่าค่าที่ปรับแล้ว $\delta^{*}(t,s),$ ดังนั้น
$$y^{*}(s) - y^{*}(t) = \int_t^s f(t)\,\mathrm{d}t + \delta(t,s)^{*}.$$
นี่คือความเท่าเทียมกันไม่ใช่โมดูโลความเท่าเทียมกัน$360.$ ตอนนี้เราสามารถลบเอฟเฟกต์ของการบันทึกโมดูโลมุมได้ $360$โดยการสรุปความแตกต่างที่ปรับปรุงแล้วเหล่านี้ เมื่อมีการสังเกตในบางครั้ง$t_0 \lt t_1\lt \cdots \lt t_n,$ เรามี
$$\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}$$
ปัญหาเกี่ยวกับโมดูโลการคำนวณ $360$หายไป: ตอนนี้คุณสามารถใช้ขั้นตอนใดก็ได้ที่คุณต้องการสร้างแบบจำลองการตอบสนอง$y^{*}(t).$
นี่คือภาพประกอบที่มีชุดข้อมูลที่ค่อนข้างยาก ข้อมูลถูกสร้างขึ้นตามแบบจำลอง$y(t) = 30t \mod 360$และตั้งข้อสังเกตจากปี 1980 ผ่าน 2020 กับIIDปกติกระจายข้อผิดพลาดของการเบี่ยงเบนมาตรฐาน$60$ องศา (จำนวนมาก)

แนวโน้มนี้แทบไม่สามารถมองเห็นได้ในข้อมูลดิบ แต่อัลกอริทึมการปรับมุมได้จัดแนวไว้อย่างชัดเจน เราอาจปรับให้พอดีกับรูปแบบกำลังสองน้อยที่สุดกับข้อมูลที่ปรับเปลี่ยนเช่นให้ผลลัพธ์นี้:

มาตราส่วนแนวตั้งที่ขยายออกสำหรับข้อมูลดิบจะแสดงรายละเอียดของความพอดีและความเบี่ยงเบนจากข้อมูลนั้น อนึ่งในตัวอย่างนี้ค่าประมาณของความชันคือ$28.0 \pm 0.74$ องศาไม่แตกต่างอย่างมากจากมูลค่าที่แท้จริงของ $30$ องศา (ค่า p สำหรับการเปรียบเทียบนี้คือ $1.1\%$).
ฉันจะปิดท้ายด้วยการตั้งข้อสังเกตว่าเมื่อค่าเบี่ยงเบนมาตรฐานของข้อผิดพลาด $\epsilon(t)$ มีขนาดใหญ่ (มากกว่า $180/2/\sqrt{2} \approx 64$องศาโดยประมาณ) บางครั้งการปรับมุมจะไม่ถูกต้อง สิ่งนี้จะปรากฏในส่วนที่เหลือของโมเดลเป็นการเปลี่ยนแปลงอย่างกะทันหันโดยมีค่าประมาณ 360 องศา ดังนั้นการวิเคราะห์ตามปกติของส่วนที่เหลือของโมเดลสามารถตรวจพบปัญหาดังกล่าวทำให้คุณสามารถปรับเปลี่ยนค่าที่ปรับแล้วเพื่อให้พอดียิ่งขึ้น รายละเอียดจะขึ้นอยู่กับรุ่นของคุณและขั้นตอนการติดตั้ง
R
รหัสนี้สร้างตัวเลข ที่ "ปรับมุม" จะแสดงให้เห็นว่าสามารถคำนวณการปรับมุมได้อย่างมีประสิทธิภาพอย่างไร
#
# 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))