Básicamente, todo lo que quiero hacer es predecir una respuesta escalar usando algunas curvas. Llegué a hacer una regresión (usando fRegress del paquete fda) pero no tengo idea de cómo aplicar los resultados a un NUEVO conjunto de curvas (para la predicción).
Tengo N = 536 curvas y 536 respuestas escalares. Esto es lo que he hecho hasta ahora:
- He creado una base para las curvas.
- He creado un objeto fdPar para introducir una penalización.
- He creado el objeto fd usando smooth.basis para suavizar las curvas con la penalización elegida sobre la base especificada.
- He ejecutado una regresión usando fRegress (), regresando las curvas en la respuesta escalar.
Ahora, todo lo que me gustaría hacer es usar esa regresión para producir predicciones para un nuevo conjunto de datos que tengo. Parece que no puedo encontrar una manera fácil de hacer esto.
Salud
predict.fRegress
lanewdata
opción (del manual de la fda aquí )?fda
paquete. Estaba escribiendo una respuesta que implicaba obtener predicciones manualmente, pero una gran parte se perdió debido a que no se guardó. Si alguien más no me gana, debería tener una solución para usted en un par de días.Respuestas:
No me importa para
fda
su uso 's de Inception -como las estructuras objeto de lista dentro de otra lista dentro de otra lista, pero mi respuesta a acatar el sistema de los escritores han creado paquetes.Creo que es instructivo pensar primero en lo que estamos haciendo exactamente. Según su descripción de lo que ha hecho hasta ahora, esto es lo que creo que está haciendo (avíseme si he malinterpretado algo). Continuaré usando la notación y, debido a la falta de datos reales, un ejemplo del Análisis de datos funcionales de Ramsay y Silverman y el Análisis de datos funcionales de Ramsay, Hooker y Graves con R y MATLAB (Algunas de las siguientes ecuaciones y códigos se eliminan directamente de estos libros).
Estamos modelando una respuesta escalar a través de un modelo lineal funcional, es decir
Expandimos el de alguna manera. Usamos, digamos, funciones básicas. Entonces,Kβ K
En notación matricial, esto es .β(s)=θ′(s)b
También expandimos las funciones covariables en alguna base, también (digamos funciones base ). Entonces,L
Nuevamente, en notación matricial, esto es .X(s)=Cψ(s)
Y así, si dejamos , nuestro modelo puede expresarse comoJ=∫ψ(s)θ′(s)ds
Y si dejamos que y , nuestro modelo esξ = [ β 0Z=[1CJ] ξ=[β0b′]′
Y esto nos parece mucho más familiar.
Ahora veo que estás agregando algún tipo de regularización. El
fda
paquete funciona con penalidades de rugosidad de la forma.para algunos lineal operador diferencial . Ahora se puede mostrar (detalles aquí, no es difícil mostrar esto) que si definimos la matriz de penalización comoL R
donde es en términos de la expansión base de , entonces minimizamos la suma penalizada de cuadrados:Ri βi
y entonces nuestro problema es simplemente una regresión de cresta con solución:
Revisé lo anterior porque, (1) creo que es importante que comprendamos lo que estamos haciendo, y (2) parte de lo anterior es necesario para comprender parte del código que usaré más adelante. En el código ...
Aquí hay un ejemplo de datos con código R. Estoy usando el conjunto de datos meteorológicos canadienses que se proporciona en el
fda
paquete. Modelaremos el registro de precipitación anual para varias estaciones meteorológicas mediante un modelo lineal funcional y utilizaremos perfiles de temperatura (las temperaturas se registraron una vez al día durante 365 días) de cada estación como covariables funcionales. Vamos a proceder de manera similar a la forma en que usted describe su situación. Los datos se registraron en 35 estaciones. Dividiré el conjunto de datos en 34 estaciones, que se utilizarán como mis datos, y la última estación, que será mi "nuevo" conjunto de datos.Continúo a través del código R y los comentarios (supongo que está lo suficientemente familiarizado con el
fda
paquete de modo que nada de lo siguiente es demasiado sorprendente; si este no es el caso, hágamelo saber):Ahora, cuando me enseñaron por primera vez sobre datos funcionales hace aproximadamente un año, jugué con este paquete. Tampoco pude
predict.fRegress
darme lo que quería. Mirando hacia atrás ahora, todavía no sé cómo hacer que se comporte. Entonces, solo tendremos que obtener las predicciones semi-manualmente. Usaré piezas que saqué directamente del códigofRegress()
. Nuevamente, continúo por código y comentarios.Primero, la configuración:
Ahora para obtener las predicciones
Solo tomo el código que∫T0Xi(s)β(s) Xi β
fRegress
usa para calcularloyhatfdobj
y editarlo ligeramente.fRegress
calculayhatfdobj
estimando la integral través de la regla trapezoide (con y expandidos en sus respectivas bases). X i βNormalmente,
fRegress
calcula los valores ajustados recorriendo las covariables almacenadas enannPrecTemp$xfdlist
. Así que para nuestro problema, reemplazamos esta lista de covarianza con la que corresponde en nuestra nueva lista de covarianza, es decir,templistNew
. Aquí está el código (idéntico al código que se encuentrafRegress
con dos ediciones, algunas eliminaciones de código innecesario y un par de comentarios agregados):(nota: si observa este fragmento y el código circundante
fRegress
, verá los pasos que describí anteriormente).Probé el código volviendo a ejecutar el ejemplo del clima usando las 35 estaciones como nuestros datos y comparé la salida del bucle anterior
annPrecTemp$yhatfdobj
y todo coincide. También lo ejecuté un par de veces usando diferentes estaciones como mis "nuevos" datos y todo parece razonable.Avíseme si alguno de los puntos anteriores no está claro o si algo no funciona correctamente. Perdón por la respuesta demasiado detallada. No pude evitarlo :) Y si aún no los posee, consulte los dos libros que usé para escribir esta respuesta. Son realmente buenos libros.
fuente
nfine
y ver cuánto cambia la integral, pero supongo que no hará mucho. En cuanto a la penalización, sí, estamos penalizando directamente a los en lugar de a los en este caso. Ramsay y Silverman discuten otro método de penalización que estima sin funciones básicas donde aplicamos la penalización directamente a . Ambas formas están induciendo una restricción de suavidad en las funciones , pero no estoy seguro de si obtendrá el 'mismo efecto'. ß ß ß ß