5.3 Altitude Controller
5.3.4 Altitude Hold Controller
uras en Andaluc´ıa
Se dispone de las temperaturas medias para 13 zonas geogr´aficas de Andaluc´ıa, en un periodo de 120 meses. Dado el comportamiento c´ıclico de las mismas, y con objeto de apreciar las diferencias con m´as claridad, se ha trabajado con 13 trayectorias muestrales de 24 observaciones cada una.
En primer lugar se trabaja s´olo con las observaciones correspondientes a la zona del Alto Guadalquivir.
En la figura (5.5) se representan las curvas obtenidas por cada m´etodo y para diferentes n´umero de nodos b´asicos, con bases de B-splines. Tambi´en se muestra el gr´afico con las funciones medias.
Se ha fijado el n´umero de nodos b´asicos en 5, y λ = 0,001 para los P- splines y para los Splines de suavizado se han elegido mediante el procedi- miento interno de validaci´on cruzada generalizada que contiene la funci´on
smooth.splines. Con ello, se ha trabajado con las 13 curvas, calculando
los errores cuadr´aticos medios respecto de la funci´on en los instantes de observaci´on para cada curva y m´etodo. En la figura (5.6) se presentan los di-
Aplicaciones con R 43
S.Regresión S.Suavizado P−splines Modelos.Mixtos
0.05 0.10 0.15 0.20 0.25 0.30 0.35
Diagrama de cajas y bigotes
ECM
S.Regresión S.Suavizado P−splines Modelos.Mixtos
0.1 0.2 0.3 0.4 0.5 0.6
Diagrama de cajas y bigotes
ECM
m=150 m= 50
Figura 5.4: Diagramas de cajas con bigotes para el ECM de las curvas ajustadas con Splines de regresi´on, Splines de suavizado, P-splines y P- splines como modelos mixtos, usando 5 nodos para las bases y λi = 2, 0,01
respectivamente para P-splines y Splines de suavizado.
ferentes diagramas de cajas y bigotes para estos errores. Se puede ver como las metodolog´ıas con Splines de regresi´on y P-splines tienen distribuciones muy similares. Es de destacar que en esta aplicaci´on los ajustes con splines de suavizado presentan mayores errores cuadr´aticos medios.
Finalmente, en la figura (5.7) se presentan las 13 curvas ajustadas me- diante P-splines como modelos mixtos, para las trayectorias muestrales con 120 observaciones, utilizando 40 nodos para las bases de B-splines.
5 10 15 20 0 10 20 30 40 Splines de regresión Mes T emper atur a xi(t) 5 nodos 15 nodos 20 nodos 5 10 15 20 0 10 20 30 40 Splines de suavizado Mes T emper atur a xi(t) 5 nodos 15 nodos 20 nodos 5 10 15 20 0 10 20 30 40 P−splines Mes T emper atur a xi(t) 5 nodos 15 nodos 20 nodos 5 10 15 20 10 15 20 25 30 Funciones medias t f(t)=cos(2*pi*t) xi(t)
C.Media de Splines Regresión C.Media Splines de suavizado C.Media de P−splines
Figura 5.5: Curva ajustada mediante Splines de regresi´on, Splines de suavizado y P-splines para los distintos n´umero de nodos de la base (5, 15, 20) y diferentes valores de λi. El ´ultimo gr´afico corresponde a las curvas
Aplicaciones con R 45
S.Regresión S.Suavizado P−splines
6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0
Diagrama de cajas y bigotes
ECM
Figura 5.6: Diagramas de cajas con bigotes para el ECM de las curvas ajustadas con Splines de regresi´on, Splines de suavizado y P-splines, usando 5 nodos para las bases y λi = 0,001, 0,000014 respectivamente para P-
splines y Splines de suavizado.
5.3.
Conclusiones
El objetivo principal de este trabajo era comprobar la efectividad de los ajustes con penalizaci´on. En la teor´ıa se han expuesto diferentes formas de penalizar motivando su uso en referencia a algunas de sus ventajas. En los ejemplo simulados, sobre todo en la simulaci´on con 50 observaciones, se puede ver como mejoran los ajustes cuando utilizamos P-splines, Splines de suavizado o P-splines como modelos mixtos. En el caso de las temperaturas para las diferentes zonas geogr´aficas de Andaluc´ıa, como se observa en la distribuci´on de los ECM, los splines de regresi´on parecen hacer un ajuste adecuado, pero hay que tener en cuenta que las observaciones de temper-
aturas no tienen mucho error y tal vez por eso no sea necesario utilizar un suavizado. Otra cuesti´on a tener en cuenta es que dada la periodici- dad de estos datos, lo m´as adecuado ser´ıa trabajar con bases de fourier, cuesti´on que se considera para posteriores estudios. No obstante, hay que destacar que el ajuste de los P-splines como modelos mixtos proporciona buenos ajustes tanto para los datos simulados como para las observaciones reales(caso con m = 120). Adem´as, esta forma de ajuste de los P-splines no depende del n´umero de nodos b´asicos y selecciona de forma autom´atica el par´ametro de suavizado ´optimo.
En conclusi´on, se comprueba que en los casos en que se dispone de datos con ruido, el uso de suavizado mejora el ajuste de las curvas. Adem´as, se han observado mejoras en los ajuste cuando se utilizan las metodolog´ıas de ajuste de P-splines, es decir usando una penalizaci´on discreta basada en las diferencias entre los coeficientes b´asicos adyacentes.
La metodolog´ıa sobre P-splines como modelos mixtos presenta muchas ventajas desde el punto de vista computacional. En trabajos como Wen- sheng, G. (2004) se ha comprobado la efectividad de estos modelos en el terreno de los datos longitudinales. No obstante, queda como objetivo para pr´oximos trabajos el estudio de dicha t´ecnica con mayor profundidad.
Aplicaciones con R 47 0 20 40 60 80 100 120 5 10 15 20 25
Modelos Mixtos para 13 zonas geográficas de Andalucía
Mes
T
emper
atur
a
Figura 5.7: Suavizado mediante P-splines ajustados como modelos mixtos con 40 nodos para las 13 curvas de temperaturas estudiadas
Cap´ıtulo 6
L´ıneas abiertas
Este trabajo ha sido el primer paso para el desarrollo de una Tesis Doctoral sobre Estimaci´on Penalizada de Modelos para Datos Funcionales en la que se abordar´an principalmente las siguientes l´ıneas de investigaci´on: 1. Estimaci´on del ACP funcional mediante penalizaci´on de la rugosidad
de los factores principales (ACP funcional regularizado).
2. Estimaci´on penalizada de modelos lineales de regresi´on funcional. 3. Estimaci´on penalizada de modelos lineales generalizados funcionales,
como por ejemplo los modelos logit funcionales.
4. Implementaci´on computacional con el software estad´ıstico R de los m´etodos de estimaci´on penalizada estudiados.
5. Aplicaciones con datos reales y simulados. Comparaci´on de resultados con los m´etodos de estimaci´on no penalizada.
Cap´ıtulo 7
Referencias bibliogr´aficas
Aguilera, A.M., Oca˜na, F.A. y Valderrama, M.J. (1995). Computa- tional approaches to estimation in the Principal Component Analysis of a stochastic process. Applied Stochastic Models and Data Analysis, 11, 279-299.
Aguilera A.M., Guti´errez, R. and Valderrama, M.J. (1996) Approx- imation of estimators of the PCA of a stochastic process using B- splines. Communications in Statistics. Simulation and Computation, 25(3), 671-691.
Aguilera, A.M., Oca˜na, F.A. y Valderrama, M.J. (1999). Stochastic modelling for evolution of stock prices by means of functional PCA. Applied Stochastic Models in Business and Industry, 15(4), 227-234. Aguilera, A.M., Escabias, M. y Valderrama, M.J. (2008). Discus- sion of different logistic models with functional data. Application to Systemic Lupus Erythematosus. Computational Statistics and Data Analysis, 53(1), 151-163.
Aguilera, A.M., Escabias, M. y Valderrama, M.J. (2008). Forecasting binary longitudinal data by a functional PC-ARIMA model. Compu- tational Statistics and Data Analysis, 52(6), 3187-3197.
Bouzas, P.R., Valderrama, M.J., Aguilera, A.M. y Ruiz-Fuentes, N. (2006). On the structure of the stochastic process of mortgages in Spain. Computational Statistics, 21(1), 73-89.
Brumback, B. y Rice, J. (1998). Smoothing spline models for the anal- ysis of nested and crossed samples of curves. Journal of the American Statistical Association, 93, 961-994.
Consejer´ıa de Medioambiente (2007). Estad´ıstica de climatolog´ıa medioam- biental en Andaluc´ıa.
Craven, P. y wahba, G. (1979) Smoothing noisy data with splines functions: estimating the correct degree of smoothing by the method of generalized cross-validation, Numerische Mathematik, 31, 377-403. De Boor, C. (1977). Package for calculating with B-splines. Journal of Numerical Analysis, 14, 441-472.
Durban, M. y Dae-Jin, L. (2008). Splines con penalizaciones (P- Splines). Teor´ıa y aplicaciones. Universidad P´ublica de Navarra. Eilers, P. y Marx, B. (1996). Flexible smoothing with B-splines and penalties. Statistical Science, 11, 89-121.
Escabias, M., Aguilera, A. M. y Valderrama, M. J. (2005). Modeling environmental data by functional principal component logistic regres- sion. Environmetrics, 16 (1), 95-107.
Ferraty, F. y Vieu, P. (2006). Nonparametric functional data analysis. Springer-Verlag.
Green, P. y Silverman, B. (1994). Nonparametric regression and gen- eralized linear models. Monographs on Statistics and applied proba- bility. Chapman & Hall, London.
Julio, J. M. et al. (2002). La curva spot (cero cup´on) estimaci´on con splines c´ubicos suavizados, usos y ejemplos. Banco de la Rep´ublica de Colombia.
Laird, N. M. y Ware, J. H. (1982). Random-effects models for longi- tudinal data. Biometrics, 38, 963-974.
OSullivan, F. (1986). A stastical perspective on ill-posed inverse prob- lems. Statistical Science, 1, 505-527.
Ramsay, J. O. y Silverman, B. W. (1997, 2005). Functional data anal- ysis (First and Second editions). Springer-Verlag.
Referencias bibliogr´aficas 53 Ramsay, J. O. y Silverman, B. W. (2002). Applied functional data analysis: Methods and case studies. Springer-Verlag.
Rice, J. A. y Wu, C. O. (2001). Nonparametric mixed effects models for unequally sampled noisy curves. Biometrics, 57, 253-259.
Ruppert, D., Wand, M. P. y Carroll, R. J. (2003). Semiparametric Regression. Cambridge Series in Statistical and Probabilistic Mathe- matics. Cambridge University Press.
Verbyla, A., Cullis, B., Kenward, M. y Welham, S. (1999). The anal- ysis of designed experiments and longitudinal data using smoothing splines. Applied Statistics, 48, 269-312.
Wand, M. P. (2003). Smoothing and mixed models. Computational Statistics, 18, 223-249.
Valderrama, M.J., Oca˜na, F.A. y Aguilera, A.M. (2009). Forecasting Pollen Concentration by a Two-Step Functional Model. Biometrics, en prensa (DOI: 10.1111/j.1541-0420.2009.01293.x).
Wensheng, G. (2004). Functional data analysis in longitudinal set- tings using smoothing splines. Statistical Methods in Medical Re- search.
Cap´ıtulo 8
Anexo: Funciones
implementadas en R
En este apartado se muestra el c´odigo R programado para la realizaci´on de la parte pr´actica de este trabajo. Se han utilizado tanto funciones ya im- plementadas en R como nuevas funciones que se han ido creando y adaptan- do a los requisitos necesarios para cumplir nuestro objetivo que no es otro que la comparaci´on de las diferentes metodolog´ıa expuestas en la teor´ıa.
A continuaci´on se muestra un resumen comentado de las principales funciones utilizadas.
• Funci´on para crear un B-spline (Propuesto por De Boor (2001)) library(splines)
bspline <- function(x, xl, xr, ndx, bdeg){ dx <- (xr-xl)/ndx
knots <- seq(xl-bdeg*dx, xr+bdeg*dx, by=dx)
B <- spline.des(knots,x,bdeg+1,0*x,outer.ok=TRUE)$design B}
Par´ametros de la funci´on x: dominio de estudio
xl: valor pr´oximo a ”x”, pero fuera del dominio por la izquierda 55
xr: valor pr´oximo a ”x”, pero fuera del dominio por la derecha bdeg: grado del spline
ndx: n´umero de nodos (si el spline es de grado p, son necesarios p+2 nodos)
• Funci´on para ajustar un spline de suavizado (smoothing spline) smooth.spline(x, y, spar=0, cv=FALSE, all.knots=TRUE, nknots=NULL)
Par´ametros de la funci´on
y: vector de temperaturas medias mensuales recogidas para una de las zonas geogr´aficas.
x: vector con el mes al que corresponden cada una de las temperaturas medias de y.
spar: par´ametro de suavizado empleado en esta funci´on. El coeficiente lambda de la integral de la derivada de segundo orden de la funci´on al cuadrado, en el criterio de ajuste de los coeficientes b´asicos, es una funci´on mon´otona de ”spar”.
Si spar=NULL y df= (es decir, se omite en la funci´on), autom´atica- mente se aplica el criterio de Validaci´on cruzada (leave-one-out). cv: si cv=FALSE -¿se aplica Validaci´on Cruzada Generalizada (VCG). En otro caso, se aplicar´a V. C. Ordinaria.
all.knots=TRUE:indica que hay tantos nodos como datos distintos observados.
nknots: permite fijar el n´umero de nodos (s´olo toma valor DISTINTO DE null si all.knots=FALSE).
• M´etodo de Validaci´on cruzada (leave-one-out) library(splines)
bspline <- function(x, xl, xr, ndx, bdeg){ dx <- (xr-xl)/ndx
knots <- seq(xl-bdeg*dx, xr+bdeg*dx, by=dx) B <- spline.des(knots,x,bdeg+1,0*x)$design
Funciones implementadas en R 57 B
}
datos <-read.table(file="datos_ejemplo.txt", header=TRUE) Variables
te <- datos[,1] y<- datos[,2]
Las trayectorias xi(te)muestrales van desde datos[,3] hasta datos[,102] Fijamos una trayectoria
w <- datos[,30] bdeg<-3 m<-150 lambda<-c(0.1,0.15,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75, 0.80,0.85,0.90,0.95,1,1.1,1.15,1.20,1.25,1.30,1.35,1.40,1.45,1.50,1.55,1.60, 1.65,1.70,1.75,1.80,1.85,1.90,1.95,2) valor<-matrix(0,ncol=1,nrow=m) ECM<-matrix(0,ncol=35,nrow=length(lambda)) for (i in 3:35){ for (p in 1: length(lambda)){ suma=0 for(k in 1:m){ x<-te[-k] xl<-min(x)-0.0001 xr<-max(x)+0.0001 z<-w[-k]
B=bspline(x,xl,xr,i,bdeg) Base de splines cbicos d=ncol(B) D1=diff(diff(diag(d))) P=t(D1)%*%D1 lam=lambda[p] a=solve(t(B)%*%B+lam*P)%*%t(B)%*%z curva<- B%*%a
B2<-bspline(te[k],te[k]-0.0001,te[k]+0.0001,i,bdeg) valor[k]<-B2%*%a suma<-suma+(y[k] - valor[k])^2 } ECM[p,i]<- sqrt(suma/m) } } CV<-data.frame(ECM) write.table(CV,file="CrossValidation_ejemplo.txt",sep=" ",col.names=TRUE, row.names=FALSE)
• Simulaci´on de los n=100 trayectorias muestrales. Ajuste de las curvas usando las diferentes metodolog´ıas.
n <- 100 m <- 150 te <- seq(0,1,length=m) #secuencia ordenada de valores entre (0,1) y <- cos(2*pi*te) #Funci\’{o}n original f <- matrix(0,ncol=n,nrow=m) #Cada columna es una trayectoria muestral for (i in 1:n) {
f[,i] <- cos(2*pi*te) + rnorm(m) #Funci\’{o}n de partida con ruido }
Guardamos los datos simulados.
datos<-data.frame(te,y,f) write.table(datos,
file="datos_ejemplo.txt", sep=" ", col.names=TRUE, row.names=FALSE) Cargamos los datos datos <-read.table(file="datos_ejemplo.txt", header=TRUE)
Variables
z<-seq(0,1,length=200)
x <- datos[,1] y <- datos[,2] Fijamos una trayectoria
w <- datos[,30] #Trayectoria 28
Funciones implementadas en R 59 library(splines)
bspline <- function(x, xl, xr, ndx, bdeg){ dx <- (xr-xl)/ndx
knots <- seq(xl-bdeg*dx, xr+bdeg*dx, by=dx)
B <- spline.des(knots,x,bdeg+1,0*x,outer.ok=TRUE)$design B}
#--- #Ajuste de la curva mediante regression splines para 5, 15 y 25
nodos.
#Curva con 5 nodos
BBB1=bspline(x,xl,xr,5,bdeg) #Base de cubic splines
a1=solve(t(BBB1)%*%BBB1)%*%t(BBB1)%*%w #a1 son los coeficientes estimados(a^) B<- bspline(z,xl,xr,5,bdeg)
curva1<- B%*%a1 #Plot
plot(x,w,pch=".",cex=3, main=paste("Splines de regresi\’{o}n"), xlab="t", ylab="f(t)=cos(2*pi*t)", col.main="black")
lines(x,y,col=1,lwd=2) # f(t)=cos(2*pi*t).
lines(z,curva1,col=2,lwd=2) #Curva ajustada con 5 nodos. #Curva con 15 nodos
BBB2=bspline(x,xl,xr,15,bdeg)
a2=solve(t(BBB2)%*%BBB2)%*%t(BBB2)%*%w B<- bspline(z,xl,xr,15,bdeg)
curva2<- B%*%a2 #Plot
lines(z,curva2,col=3,lwd=2) #Curva ajustada con 15 nodos. #Curva con 25 nodos
BBB3=bspline(x,xl,xr,25,bdeg)
a3=solve(t(BBB3)%*%BBB3)%*%t(BBB3)%*%w B<- bspline(z,xl,xr,25,bdeg)
curva3<- B%*%a3 #Plot
lines(z,curva3,col=4,lwd=2) #Curva ajustada con 25 nodos.
legend(0.3,2.9, c("f(t)","5 nodos","15 nodos","25 nodos"),col=c(1,2,3,4) ,bty="n",lty = c(1, 1, 1))
#--- #Ajuste de la curva mediante spline de suavizado (smoothing spline)
#Curva con 5 nodos
curva4<- smooth.spline(x, w, spar=NULL, cv=FALSE, all.knots=FALSE, nknots=5)
#Plot
plot(x,w,pch=".",cex=3, main=paste("Splines de suavizado"), xlab="t", ylab="f(t)=cos(2*pi*t)", col.main="black")
lines(x,y,col=1, lwd=2) # f(x)=cos(2*pi*x). lines(predict(curva4, z),col = 2,lwd=2) #Curva con 15 nodos
curva5<- smooth.spline(x, w, spar=NULL, cv=FALSE, all.knots=FALSE, nknots=15)
#Plot
lines(predict(curva5, z),col = 3,lwd=2) #Curva con 25 nodos
curva6<- smooth.spline(x, w, spar=NULL, cv=FALSE, all.knots=FALSE, nknots=25)
#Plot
lines(predict(curva6, z),col = 4,lwd=1)
legend(0.2,3, c("f(t)","5 nodos y lambda=0.01","15 nodos y lambda=0.013", "25 nodos y lambda=0.013"),col=c(1,2,3,4),bty="n",lty = c(1, 1, 1))
#--- #Ajuste de la curva mediante P-splines
#Curva con 5 nodos
BBB7=bspline(x,xl,xr,5,bdeg) #Base de cubic splines d7=ncol(BBB7)
D7=diff(diff(diag(d7)))
Funciones implementadas en R 61 lambda=2
a7=solve(t(BBB7)%*%BBB7+lambda*P7)%*%t(BBB7)%*%w #coeficientes estimados B<- bspline(z,xl,xr,5,bdeg)
curva7<- B%*%a7 #Plot
plot(x,w,pch=".",cex=3, main=paste("P-splines"), xlab="t", ylab="f(t)=cos(2*pi*t)", col.main="black")
lines(x,y,col=1,lwd=2) #f(x)=cos(2*pi*x).
lines(z,curva7,col=2,lwd=2) #Curva ajustada con 15 nodos. #Curva con 15 nodos
BBB8=bspline(x,xl,xr,15,bdeg) #Base de cubic splines d8=ncol(BBB8)
D8=diff(diff(diag(d8)))
P8=t(D8)%*%D8 #penalized matrix lambda=0.70
a8=solve(t(BBB8)%*%BBB8+lambda*P8)%*%t(BBB8)%*%w #coeficientes estimados B<- bspline(z,xl,xr,15,bdeg)
curva8<- B%*%a8 #Plot
lines(z,curva8,col=3,lwd=2) #Curva ajustada con 15 nodos. #Curva con 25 nodos
BBB9=bspline(x,xl,xr,25,bdeg) #Base de cubic splines d9=ncol(BBB9)
D9=diff(diff(diag(d9)))
P9=t(D9)%*%D9 #penalized matrix lambda= 1.2
a9=solve(t(BBB9)%*%BBB9+lambda*P9)%*%t(BBB9)%*%w #coeficientes estimados B<- bspline(z,xl,xr,25,bdeg)
curva9<- B%*%a9 #Plot
lines(z,curva9,col=4,lwd=2) #Curva ajustada con 25 nodos.
legend(0.2,3, c("f(t)","5 nodos y lambda=2","15 nodos y lambda=0.70", "25 nodos y lambda=1.20"),col=c(1,2,3,4),bty="n",lty = c(1, 1, 1))
#--- #Ajuste de las curvas mediante P-splines como modelos mixtos
#Guardamos los datos con el formato adecuado x_mxm<-matrix(x,ncol=1,nrow=m*n)
trayectorias <- datos[,-c(1,2)]#Elimino las columnas correspondientes a x e y #para quedarme con las trayectorias.
trayectorias_mxm<- matrix(0,ncol=1,nrow=m*n) cual_tray_mxm<- matrix(0,ncol=1,nrow=m*n) k<-1 while (k<=n*m){ for (i in 1:n){ for (j in 1:m){ trayectorias_mxm[k,1]=trayectorias[j,i] cual_tray_mxm[k,1]=i k=k+1 } } } datos_mxm<-data.frame(x_mxm,trayectorias_mxm,cual_tray_mxm)
#Guardamos los datos en el formato adecuado para la funci\’{o}n de modelos mixtos. write.table(datos_mxm, file="datos_mxm_ejemplo.txt", sep=" ", col.names=TRUE, row.names=FALSE)
#--- #--- #Cargamos los datos
datos_mxm <-read.table(file="datos_mxm_ejemplo.txt",header=TRUE) #Par\’{a}metros n=100 m=150 x<- datos_mxm$x_mxm y<- datos_mxm$trayectorias_mxm zona<- datos_mxm$cual_tray_mxm ndx<-25 bdeg<-3 xl <- min(x)-0.00001 xr <- max(x)+0.00001 #---
Funciones implementadas en R 63 #Funciones para ajustar un P-spline como un Modelo Mixto.
library(splines)
bspline <- function(x, xl, xr, ndx, bdeg){ dx <- (xr-xl)/ndx
knots <- seq(xl-bdeg*dx, xr+bdeg*dx, by=dx) B <- spline.des(knots,x,bdeg+1,0*x)$design B } library(nlme) #Con B-splines mixed.model.B<-function (x,xl,xr,ndx,bdeg) {B=bspline(x,xl,xr,ndx,bdeg) pord<-bdeg-1 m=ncol(B) D=diff(diag(m),differences=pord)
#svd: descomposici\’{o}n en valores singulares P.svd=svd(t(D)%*%D) U=(P.svd$u)[,1:(m-pord)] d=(P.svd$d)[1:(m-pord)] Delta=diag(1/sqrt(d)) Z=B%*%U%*%Delta X=NULL for(i in 0:(pord-1)){X=cbind(X,x^i)} list(X,Z)}
#Ajuste con 5 nodos para la base
MM=mixed.model.B(x,min(x)-0.00001,max(x)+0.00001,5,3) Z=MM[[2]]
X=model.matrix(y~x)
Id=factor(rep(1,length(y)))
Z.block<-list(Id=pdIdent(~Z-1), zona=pdSymm(~x))
data.fr<- groupedData( y ~ X[,-1] | Id,data =data.frame(y,X,Z,zona,x)) model<- lme(y~X[,-1],data=data.fr,random=Z.block)
d=ncol(model$fitted)
#Creamos una matriz "Y" cuyas columnas son las curvas ajustadas Y<-matrix(0,nrow=m,ncol=n) for(i in 1:n){ Y[,i]=fit.model[zona==i] } curvas1_mxm<-data.frame(Y)
#Curva correspondiente a la trayectoria muestral 28 ajustada con 5 nodos curva1<-curvas1_mxm[,28]
#Guardamos los datos en el formato adecuado para la funci\’{o}n de modelos mixtos. write.table(curvas1_mxm, file="curvas_5_nodos_mxm_ejemplo.txt", sep=" ",
col.names=TRUE, row.names=FALSE) #Ajuste con 15 nodos para la base
MM=mixed.model.B(x,min(x)-0.00001,max(x)+0.00001,15,3) Z=MM[[2]]
X=model.matrix(y~x)
Id=factor(rep(1,length(y)))
Z.block<-list(Id=pdIdent(~Z-1), zona=pdSymm(~x))
data.fr<- groupedData( y ~ X[,-1] | Id,data =data.frame(y,X,Z,zona,x)) model<- lme(y~X[,-1],data=data.fr,random=Z.block) d=ncol(model$fitted) fit.model=model$fitted[,d] Q<-matrix(0,nrow=m,ncol=n) for(i in 1:n){ Q[,i]=fit.model[zona==i] } curvas2_mxm<-data.frame(Q)
write.table(curvas2_mxm, file="curvas_15_nodos_mxm_ejemplo.txt", sep=" ", col.names=TRUE, row.names=FALSE)
#Curva correspondiente a la trayectoria muestral 28 ajustada con 15 nodos curva1_2<-curvas2_mxm[,28]
Funciones implementadas en R 65
#Ajuste con 25 nodos para la base
MM=mixed.model.B(x,min(x)-0.00001,max(x)+0.00001,25,3) Z=MM[[2]]
X=model.matrix(y~x)
Id=factor(rep(1,length(y)))
Z.block<-list(Id=pdIdent(~Z-1), zona=pdSymm(~x))
data.fr<- groupedData( y ~ X[,-1] | Id,data =data.frame(y,X,Z,zona,x)) model<- lme(y~X[,-1],data=data.fr,random=Z.block) d=ncol(model$fitted) fit.model=model$fitted[,d] G<-matrix(0,nrow=m,ncol=n) for(i in 1:n){ G[,i]=fit.model[zona==i] } curvas3_mxm<-data.frame(G)
write.table(curvas3_mxm, file="curvas_25_nodos_mxm_ejemplo.txt", sep=" ", col.names=TRUE, row.names=FALSE)
#Curva correspondiente a la trayectoria muestral 28 ajustada con 25 nodos curva1_3<-curvas3_mxm[,28]
#Cargamos los datos de partida datos
<-read.table(file="datos_ejemplo.txt", header=TRUE) #Variables x <- datos[,1] y <- datos[,2] w <- datos[,30]
#Plot plot(x,w,pch=".",cex=3, main=paste("P-splines con Modelos mixtos"), xlab="t",
ylab="f(t)=cos(2*pi*t)", col.main="black")
lines(x,y,col=1,lwd=2) #Funci\’{o}n original_ f(x)=cos(2*pi*x). lines(x,curva1,col=2,lwd=2) #Curva ajustada con 5 nodos.
lines(x,curva1_2,col=3,lwd=2) #Curva ajustada con 15 nodos. lines(x,curva1_3,col=4,lwd=2) #Curva ajustada con 25 nodos.
legend(0.4,3.9, c("f(t)","5 nodos","15 nodos","25 nodos"),col=c(1,2,3,4) ,lty = c(1, 1, 1))
#--- #--- #Guardamos las curvas ajustadas por diferentes m\’{e}todos
#Cargamos los datos de partida datos
<-read.table(file="datos_ejemplo.txt", header=TRUE) n=100 m=150 x <- datos[,1] y <- datos[,2] w<-datos[,-c(1,2)] xl <- min(x)-0.00001 xr <- max(x)+0.00001 bdeg <-3 nodos=5 lambda=2 #Fijada mediante la C.V.
#--- ajuste_n_curvas<-function (n,m,bdeg,x,y,w,nodos,lambda){
#simulaci\’{o}n de las curvas
curva_reg<-matrix(0,ncol=n,nrow=m) #Matriz con columnas las curvas ajustadas
#mediante spline de regresi\’{o}n. curva_smth<-matrix(0,ncol=n,nrow=m) #Matriz con columnas las curvas ajustadas
#mediante spline de suavizado. curva_P<-matrix(0,ncol=n,nrow=m) #Matriz con columnas las curvas ajustadas
#mediante spline de suavizado. for (i in 1:n) { pord=bdeg-1 #Spline de regresi\’{o}n BBB2=bspline(x,xl,xr,nodos,bdeg) a2=solve(t(BBB2)%*%BBB2)%*%t(BBB2)%*%w[,i] curva_reg[,i]<- BBB2%*%a2 #Spline de suavizado
curva5<- smooth.spline(x, w[,i], spar=NULL,cv=FALSE, all.knots=FALSE, nknots=nodos)
pred<-predict(curva5, x) curva_smth[,i]<-pred$y
Funciones implementadas en R 67 #P-spline BBB8=bspline(x,xl,xr,nodos,bdeg) d8=ncol(BBB8) D8=diff(diff(diag(d8))) P8=t(D8)%*%D8 a8=solve(t(BBB8)%*%BBB8+lambda*P8)%*%t(BBB8)%*%w[,i] curva_P[,i]<- BBB8%*%a8 }
return(curva_reg,curva_P,curva_smth) } #Guardamos las trayectorias para cada ajuste #Llamamos a la funci\’{o}n
n_curvas<-ajuste_n_curvas(n,m,bdeg,x,y,w,nodos,lambda) #Curvas ajustadas por splines.Reg
write.table(data.frame(n_curvas$curva_reg),
file="ncurvas_5_nodos_reg_ejemplo.txt",sep=" ",col.names=TRUE, row.names=FALSE)
#Curvas ajustadas por splines.Suav
write.table(data.frame(n_curvas$curva_smth), file="ncurvas_5_nodos_smth_ejemplo.txt",sep=" ",col.names=TRUE,row.names=FALSE)
#Curvas ajustadas por P-splines
write.table(data.frame(n_curvas$curva_P), file="ncurvas_5_nodos_P_spl_ejemplo.txt",sep=" ",col.names=TRUE,row.names=FALSE)
#---
• ECM y curvas medias para las diferentes curvas y metodolog´ıas
#Cargamos los datos datos <-read.table(file="datos_ejemplo.txt", header=TRUE) n=100 m=150 x <- datos[,1] y <- datos[,2]
curv_regresion<-read.table(file="ncurvas_5_nodos_reg_ejemplo.txt",header=TRUE) curv_suavizado<-read.table(file="ncurvas_5_nodos_smth_ejemplo.txt",header=TRUE) curv_P<-read.table(file="ncurvas_5_nodos_P_spl_ejemplo.txt",header=TRUE)
curv_P_mxm<-read.table(file="curvas_15_nodos_mxm_ejemplo.txt",header=TRUE) suma_reg<-matrix(0,ncol=1,nrow=m) suma_suav<-matrix(0,ncol=1,nrow=m)
suma_p<-matrix(0,ncol=1,nrow=m) suma_p_mxm<-matrix(0,ncol=1,nrow=m) media_reg<-matrix(0,ncol=1,nrow=m) media_suav<-matrix(0,ncol=1,nrow=m) media_p<-matrix(0,ncol=1,nrow=m) media_mxm<-matrix(0,ncol=1,nrow=m) ECM_reg<-matrix(0,ncol=1,nrow=n) ECM_suav<-matrix(0,ncol=1,nrow=n) ECM_p<-matrix(0,ncol=1,nrow=n) ECM_p_mxm<-matrix(0,ncol=1,nrow=n) for (i in 1:n){ suma_reg<-suma_reg+curv_regresion[,i] suma_suav<-suma_suav+curv_suavizado[,i] suma_p<-suma_p+curv_P[,i] suma_p_mxm<-suma_p_mxm+curv_P_mxm[,i] }
media_reg<-suma_reg/n media_suav<-suma_suav/n media_p<-suma_p/n media_p_mxm<-suma_p_mxm/n
#Guardamos las funciones medias
MEDIAS<-data.frame(media_reg,media_suav,media_p,media_p_mxm) write.table(MEDIAS,file="MEDIAS_5_nodos_ejemplo.txt",sep=" ",col.names=TRUE, row.names=FALSE)
#Plot: Func. media media
<-read.table(file="MEDIAS_5_nodos_ejemplo.txt", header=TRUE) datos <-read.table(file="datos_ejemplo.txt", header=TRUE)
#Variables x <- datos[,1] y <- datos[,2]
plot(x,y,pch="",ylab="f(t)=cos(2*pi*t)",xlab="t", main="Funciones medias") lines(x, y, col=1,lwd=2) lines(x, media[,1],col=2,lwd=2) lines(x, media[,2],col=3,lwd=2) lines(x, media[,3],col=4,lwd=2) lines(x, media[,4],col=6,lwd=2)
legend(0.2,0.7, c("Curva Media","C.Media de Splines Regresi\’{o}n", "C.Media Splines de suavizado","C.Media de P-splines",
Funciones implementadas en R 69 bty="n") #ECM for (i in 1:n){ ecm_reg<-0 ecm_suav<-0 ecm_p<-0 ecm_p_mxm<-0 for(j in 1:m){ ecm_reg<-ecm_reg+(y[j]-curv_regresion[j,i])^2 ecm_suav<-ecm_suav+(y[j]-curv_suavizado[j,i])^2 ecm_p<-ecm_p+(y[j]-curv_P[j,i])^2 ecm_p_mxm<-ecm_p_mxm+(y[j]-curv_P_mxm[j,i])^2 } ECM_reg[i,]<-sqrt(ecm_reg/m) ECM_suav[i,]<-sqrt(ecm_suav/m) ECM_p[i,]<-sqrt(ecm_p/m) ECM_p_mxm[i,]<-sqrt(ecm_p_mxm/m) } #Guardamos los ECM
ECM<-data.frame(ECM_reg,ECM_suav,ECM_p,ECM_p_mxm)
write.table(ECM,file="sqrt_ECM_15_nodos_ejemplo.txt",sep=" ",col.names=TRUE, row.names=FALSE)
#Box-plot ECM <- read.table(file="sqrtECM_15_nodos_ejemplo.txt", header=TRUE)
boxplot(ECM,use.cols=TRUE,names=c("S.Regresi\’{o}n","S.Suavizado", "P-splines","Modelos.Mixtos"),notch=TRUE,ylab="ECM",col=c(2,3,4,7) ,main="Diagrama de cajas y bigotes")