Zasadniczo wszystko, co chcę zrobić, to przewidzieć odpowiedź skalarną za pomocą niektórych krzywych. Dotarłem do regresji (używając fRegress z pakietu fda), ale nie mam pojęcia, jak zastosować wyniki do NOWEGO zestawu krzywych (do przewidywania).
Mam N = 536 krzywych i 536 odpowiedzi skalarnych. Oto co dotychczas zrobiłem:
- Stworzyłem podstawę dla krzywych.
- Stworzyłem obiekt fdPar w celu wprowadzenia kary
- Stworzyłem obiekt fd za pomocą smooth.basis, aby wygładzić krzywe wybraną karą na określonej podstawie.
- Przeprowadziłem regresję za pomocą fRegress (), regresując krzywe odpowiedzi skalarnej.
Teraz wszystko, co chciałbym zrobić, to użyć tej regresji do stworzenia prognoz dla nowego zestawu danych, które mam. Nie mogę znaleźć łatwego sposobu na zrobienie tego.
Twoje zdrowie
predict.fRegress
za pomocąnewdata
opcji (od instrukcji FDA tutaj )?fda
pakietem. Pisałem odpowiedź, która wymagała ręcznego uzyskiwania prognoz, ale duża część tego została utracona z powodu jej nie zapisania. Jeśli ktoś mnie nie pobije, powinienem mieć dla ciebie rozwiązanie za kilka dni.Odpowiedzi:
Nie dbam o
fda
„s wykorzystania Incepcja -Jak list-wewnątrz-listy-w całym wykazie struktur obiektów, ale moja odpowiedź będzie trwać przez system autorzy pakietów zostały utworzone.Myślę, że warto najpierw pomyśleć o tym, co dokładnie robimy. W oparciu o opis tego, co zrobiłeś do tej pory, robię to, co według mnie robisz (daj mi znać, jeśli coś źle zinterpretowałem). Będę nadal używać notacji, a ze względu na brak rzeczywistych danych, przykład z analizy danych funkcjonalnych Ramsaya i Silvermana oraz analizy danych funkcjonalnych Ramsaya, Hookera i Gravesa za pomocą R i MATLAB (niektóre z poniższych równań i kodu są podnoszone bezpośrednio z tych książek).
Modelujemy odpowiedź skalarną za pomocą funkcjonalnego modelu liniowego, tj
W pewnym stopniu rozszerzamy . Używamy, powiedzmy, funkcji bazowych K. Więc,β K
W notacji macierzowej jest to .β(s)=θ′(s)b
Rozszerzamy również funkcje współzmienne w pewnym stopniu (powiedzmy funkcje podstawowe ). Więc,L
Ponownie, w notacji macierzowej jest to .X(s)=Cψ(s)
A zatem, jeśli pozwolimy , nasz model można wyrazić jakoJ=∫ψ(s)θ′(s)ds
I wygląda nam to znacznie lepiej.
Teraz widzę, że dodajesz jakąś regularyzację.
fda
Pakiet współpracuje z chropowatości kar formularzadlatego naszym problemem jest jedynie regresja kalenicy z rozwiązaniem:
Przeszedłem powyższe, ponieważ: (1) myślę, że ważne jest, abyśmy rozumieli, co robimy, i (2) niektóre z powyższych są konieczne, aby zrozumieć część kodu, którego użyję później. Do kodu ...
Oto przykład danych z kodem R. Korzystam z kanadyjskiego zestawu danych pogodowych zawartych w
fda
pakiecie. Modelujemy dzienne opady atmosferyczne dla wielu stacji pogodowych za pomocą funkcjonalnego modelu liniowego i wykorzystujemy profile temperatur (temperatury rejestrowano raz dziennie przez 365 dni) z każdej stacji jako funkcjonalne zmienne towarzyszące. Postępujemy podobnie do tego, co opisujesz w swojej sytuacji. Dane rejestrowano na 35 stacjach. Podzielę zestaw danych na 34 stacje, które zostaną wykorzystane jako moje dane, oraz na ostatnią stację, która będzie moim „nowym” zestawem danych.Kontynuuję przez kod R i komentarze (zakładam, że znasz się na
fda
pakiecie tak, że nic poniżej nie jest zbyt zaskakujące - jeśli tak nie jest, daj mi znać):Teraz, gdy rok temu dowiedziałem się o danych funkcjonalnych, bawiłem się tym pakietem. Nie mogłem też
predict.fRegress
dać mi tego, czego chciałem. Patrząc na to teraz, wciąż nie wiem, jak to zrobić. Będziemy musieli więc uzyskać prognozy półautomatycznie. Będę używał elementów, dla których wyciągnąłem prosto z kodufRegress()
. Ponownie kontynuuję za pomocą kodu i komentarzy.Po pierwsze, konfiguracja:
Teraz, aby uzyskać prognozy
fRegress
yhatfdobj
fRegress
yhatfdobj
Zwykle
fRegress
oblicza dopasowane wartości, zapętlając zmienne towarzyszące zapisane wannPrecTemp$xfdlist
. Dlatego w przypadku naszego problemu zastępujemy tę listę zmiennych towarzyszących odpowiadającą jej na naszej nowej liście zmiennych, tjtemplistNew
. Oto kod (identyczny z kodem znalezionym wfRegress
dwóch edycjach, usunięciu niepotrzebnego kodu i dodaniu kilku komentarzy):(uwaga: jeśli spojrzysz na ten fragment i otaczający go kod
fRegress
, zobaczysz kroki, które przedstawiłem powyżej).Przetestowałem kod, ponownie uruchamiając przykład pogody, używając wszystkich 35 stacji jako naszych danych i porównałem wynik z powyższej pętli do
annPrecTemp$yhatfdobj
i wszystko pasuje. Uruchomiłem go również kilka razy, używając różnych stacji jako moich „nowych” danych i wszystko wydaje się rozsądne.Daj mi znać, jeśli którekolwiek z powyższych jest niejasne lub jeśli coś nie działa poprawnie. Przepraszamy za zbyt szczegółową odpowiedź. Nie mogłem się powstrzymać :) A jeśli jeszcze ich nie masz, sprawdź dwie książki, w których pisałem tę odpowiedź. To naprawdę dobre książki.
źródło
nfine