file <- read.mat("data.mat")
data <- file$X
t <- file$EmAx
wvl <- list()
for (i in 1:7) {
start <- 571 * (i - 1) + 1
end <- 571 * i
wvl[[i]] <- t(data[,start:end])
}
wvl <- rev(wvl)Análisis de la Intensidad de Fluorescencia del Azúcar
1 Datos de Fluorescencia
En (Bro 1999) se encuentra la información sobre un experimento que se realizó durante el otoño de 1995. Cada observación pertenenciente a una muestra representa la medición de intensidad de fluorescencia en una longitud de onda en concreto. Se cuenta con \(N=268\) muestras y \(n=571\) longitudes de onda (de 275 a 560 nm en intervalos de 0.5 nm) a siete longitudes de onda de excitación (230, 240, 255, 290, 305, 325, 340 nm). La fluorescencia es la capacidad que poseen ciertos productos y sustancias para absorber luz a cierta longitud de onda y emitirla tras absorber radiación, a una longitud de onda mayor.
A continuación se realiza la lectura de los datos y su correspondiente representación gráfica:
Se tienen 7 procesos funcionales, \(\mathbb{Y}_1, \mathbb{Y}_2, \ldots, \mathbb{Y}_7\) donde \(\mathcal{T}=[275, 560]\) y \(t_1 = 275, t_2 = 275.5, \ldots, t_{571}=560\):
2 Suavizado Spline
Ahora, se obtienen las bases de funciones de splines cúbicos para poder ajustar las curvas. Para la elección de los nodos, se sigue un teorema mencionado en (Ramsay y Silverman 2005) donde se dice que la curva que minimiza la \(\mathrm{PENSSE} (\lambda | \mathbf{c})\) es un spline cúbico con los nodos ubicados en cada \(t_j\). Para el tamaño de la base \(K\), se sigue a (Ramsay, Hooker, y Graves 2009) de forma que
\[\text{número de funciones base} = \text{orden}\; + \; \text{número de nodos interiores}\]
donde los nodos interiores son aquellos que están posicionados en los breakpoints sin incluir el inicial ni el final en \(\mathcal{T}\).
Código
Basis <- create.bspline.basis(rangeval = c(275, 560),
norder = 4, breaks = t) Como se estiman las curvas por suavizado spline, se debe elegir el \(\lambda\) adecuado. Por lo tanto, se hace una grilla y se elige \(\lambda_i\) (\(i=1,\ldots,7\)) que minimice el \(\mathrm{GCV}(\lambda_i)\).
Código
par(mfrow = c(1,1),
bg = "white",
mar = c(4,4,3,1))
Lambdas <- NULL
for (i in 1:7) {
loglam <- seq(-3,10,0.25)
nlam <- length(loglam)
dfsave <- rep(NA,nlam)
gcvsave <- rep(NA,nlam)
for (ilam in 1:nlam) {
lambda <- 10^loglam[ilam]
fdParobj <- fdPar(Basis, lambda = lambda)
smoothlist <- smooth.basis(t, wvl[[i]], fdParobj)
dfsave[ilam] = smoothlist$df
gcvsave[ilam] = sum(smoothlist$gcv)
}
plot(loglam, gcvsave,
xlab = bquote(log[10](lambda[.(i)])),
ylab = bquote(GCV(lambda[.(i)])),
main= paste0("Parámetros de suavizamiento\nversus GCV (",nms[i],")"),
type="b", cex=0.7, pch = 16, col = "black")
Lambdas[i] <- 10^loglam[which.min(gcvsave)]
}En la Tabla 1 se muestran los resultados.
3 Curvas Ajustadas
Con este conjunto de estimaciones de los parámetros de suavizamiento, se realiza el ajuste de las curvas espectrométricas:
Código
fits <- list()
for (i in 1:7) {
fdParobj <- fdPar(fdobj = Basis, Lfdobj = 2, lambda = Lambdas[i])
fits[[i]] <- smooth.basis(t, wvl[[i]], fdParobj)
}Y se presentan a continuación: