Ich möchte annehmen, dass die Meeresoberflächentemperatur der Ostsee Jahr für Jahr gleich ist, und dies dann mit einem Funktions- / Linearmodell beschreiben. Die Idee, die ich hatte, war, einfach das Jahr als Dezimalzahl (oder num_months / 12) einzugeben und herauszufinden, wie hoch die Temperatur zu dieser Zeit sein sollte. Wenn es in R in die Funktion lm () geworfen wird, erkennt es keine sinusförmigen Daten und erzeugt nur eine gerade Linie. Also habe ich die sin () - Funktion in eine I () - Klammer gesetzt und ein paar Werte ausprobiert, um die Funktion manuell anzupassen, und das kommt meinem Wunsch sehr nahe. Aber das Meer erwärmt sich im Sommer schneller und kühlt sich dann im Herbst langsamer ab ... Das Modell ist also im ersten Jahr falsch, wird dann nach ein paar Jahren korrekter, und in Zukunft wird es wahrscheinlich auch mehr und wieder mehr falsch.
Wie kann ich R veranlassen, das Modell für mich zu schätzen, damit ich selbst keine Zahlen erraten muss? Der Schlüssel hier ist, dass ich möchte, dass es Jahr für Jahr die gleichen Werte liefert und nicht nur für ein Jahr korrekt ist. Wenn ich mehr über Mathematik wüsste, könnte ich es vielleicht als etwas wie Poisson oder Gaußsches statt Sünde () ansehen, aber ich weiß auch nicht, wie ich das machen soll. Jede Hilfe, um einer guten Antwort näher zu kommen, wäre sehr dankbar.
Hier sind die Daten, die ich verwende, und der Code, um die bisherigen Ergebnisse anzuzeigen:
# 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))
quelle
Die Temperatur, die Sie in Ihrer Frage angeben, wiederholt sich genau jedes Jahr. Ich vermute, das sind keine wirklich gemessenen Temperaturen über vier Jahre. In Ihrem Beispiel benötigen Sie kein Modell, da sich die Temperaturen genau wiederholen. Ansonsten könnten Sie die
nls
Funktion verwenden, um eine Sinuskurve anzupassen:Die Passform ist aber vor allem zu Beginn nicht sehr gut. Es scheint, dass Ihre Daten durch eine einfache Sinuskurve nicht angemessen modelliert werden können. Vielleicht reicht eine komplexere trigonometrische Funktion aus?
Die rote Kurve passt besser zu den Daten. Mit der
nls
Funktion können Sie das Modell eingeben, das Sie für angemessen halten.Oder vielleicht könnten Sie das
forecast
Paket nutzen. Im folgenden Beispiel habe ich angenommen, dass die Zeitreihe im Januar 2010 gestartet wurde:Da die Daten deterministisch sind, werden keine Vertrauensbereiche angezeigt.
quelle
lm()
wie alle anderen Prädiktoren weiter. Mit anderen Worten,lm()
muss überhaupt keine Trigonometrie sehen. Möglicherweise benötigen Sie jedoch ein anderes Modell, um die ausgeprägte Asymmetrie gut zu erfassen. Ich bin kein regulärer R-Benutzer, habe diesen Ansatz jedoch an anderer Stelle häufig verwendet (siehe stata-journal.com/sjpdf.html?articlenum=st0116 ).