आर में अर्ध-साइनसॉइडल मॉडल के लिए एक अच्छा फिट कैसे खोजें?


37

मैं यह मान लेना चाहता हूं कि बाल्टिक सागर की समुद्री सतह का तापमान साल दर साल एक ही है, और फिर एक फ़ंक्शन / रैखिक मॉडल के साथ इसका वर्णन करें। मेरे पास विचार केवल एक दशमलव संख्या (या num_months / 12) के रूप में इनपुट वर्ष का था और उस समय के बारे में पता होना चाहिए कि तापमान क्या होना चाहिए। आर में इसे lm () फ़ंक्शन में फेंकने से, यह साइनसोइडल डेटा को नहीं पहचानता है, इसलिए यह सिर्फ एक सीधी रेखा पैदा करता है। इसलिए मैंने I () ब्रैकेट के भीतर पाप () फ़ंक्शन को रखा और फ़ंक्शन को मैन्युअल रूप से फिट करने के लिए कुछ मानों की कोशिश की, और जो मुझे चाहिए वह करीब हो जाता है। लेकिन समुद्र गर्मियों में तेजी से गर्म हो रहा है और फिर गिरावट में धीमी गति से ठंडा हो रहा है ... इसलिए मॉडल पहले साल गलत है, फिर कुछ वर्षों के बाद अधिक सही हो जाता है, और फिर भविष्य में मुझे लगता है कि यह अधिक हो जाता है और फिर से गलत।

मैं अपने लिए मॉडल का अनुमान लगाने के लिए आर कैसे प्राप्त कर सकता हूं, इसलिए मुझे स्वयं संख्याओं का अनुमान लगाने की आवश्यकता नहीं है? यहां कुंजी यह है कि मैं चाहता हूं कि यह साल-दर-साल उसी मूल्यों का उत्पादन करे, न कि केवल एक वर्ष के लिए सही हो। अगर मैं गणित के बारे में अधिक जानता था, तो शायद मैं इसे पाप के बजाय पॉइज़न या गाऊसी की तरह कुछ कर सकता हूं, लेकिन मुझे नहीं पता कि यह कैसे करना है। एक अच्छे उत्तर के करीब आने के लिए किसी भी मदद की बहुत सराहना की जाएगी।

यहां वह डेटा है जो मैं उपयोग करता हूं, और अब तक परिणाम दिखाने के लिए कोड:

# SST from Bradtke et al 2010
ToY <- c(1/12,2/12,3/12,4/12,5/12,6/12,7/12,8/12,9/12,10/12,11/12,12/12,13/12,14/12,15/12,16/12,17/12,18/12,19/12,20/12,21/12,22/12,23/12,24/12,25/12,26/12,27/12,28/12,29/12,30/12,31/12,32/12,33/12,34/12,35/12,36/12,37/12,38/12,39/12,40/12,41/12,42/12,43/12,44/12,45/12,46/12,47/12,48/12)
Degrees <- c(3,2,2.2,4,7.6,13,16,16.1,14,10.1,7,4.5,3,2,2.2,4,7.6,13,16,16.1,14,10.1,7,4.5,3,2,2.2,4,7.6,13,16,16.1,14,10.1,7,4.5,3,2,2.2,4,7.6,13,16,16.1,14,10.1,7,4.5)
SST <- data.frame(ToY, Degrees)
SSTlm <- lm(SST$Degrees ~ I(sin(pi*2.07*SST$ToY)))
summary(SSTlm)
plot(SST,xlim=c(0,4),ylim=c(0,17))
par(new=T)
plot(data.frame(ToY=SST$ToY,Degrees=8.4418-6.9431*sin(2.07*pi*SST$ToY)),type="l",xlim=c(0,4),ylim=c(0,17))

जवाबों:


44

यह रैखिक प्रतिगमन के साथ किया जा सकता है -

आपको प्रत्येक आवृत्ति पर बस एक और a शब्द की आवश्यकता होती है।sincos

किसी भी आयाम और चरण के साथ मौसमी को संभालने के लिए एक रेखीय प्रतिगमन में आप एक और शब्द का उपयोग क्यों कर सकते हैं इसका कारण निम्न त्रिकोणमितीय पहचान है :sincos

आयाम और चरण , साथ एक 'सामान्य' साइन तरंग , रैखिक संयोजन रूप में लिखा जा सकता है जहाँ और ऐसे हैं कि और । आइए देखें कि दोनों समान हैं:AφAsin(x+φ)asinx+bcosxabA=a2+b2sinφ=ba2+b2

asin(x)+bcos(x)=a2+b2(aa2+b2sin(x)+ba2+b2cos(x))=A[sin(x)cos(φ)+cos(x)sin(φ)]=Asin(x+φ).

यहाँ 'बुनियादी' मॉडल है:

 SSTlm <- lm(Degrees ~ sin(2*pi*ToY)+cos(2*pi*ToY),data=SST)
 summary(SSTlm)

[स्निप]

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)              8.292      0.135   61.41   <2e-16 *** 
sin(2 * pi * ToY)       -5.916      0.191  -30.98   <2e-16 ***  
cos(2 * pi * ToY)       -4.046      0.191  -21.19   <2e-16 *** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 0.9355 on 45 degrees of freedom
Multiple R-squared: 0.969,      Adjusted R-squared: 0.9677 
F-statistic: 704.3 on 2 and 45 DF,  p-value: < 2.2e-16 

 plot(Degrees~ToY,ylim=c(1.5,16.5),data=SST)
 lines(SST$ToY,SSTlm$fitted,col=2)

पाप फिट

संपादित करें: महत्वपूर्ण नोट - अवधि काम करती है क्योंकि फ़ंक्शन की अवधि को सेट किया गया है ताकि एक अवधि = 1 यूनिट । यदि अवधि 1 से भिन्न है , तो लें कि अवधि , तो आपको इसके बजाय ।2πttω(2π/ω)t

यहाँ दूसरा हार्मोनिक वाला मॉडल है:

 SSTlm2 <- lm(Degrees ~ sin(2*pi*ToY)+cos(2*pi*ToY)
                        +sin(4*pi*ToY)+cos(4*pi*ToY),data=SST)
 summary(SSTlm2)

[स्निप]

Coefficients:
                  Estimate Std. Error  t value Pr(>|t|)    
(Intercept)        8.29167    0.02637  314.450  < 2e-16 ***  
sin(2 * pi * ToY) -5.91562    0.03729 -158.634  < 2e-16 ***  
cos(2 * pi * ToY) -4.04632    0.03729 -108.506  < 2e-16 ***  
sin(4 * pi * ToY)  1.21244    0.03729   32.513  < 2e-16 ***  
cos(4 * pi * ToY)  0.33333    0.03729    8.939 2.32e-11 ***  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 0.1827 on 43 degrees of freedom
Multiple R-squared: 0.9989,     Adjusted R-squared: 0.9988 
F-statistic:  9519 on 4 and 43 DF,  p-value: < 2.2e-16 

 plot(Degrees~ToY,ylab="Degrees",xlab="ToY",ylim=c(1.5,16.5),data=SST)
 lines(SSTlm2$fitted~ToY,col=2,data=SST)

पाप फिट २

... और आगे, 6*pi*ToYआदि के साथ । अगर डेटा में थोड़ा शोर होता तो मैं शायद इस दूसरे मॉडल के साथ रुक जाता।

पर्याप्त शर्तों के साथ आप असममित और दांतेदार आवधिक अनुक्रमों को पूरी तरह से फिट कर सकते हैं, लेकिन परिणामस्वरूप फिट हो सकता है 'wiggle'। यहां sawtoothतीसरे (लाल) और चौथे (हरे) हार्मोनिक्स के साथ एक असममित फ़ंक्शन (यह एक आराध्य है - आपके आवधिक कार्य के एक छोटे संस्करण में जोड़ा गया है)। हरे रंग की फिट औसतन थोड़ी करीब है, लेकिन "विगली" (फिट हर बिंदु से गुजरने पर भी, फिट अंक के बीच बहुत विगली हो सकती है)।

पाप फिट 3 & 4

यहाँ आवधिकता का अर्थ है कि डेटा में मौसमी मॉडल के लिए केवल 12 df उपलब्ध है। मॉडल में अवरोधन के साथ, आपके पास केवल 11 अतिरिक्त मौसमी मापदंडों के लिए स्वतंत्रता की पर्याप्त डिग्री है। चूंकि आप प्रत्येक हार्मोनिक के साथ दो शब्द जोड़ रहे हैं , अंतिम हार्मोनिक जिसे आप फिट कर सकते हैं, केवल आपको उनमें से एक को अंतिम कार्यकाल के लिए अनुमति देगा , छठा हार्मोनिक (और यह कि एक को होना चाहिए ; शब्द सभी होगा- शून्य, जबकि कॉस 1 और -1 के बीच वैकल्पिक है)।पापcossin

यदि आप चाहते हैं कि गैर-चिकनी श्रृंखला पर इस दृष्टिकोण की तुलना में जो फिट बैठता है तो वह चिकना हो, तो आप समय-समय पर तंदुरुस्त फिट में देखना चाहते हैं ।

अभी तक एक अन्य दृष्टिकोण मौसमी डमी का उपयोग करना है, लेकिन यदि यह एक चिकनी आवधिक कार्य है, तो पाप / कॉस दृष्टिकोण अक्सर बेहतर होता है।

मौसमी के लिए इस तरह का दृष्टिकोण उन स्थितियों के लिए भी अनुकूल हो सकता है, जहां मौसमी परिवर्तन हो रहा है, जैसे कि ट्रिगोनोमेट्रिक या डमी मौसमी का उपयोग अन्य अंतरिक्ष मॉडल के साथ।


जबकि यहाँ चर्चा की गई रैखिक मॉडल दृष्टिकोण का उपयोग करना सरल है, @ COOLSerdash के nonlinear प्रतिगमन दृष्टिकोण का एक फायदा यह है कि यह स्थितियों की एक विस्तृत श्रृंखला के साथ सौदा कर सकता है - जब आप ऐसी स्थिति में होते हैं, जब आप रैखिक स्थिति में नहीं होते हैं प्रतिगमन अब उपयुक्त नहीं है, लेकिन नॉनलाइनियर कम से कम वर्ग अभी भी उपयोग किया जा सकता है ( अज्ञात अवधि एक ऐसा मामला होगा)।


बहुत बढ़िया! धन्यवाद, मुझे वास्तव में आवृत्तियों से निपटने के तरीकों के बारे में अधिक जानने की कोशिश करनी चाहिए। मुझे यह समझ में नहीं आया कि कॉस भाग की आवश्यकता क्यों है, लेकिन सिद्धांत को जानने से इसे लागू करना आसान हो जाता है।
गयरू

@COOLSerdash - वास्तव में, मेरी इच्छा है कि आपने अपना उत्तर नहीं हटाया था (वास्तव में मैंने इसे अपडाउन किया था); इसमें परिस्थितियों के बहुत व्यापक सरणी में काम करने का लाभ है; समस्या के बारे में कुछ बातें बताएं और आप रैखिकता खो सकते हैं - और फिर मेरा दृष्टिकोण बेकार है, लेकिन आपका अभी भी काम करता है। मुझे लगता है कि इस तरह से करने में सक्षम होने के लिए बहुत कुछ कहा जा सकता है।
ग्लेन_ब

@Glen_b आह क्षमा करें, मुझे लगा कि आपकी पोस्ट ने मुझे निरर्थक बना दिया है क्योंकि मैंने समस्या से निपटने के मानक तरीके का उपयोग नहीं किया है। मैंने इसे हटा दिया।
COOLSerdash

@Gayu मेरे उत्तर के शीर्ष के पास, मेरा संपादन देखें, जहाँ मैं इस बात की रूपरेखा देता हूँ कि क्यों में जोड़ना चाल करता है। cos
Glen_b

1
वह मैं नहीं था .... आप कहते हैं कि चरण ऑफसेट नाम के रूप में अगर है कि क्या हो रहा है, और यह गणितीय करता है। लेकिन आपके लिए प्रमुख बिंदु यह होने की अधिक संभावना है कि 31 दिसंबर / 1 जनवरी को विकिरण रसीद में भिन्नता के लिए तापमान प्रतिक्रिया में दिए गए वर्ष के समय के लिए एक मनमाना मूल है। इसलिए चरण ऑफसेट कुछ जलवायु के लिए भी एक नाम है, जो आपके रिकॉर्डिंग सिस्टम के सापेक्ष न्यूनतम और अधिकतम तापमान का समय है। (यह एक मामूली विवरण है, लेकिन मैं 12 महीने के लिए 1/24, 3/24, ..., 23/24 के रूप में वर्ष का समय निर्धारित करना पसंद करता हूं।)
निक कॉक्स

10

आपके प्रश्न में जो तापमान आप प्रदान करते हैं वह हर साल बिल्कुल दोहराता है। मुझे संदेह है कि यह वास्तव में चार वर्षों में तापमान मापा नहीं गया है। आपके उदाहरण में, आपको एक मॉडल की आवश्यकता नहीं होगी, क्योंकि तापमान बस बिल्कुल दोहराता है। लेकिन अन्यथा आप nlsसाइन वक्र फिट करने के लिए फ़ंक्शन का उपयोग कर सकते हैं :

ToY <- c(1/12,2/12,3/12,4/12,5/12,6/12,7/12,8/12,9/12,10/12,11/12,12/12,13/12,14/12,15/12,16/12,17/12,18/12,19/12,20/12,21/12,22/12,23/12,24/12,25/12,26/12,27/12,28/12,29/12,30/12,31/12,32/12,33/12,34/12,35/12,36/12,37/12,38/12,39/12,40/12,41/12,42/12,43/12,44/12,45/12,46/12,47/12,48/12)
Degrees <- c(3,2,2.2,4,7.6,13,16,16.1,14,10.1,7,4.5,3,2,2.2,4,7.6,13,16,16.1,14,10.1,7,4.5,3,2,2.2,4,7.6,13,16,16.1,14,10.1,7,4.5,3,2,2.2,4,7.6,13,16,16.1,14,10.1,7,4.5)
SST <- data.frame(ToY, Degrees)

par(cex=1.5, bg="white")
plot(Degrees~ToY,xlim=c(0,4),ylim=c(0,17), pch=16, las=1)

nls.mod <-nls(Degrees ~ a + b*sin(2*pi*c*ToY), start=list(a = 1, b = 1, c=1))

co <- coef(nls.mod) 
f <- function(x, a, b, c) {a + b*sin(2*pi*c*x) }

curve(f(x, a=co["a"], b=co["b"], c=co["c"]), add=TRUE ,lwd=2, col="steelblue")

एनएलएस फिट

लेकिन फिट बहुत अच्छा नहीं है, खासकर शुरुआत में। ऐसा लगता है कि आपके डेटा को साधारण साइन वक्र द्वारा पर्याप्त रूप से मॉडल नहीं किया जा सकता है। शायद एक अधिक जटिल त्रिकोणमितीय फ़ंक्शन चाल करेगा?

nls.mod2 <-nls(Degrees ~ a + b*sin(2*pi*c*ToY)+d*cos(2*pi*e*ToY), start=list(a = 1, b = 1, c=1, d=1, e=1))

co2 <- coef(nls.mod2) 
f <- function(x, a, b, c, d, e) {a + b*sin(2*pi*c*x)+d*cos(2*pi*e*x) }

curve(f(x, a=co2["a"], b=co2["b"], c=co2["c"], d=co2["d"], e=co2["e"]), add=TRUE ,lwd=2, col="red")

एनएलएस 2 फिट

लाल वक्र डेटा को बेहतर तरीके से फिट करता है। nlsफ़ंक्शन के साथ , आप उस मॉडल में रख सकते हैं जो आपको लगता है कि उपयुक्त है।

या हो सकता है कि आप forecastपैकेज का उपयोग कर सकें । नीचे दिए गए उदाहरण में, मैंने मान लिया है कि जनवरी 2010 में समय श्रृंखला शुरू हुई:

library(forecast)

Degrees.ts <- ts(Degrees, start=c(2010,1), frequency=12)

Degree.trend <- auto.arima(Degrees.ts)

degrees.forecast <- forecast(Degree.trend, h=12, level=c(80,95), fan=F)

plot(degrees.forecast, las=1, main="", xlab="Time", ylab="Degrees")

ARIMA

क्योंकि डेटा नियतात्मक है, कोई विश्वास बैंड नहीं दिखाया गया है।


4
यहाँ ग़ैर-कम-वर्ग के लिए कोई कारण नहीं है, ऐसा नहीं है कि यह यथोचित काम नहीं करेगा। पहले से पाप (2 * pi * ToY), cos (2 * pi * ToY) की गणना करें और उन्हें lm()किसी अन्य भविष्यवक्ताओं की तरह ही खिलाएं । दूसरे शब्दों में, lm()किसी भी त्रिकोणमिति को देखने की आवश्यकता नहीं है। हालांकि, आपको चिह्नित विषमता को अच्छी तरह से पकड़ने के लिए एक और मॉडल की आवश्यकता हो सकती है। मैं एक नियमित आर उपयोगकर्ता नहीं हूं, लेकिन मैंने अक्सर इस दृष्टिकोण का उपयोग कहीं और किया है (देखें stata-journal.com/sjpdf.html?articlenum=st0116 )।
निक कॉक्स

@NickCox धन्यवाद निक, यह बहुत उपयोगी सलाह है। मैं अपने उत्तर को थोड़ा सा अपडेट करूंगा।
COOLSerdash

ग्लेन तेज था :)
COOLSerdash

1
@COOLserdash मैंने निक कॉक्स की टिप्पणी को भी नहीं देखा है; यह तब आया जब मैं अपना जवाब दे रहा था। (यह दृष्टिकोण बहुत स्पष्ट है यदि आपने कोई फूरियर श्रृंखला देखी है।)
ग्लेन_ब

2
जैसा कि @Glen_b का तात्पर्य है, यह एक मानक दृष्टिकोण है, बस सार्वभौमिक रूप से ज्ञात नहीं है।
निक कॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.