Grundsätzlich möchte ich nur anhand einiger Kurven eine skalare Reaktion vorhersagen. Ich bin so weit gekommen, eine Regression durchzuführen (mit fRegress aus dem FDA-Paket), habe aber keine Ahnung, wie ich die Ergebnisse auf einen NEUEN Satz von Kurven anwenden soll (zur Vorhersage).
Ich habe N = 536 Kurven und 536 skalare Antworten. Folgendes habe ich bisher getan:
- Ich habe eine Basis für die Kurven erstellt.
- Ich habe ein fdPar-Objekt erstellt, um eine Strafe einzuführen
- Ich habe das fd-Objekt mit glatt.basis erstellt, um die Kurven mit der gewählten Strafe auf der angegebenen Basis zu glätten.
- Ich habe mit fRegress () eine Regression ausgeführt und dabei die Kurven der Skalarantwort zurückgeführt.
Jetzt möchte ich nur noch diese Regression verwenden, um Vorhersagen für einen neuen Datensatz zu erstellen, den ich habe. Ich kann anscheinend keinen einfachen Weg finden, dies zu tun.
Prost
predict.fRegress
dienewdata
Option zu verwenden (aus dem FDA-Handbuch hier )?fda
Paket herumgespielt habe. Ich habe eine Antwort geschrieben, bei der Vorhersagen manuell abgerufen wurden, aber ein großer Teil davon ging verloren, weil sie nicht gespeichert wurden. Wenn mich jemand anderes nicht schlägt, sollte ich in ein paar Tagen eine Lösung für Sie haben.Antworten:
Die
fda
Verwendung von Inception- ähnlichen Objektstrukturen für Listen innerhalb von Listen innerhalb von Listen ist mir egal , aber meine Antwort wird sich an das System halten, das die Paketschreiber erstellt haben.Ich finde es lehrreich, zuerst darüber nachzudenken, was wir genau tun. Basierend auf Ihrer Beschreibung dessen, was Sie bisher getan haben, glaube ich, dass Sie dies tun (lassen Sie mich wissen, wenn ich etwas falsch interpretiert habe). Ich werde weiterhin die Notation verwenden und aufgrund fehlender realer Daten ein Beispiel aus der Funktionsdatenanalyse von Ramsay und Silverman sowie die Funktionsdatenanalyse von Ramsay, Hooker und Graves mit R und MATLAB (Einige der folgenden Gleichungen und Codes werden direkt aufgehoben aus diesen Büchern).
Wir modellieren eine skalare Antwort über ein funktionales lineares Modell, dh
Wir erweitern die in gewisser Weise. Wir verwenden beispielsweise Basisfunktionen. Damit,β K
In der Matrixnotation ist dies .β(s)=θ′(s)b
Wir erweitern auch die kovariaten Funktionen in einigen Basen (sagen wir Basisfunktionen). Damit,L
In der Matrixnotation ist dies wiederum .X(s)=Cψ(s)
Wenn wir also , kann unser Modell ausgedrückt werden alsJ=∫ψ(s)θ′(s)ds
Und wenn wir und , ist unser ModellZ=[1CJ] ξ=[β0b′]′
Und das kommt uns viel vertrauter vor.
Jetzt sehe ich, dass Sie eine Art Regularisierung hinzufügen. Das
fda
Paket arbeitet mit Rauheitsstrafen des Formularsfür einige linearen Differentialoperator . Jetzt kann gezeigt werden (Details hier weggelassen - es ist wirklich nicht schwer, dies zu zeigen), dass, wenn wir die Strafmatrix als definierenL R
wo in Bezug auf die Basis Ausbau der ist , dann minimieren wir die bestraft Summe der Quadrate:Ri βi
und so ist unser Problem nur eine Gratregression mit Lösung:
Ich habe das oben Gesagte durchgearbeitet, weil (1) ich denke, es ist wichtig, dass wir verstehen, was wir tun, und (2) einige der oben genannten Dinge notwendig sind, um einen Teil des Codes zu verstehen, den ich später verwenden werde. Weiter zum Code ...
Hier ist ein Datenbeispiel mit R-Code. Ich verwende den im
fda
Paket enthaltenen kanadischen Wetterdatensatz . Wir modellieren den logarithmischen Jahresniederschlag für eine Reihe von Wetterstationen über ein funktionelles lineares Modell und verwenden Temperaturprofile (die Temperaturen wurden 365 Tage lang einmal täglich aufgezeichnet) von jeder Station als funktionale Kovariaten. Wir werden ähnlich vorgehen, wie Sie es in Ihrer Situation beschreiben. Die Daten wurden an 35 Stationen aufgezeichnet. Ich werde den Datensatz in 34 Stationen aufteilen, die als meine Daten verwendet werden, und die letzte Station, die mein "neuer" Datensatz sein wird.Ich fahre mit R-Code und Kommentaren fort (ich gehe davon aus, dass Sie mit dem
fda
Paket so vertraut sind, dass nichts im Folgenden zu überraschend ist - wenn dies nicht der Fall ist, lassen Sie es mich bitte wissen):Als ich vor ungefähr einem Jahr zum ersten Mal über funktionale Daten unterrichtet wurde, habe ich mit diesem Paket herumgespielt. Ich konnte
predict.fRegress
mir auch nicht geben, was ich wollte. Wenn ich jetzt zurückblicke, weiß ich immer noch nicht, wie ich es dazu bringen soll, sich zu verhalten. Wir müssen die Vorhersagen also nur halb manuell abrufen. Ich werde Teile verwenden, für die ich direkt aus dem Code gezogen habefRegress()
. Wieder gehe ich über Code und Kommentare weiter.Zunächst das Setup:
Nun zu den Vorhersagen
Ich nehme nur den Code,∫T0Xi(s)β(s) Xi β
fRegress
mit dem er berechnetyhatfdobj
und leicht bearbeitet wird.fRegress
berechnetyhatfdobj
durch Schätzen des Integrals über die Trapezregel (wobei und in ihren jeweiligen Basen erweitert sind).Normalerweise
fRegress
werden die angepassten Werte berechnet, indem die in gespeicherten Kovariaten durchlaufen werdenannPrecTemp$xfdlist
. Für unser Problem ersetzen wir diese Kovariatenliste durch die entsprechende in unserer neuen Kovariatenliste, dtemplistNew
. H. Hier ist der Code (identisch mit dem Code, derfRegress
mit zwei Änderungen, einigen Löschungen von nicht benötigtem Code und einigen Kommentaren hinzugefügt wurde):(Hinweis: Wenn Sie sich diesen Block und den umgebenden Code in
fRegress
ansehen, werden die oben beschriebenen Schritte angezeigt.)Ich habe den Code getestet, indem ich das Wetterbeispiel mit allen 35 Stationen als Daten erneut ausgeführt und die Ausgabe der obigen Schleife mit verglichen habe
annPrecTemp$yhatfdobj
und alles übereinstimmt. Ich habe es auch ein paar Mal mit verschiedenen Stationen als "neue" Daten ausgeführt und alles scheint vernünftig.Lassen Sie mich wissen, wenn einer der oben genannten Punkte unklar ist oder wenn etwas nicht richtig funktioniert. Entschuldigen Sie die zu detaillierte Antwort. Ich konnte mir nicht helfen :) Und wenn Sie sie noch nicht besitzen, lesen Sie die beiden Bücher, mit denen ich diese Antwort geschrieben habe. Das sind wirklich gute Bücher.
quelle
nfine
und sehen, wie sehr sich das Integral ändert, aber ich vermute, es wird nicht viel bewirken. Was die Bestrafung angeht, ja, wir bestrafen in diesem Fall direkt die 's anstelle von ' s. Ramsay und Silverman diskutieren eine andere Strafmethode, die ohne Basisfunktionen schätzt, wobei wir die Strafe direkt auf anwenden . Beide Methoden führen zu einer Einschränkung der Glätte der Funktionen, aber ich bin mir nicht sicher, ob Sie den gleichen Effekt erzielen.