Chcę założyć, że temperatura powierzchni morza w Morzu Bałtyckim jest taka sama rok po roku, a następnie opisać to za pomocą modelu funkcyjnego / liniowego. Pomysł, jaki miałem, to po prostu wpisać rok jako liczbę dziesiętną (lub num_months / 12) i ustalić, jaka powinna być temperatura w tym czasie. Wrzucając go do funkcji lm () w R, nie rozpoznaje danych sinusoidalnych, więc po prostu tworzy linię prostą. Umieściłem więc funkcję sin () w nawiasie I () i wypróbowałem kilka wartości, aby ręcznie dopasować funkcję, i to zbliża się do tego, czego chcę. Ale morze rozgrzewa się szybciej latem, a potem stygnie wolniej jesienią ... Więc model jest błędny w pierwszym roku, potem poprawia się po kilku latach, a potem wydaje mi się, że w przyszłości będzie bardziej i jeszcze raz źle.
Jak sprawić, by R oszacował dla mnie model, więc nie muszę zgadywać liczb? Kluczem tutaj jest to, że chcę, aby produkowała te same wartości rok po roku, a nie tylko przez jeden rok. Gdybym wiedział więcej o matematyce, może mógłbym zgadnąć, że to coś w rodzaju Poissona lub Gaussa zamiast sin (), ale nie wiem też, jak to zrobić. Będziemy wdzięczni za każdą pomoc w zbliżeniu się do dobrej odpowiedzi.
Oto dane, których używam, i kod do pokazania dotychczasowych wyników:
# 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))
źródło
Temperatura podana w pytaniu jest powtarzana dokładnie co roku. Podejrzewam, że tak naprawdę nie są to zmierzone temperatury przez cztery lata. W twoim przykładzie nie potrzebujesz modelu, ponieważ temperatury tylko powtarzają się dokładnie. Ale w przeciwnym razie możesz użyć
nls
funkcji, aby dopasować krzywą sinusoidalną:Ale dopasowanie nie jest zbyt dobre, szczególnie na początku. Wygląda na to, że twoich danych nie można odpowiednio modelować za pomocą prostej krzywej sinusoidalnej. Może załatwi to bardziej złożona funkcja trygonometryczna?
Czerwona krzywa lepiej pasuje do danych. Dzięki tej
nls
funkcji możesz wprowadzić model, który Twoim zdaniem jest odpowiedni.A może możesz skorzystać z
forecast
pakietu. W poniższym przykładzie założyłem, że szereg czasowy rozpoczął się w styczniu 2010 r .:Ponieważ dane są deterministyczne, nie pokazano pasm ufności.
źródło
lm()
tak, jak wszystkie inne predyktory. Innymi słowy,lm()
nie trzeba wcale widzieć trygonometrii. Jednak może być potrzebny inny model, aby dobrze uchwycić zaznaczoną asymetrię. Nie jestem zwykłym użytkownikiem R, ale często korzystałem z tego podejścia gdzie indziej (patrz stata-journal.com/sjpdf.html?articlenum=st0116 ).