Figura 1: Espectros de emisión para los siete procesos
2 FPCA: Aplicación
2.1 Seleccione uno de los 7 procesos que hacen parte del estudio espectrométrico, y con las observaciones muestrales del proceso seleccionado:
2.1.1 Supuestos del FPCA
Uno de los supuestos para usar FPCA es que la media del proceso permanezca constante. Para verificar este supuesto, se asume que las observaciones funcionales \(\chi_i \in L^2\) son independientes. El objetivo es contrastar si la media de dichas funciones permanece constante en el tiempo \(i\). Por tanto, se define la hipótesis nula como:
\[
\begin{equation}
H_0 : E [\chi_1] = E [\chi_2] = \dots = E [\chi_N]
\end{equation}
\] Y cada observación funcional puede representarse mediante el modelo:
\[
\begin{equation}
\chi_i(t) = \mu(t) + Y_i(t), \quad E[Y_i(t)] = 0
\end{equation}
\] Donde \(\mu(t)\) es la media poblacional.
es pequeña para todo \(1 \leq k < N\) y para todo \(t \in [0,1]\).
Sin embargo, \(\Delta_k(t)\) puede volverse grande debido a la variabilidad si \(k\) está cerca de \(1\) o de \(N\). Por esta razón, es usual trabajar con
Ya que el valor de \(P_k(t)\) no cambia si las funciones \(X_i(t)\) son reemplazadas por \(X_i(t)-\bar{X}_N(t)\). Al definir \(k=[Nx]\), con \(x \in (0,1)\), se obtiene
\[
\begin{equation}
\int \left\{
\sum_{1 \leq i \leq Nx} X_i(t)
-
\frac{[Nx]}{N}
\sum_{1 \leq i \leq N} X_i(t)
\right\}
\hat{v}_{\ell}(t)\,dt
=
\sum_{1 \leq i \leq Nx} \hat{\xi}_{\ell,i}
-
\frac{[Nx]}{N}
\sum_{1 \leq i \leq N} \hat{\xi}_{\ell,i}.
\end{equation}
\] Lo que muestra que los scores pueden utilizarse para probar la constancia de la función de media.
El siguiente teorema puede emplearse para derivar varios estadísticos de prueba.
\[
\begin{equation}
T_N(x)
=
\frac{1}{N}
\sum_{\ell=1}^{d}
\hat{\lambda}_{\ell}^{-1}
\left(
\sum_{1 \leq i \leq Nx}
\hat{\xi}_{\ell,i}
-
x
\sum_{1 \leq i \leq N}
\hat{\xi}_{\ell,i}
\right)^2
\end{equation}
\] y sea \(B_1(\cdot), \ldots, B_d(\cdot)\) puentes brownianos estándar independientes.
El estadístico de prueba tipo Cramér-von Mises, denotado como \(S_{N,d}\), se define para \(d\) componentes principales como:
\[
\begin{equation}
S_{N,d} = \frac{1}{N^2} \sum_{\ell=1}^{d} \frac{1}{\hat{\lambda}_\ell} \sum_{k=1}^{N} \left( \sum_{i=1}^k \hat{\xi}_{\ell,i} - \frac{k}{N} \sum_{i=1}^N \hat{\xi}_{\ell,i} \right)^2
\end{equation}
\] Bajo la hipótesis nula, el estadístico \(S_{N,d}\) converge en distribución a la suma de cuadrados de puentes brownianos independientes:
La decisión estadística se toma comparando el valor calculado de \(S_{N,d}\) con los valores críticos. Se rechaza \(H_0\) con un nivel de significancia \(\alpha\) si: \[
\begin{equation}
S_{N,d} > C_d(\alpha)
\end{equation}
\] Teniendo en cuenta que \(x \in [0, 1]\), el valor \(x^*\) que maximiza \(T_N(x)\), multiplicado por \(N\) corresponde a un estimador consistente del punto de cambio.
Este procedimiento se llevara a cabo a través la función fchange() del paquete fChange, donde es posible aplicar la metodología propuesta.
Tabla 1: Estimaciones de los puntos de cambio en la media funcional
Punto de Cambio
p-valor
134
0.000
184
0.004
Los resultados de Tabla 1 proporcionan evidencia para rechazar la hipótesis nula de media funcional constante, a favor de la existencia de cambios en la media de las curvas espectrométricas. Se identifican dos puntos de cambio significativos, lo que sugiere la presencia de tres conjuntos de observaciones con distinta estructura de media funcional.
El Grupo_1 tiene 134 curvas.
El Grupo_2 tiene 50 curvas.
El Grupo_3 tiene 84 curvas.
Figura 2: Curvas observadas y funciones medias estimadas en cada segmento
Por lo tanto, a cada observación se le resta la media estimada correspondiente al segmento al que pertenece, con el fin de obtener las curvas centradas. Este proceso se ilustra en la Figura 3.
Figura 3: Curvas espectrométricas centradas junto con su media
Luego de haber centrado el proceso, se encuentran las estimaciones de las funciones propias asociadas al operador de covarianza del proceso funcional.
Las tres primeras funciones propias se pueden visualizar en la Figura 4.
[1] "done"
Figura 4: Gráfico de las tres primeras funciones propias estimadas
Con la función plot.pca.fd es posible interpretarlas de una forma más sencilla, pues se muestra cómo cada componente principal afecta a la media del proceso. Esto se muestra en la Figura 5, Figura 6 y Figura 7.
Figura 5: Efecto de las primera componente principal sobre la media del proceso
Figura 6: Efecto de lsegunda componente principal sobre la media del proceso
Figura 7: Efecto de la tercera componente principal sobre la media del proceso
En el caso de la primera función propia, esta está mostrando un aumento constante en la media. Debido a su alto porcentaje de variabilidad explicada, se podría decir que la mayor fuente de variación es la cantidad de luz que se emite (magnitud). Además, se puede ver que hay más varibilidad cuando las muestras se someten a longitudes de onda entre los 350nm y 500nm aproximadamente.
La segunda función propia muestra un contraste entre la exposición a las longitudes de onda menores a 380nm aproximadamente y la exposición a las longitudes de onda mayores a 380nm, mostrando una variación mayor en los intervalos [310, 370] y [400, 470] nm.
Por último, la tercera función propia tienen un patrón cuadrático y presenta mayor variabilidad hacia las longitudes de onda medias.
2.1.1.2 3) Varianza explicada
En las gráficas anteriores es posible ver cuánto porcentaje de variabilidad es explicado por las tres funciones propias estimadas. Esto también se muestra a través de un scree plot en la Figura 8.
Figura 8: Scree plot de las tres primeras componentes principales
De esta forma, es posible ver que las dos primeras componentes principales ya explican más del 90% de variabilidad total.
2.1.1.3 4) Descomposición Karhunen-Loève
La descomposición de Karhunen-Loève consiste en expresar cada observación funcional como \[
X(t) = \mu(t) + \sum_{k=1}^\infty \xi_k \nu_k (t)
\] donde \(\nu_k\) corresponde a la \(k\)–ésima función propia y \(\xi_k\) es el \(k\)–ésimo score, \(\xi_k=\langle X, \nu_k \rangle\).
En este caso, la base óptima corresponde al conjunto de las dos primeras funciones propias pues ellas explican el 96.33 de la variabilidad, aproximadamente. Por lo tanto, para cada observación funcional, se tiene su aproximación \[
X_i(t) \approx \hat \mu(t) + \sum_{k=1}^K \hat {\xi}_{ik} \hat \nu _ k(t)
\] con \(i = 1,\ldots,268\) y \(K=2\).
A continuación, se expresan las tres primeras observaciones muestrales con la descomposición de Karhunen-Loève. En la @ se pueden ver las observaciones junto con su aproximación.
Figura 9: Curvas observadas y sus aproximaciones mediante la descomposición de Karhunen-Loève con las dos primeras funciones propias
Figura 10: Curvas observadas y sus aproximaciones mediante la descomposición de Karhunen-Loève con las dos primeras funciones propias
Figura 11: Curvas observadas y sus aproximaciones mediante la descomposición de Karhunen-Loève con las dos primeras funciones propias
A continuación, en la Tabla 2 se muestra el error cuadrático medio de predicción para cada observación.
Tabla 2: Error cuadrático medio de las aproximaciones con la descomposición de Karhunen-Loève
MPSE
Primera Observación
1.2944
Segunda Observación
3.8829
Tercera Observación
7.1369
2.1.1.4 5) Realizaciones del primer score
A continuación se presentan las realizaciones del primer score en la Figura 12.
Figura 12: Gráficos de las realizaciones del primer score
Es posible ver que los scores tienen una distribución asimétrica y también presenta algunos outliers por valores muy altos.
2.1.1.5 6) Gráficos de Dispersión de los Scores
A continuación, se muestra el gráfico de dispersión de las dos primeras componentes principales, que explican el 96.33 de la variabilidad, aproximadamente.
Figura 13: Score plot de las dos primeras componentes principales
Es posible ver que la mayoría de puntos se concentran alrededor de los valores negativos cercanos al cero para el primer score y alrededor del cero para el segundo score. Asimismo, debido al gran porcentaje de variabilidad que explica la primera componente se puede ver que la dispersión es mayor a lo largo de su eje.
2.1.1.6 7) Función de Covarianza y Funciones Propias
En la Figura 14 se presenta la estimación de la función de covarianza y las funciones propias.
Figura 14: Gráfico de la función de covarianza estimada y las funciones propias estimadas
Como es posible visualizar, la forma de la primera función propia es similar a las que se pueden ver en la función de covarianza debido a su alto porcentaje de variabilidad explicada.
2.1.1.7 8) Teorema de Mercer
Por el teorema de Mercer se tiene que el kernel \(\psi(s,t)\) usado en el operador integral \(\Psi (x)(t)\) se puede representar en términos de los valores propios y funciones propias del operador. En este caso, se tiene el operador de covarianza \(\mathcal{C}_\chi(x)(t))\) con la función de covarianza como Kernel. Luego,
En la Figura 15 se puede ver la función de covarianza junto con su aproximación y en la Figura 16 se ven sus residuales.
Código
eigenfn2 <-eval.fd(cov.grid, pcaObj$harmonics)NU <-as.matrix(eigenfn2)D <-diag(eigenval)mercer <- NU %*% D %*%t(NU)cov.diff <- mercer - cov.mat
Figura 15: Gráfico de la función de covarianza y su aproximación por el teorema de Mercer
Figura 16: Gráfico de la diferencia entre la función de covarianza y su aproximación por el teorema de Mercer
2.2 Con el proceso seleccionado en el punto anterior:
2.2.1 Construya una carta de control usando FPCA
Una carta de control es una herramienta que permite monitorear si un proceso se mantiene bajo control o si presenta cambios anómalos a lo largo del tiempo.
Para construir una carta de control a partir del análisis de componentes principales:
Se utiliza una carta\(T^2\) para monitorear la variabilidad explicada por las componentes principales (scores).
Para el caso funcional, sea \(\chi\) una función aleatoria definida en \(L^2\), la cual puede representarse mediante la descomposición de Karhunen–Loève como:
\(\phi_k\): son las funciones propias ortonormales del operador de covarianza asociado a \(\chi\).
\(\xi_k = \langle \chi, \phi_k \rangle\): son los scores, que son las proyecciones de la función \(\chi\) sobre las funciones propias.
Para realizar FPCA, se utiliza una aproximación truncada de esta expansión. Dado que el operador de covarianza posee infinitos valores y funciones propias, se selecciona un número finito \(K\) de componentes principales, de manera que se capture una proporción suficientemente alta de la varianza total.
Además, se complementa con una carta\(Q\) o SPE, que permite detectar variabilidad no capturada por las componentes principales, es decir, aquello que queda fuera de las direcciones de máxima varianza.
En la Fase I se realiza el FPCA a partir de una muestra en control.
Se realiza el FPCA.
Se calculan los estadísticos \(T_j^2\) y \(Q_j\).
El nivel de significancia conjunto para las cartas de control \(T^2\) y \(Q\) se fija como \(\alpha\). Dado que se utilizan dos estadísticas de monitoreo, el nivel de significancia individual para cada carta se define como:
\[
\alpha' = 1 - (1 - \alpha)^{1/p},
\]
donde \(p = 2\) corresponde al número de cartas de control. De esta manera, se garantiza que el nivel de significancia global sea \(\alpha\). Nosotros fijaremos \(\alpha = 0.05\) como nivel de significancia conjunto.
Por otra parte, dado que la distribución exacta de los estadísticos \(T^2\) y \(Q\) no es conocida, los límites de control se estiman mediante un procedimiento de bootstrap. En particular, se considera el máximo de estos estadísticos en cada réplica bootstrap, y a partir de esta distribución empírica se calculan los cuantiles correspondientes de \(T^2\) y \(Q\), los cuales se utilizan para definir los limites.
\[
T^2 > \text{UCL}_{T^2}
\quad \text{o} \quad
Q > \text{UCL}_{Q}.
\] Para la construcción de las cartas de control, se divide el conjunto de datos en dos subconjuntos: el \(80\%\) de las observaciones se utiliza en la Fase I, mientras que el \(20\%\) restante se reserva para la Fase II.
Ya que se identificaron puntos de cambio, la construcción de las cartas de control se llevará a cabo mediante dos estrategias de partición del conjunto de datos, ambas basadas en la selección de observaciones que comparten una misma media
Código
T2_Q.CL <-function(data, argvals, Lambda, Basis, ncomp, alpha, B, seed){ N <-dim(data)[2] all_T2 <-vector("list", B) all_Q <-vector("list", B) fdParobj <-fdPar(fdobj = Basis, Lfdobj =2, lambda = Lambda) dt <-diff(argvals)set.seed(seed)for (b inseq_len(B)) {# Remuestreo idx <-sample(1:N, size = N, replace =TRUE) samples <- data[, idx, drop =FALSE]# Suavizado y PCA smoothlist <-smooth.basis(argvals, samples, fdParobj) fdObj_c <-center.fd(smoothlist$fd) pcaObj <-pca.fd(fdObj_c, nharm = ncomp, centerfns =FALSE)# Extraer scores y valores propios Scores <- pcaObj$scores Eigenval <- pcaObj$values[1:ncomp]# T2 all_T2[[b]] <-rowSums((Scores %*%diag(1/Eigenval)) * Scores)# Q Xfd <-eval.fd(argvals, fdObj_c) Phi <-eval.fd(argvals, pcaObj$harmonics) Xhat <- Phi %*%t(Scores) all_Q[[b]] <-apply((Xfd - Xhat)^2, 2, function(v){sum((v[-1] + v[-length(v)]) /2* dt) }) }# Límites de control CL_T2 <-quantile(unlist(all_T2), 1- alpha) CL_Q <-quantile(unlist(all_Q), 1- alpha)# Modelo con datos originales smoothlist_f <-smooth.basis(argvals, data, fdParobj) fdObj_c_f <-center.fd(smoothlist_f$fd) pcaObj_f <-pca.fd(fdObj_c_f, nharm = ncomp, centerfns =FALSE) Scores_f <- pcaObj_f$scores Eigenval_f <- pcaObj_f$values[1:ncomp]# T2 final T2_final <-rowSums((Scores_f %*%diag(1/Eigenval_f)) * Scores_f)# Q final Xfd_f <-eval.fd(argvals, fdObj_c_f) Phi_f <-eval.fd(argvals, pcaObj_f$harmonics) Xhat_f <- Phi_f %*%t(Scores_f) Q_final <-apply((Xfd_f - Xhat_f)^2, 2, function(v){sum((v[-1] + v[-length(v)]) /2* dt) })return(list(CL_T2 =as.numeric(CL_T2),CL_Q =as.numeric(CL_Q),T2 = T2_final,Q = Q_final ))}clean_phaseI_T2Q <-function(data, p, argvals, Lambdas, Basis, ncomp =2,alpha =0.025, B =500, seed =123,r,cp){set.seed(seed) data_variable <- data[ , , p][,cp] n_total <-dim(data_variable)[2]# Selección de Fase I idx_phase1 <-sample(1:n_total, size =floor(r * n_total), replace =FALSE) data_phase1 <- data_variable[, idx_phase1, drop =FALSE] indices <- idx_phase1 removed_indices <-c() Lambda <- Lambdas[p]repeat { res <-T2_Q.CL(data = data_phase1,argvals = argvals,Lambda = Lambda,Basis = Basis,ncomp = ncomp,alpha = alpha,B = B,seed = seed )# Identificar fuera de control outliers <-which(res$T2 > res$CL_T2 | res$Q > res$CL_Q)if(length(outliers) ==0) break# Guardar cuáles estamos quitando removed_indices <-c(removed_indices, indices[outliers])# Actualizar datos y los índices que quedan data_phase1 <- data_phase1[, -outliers, drop =FALSE] indices <- indices[-outliers]if(length(indices) <= ncomp) break }return(list(cleaned_data = data_phase1,final_result = res,removed_indices = removed_indices,n_removed =length(removed_indices),indices = indices ))}
En la primera opción, se utilizará como Fase I el subconjunto con mayor número de observaciones bajo un comportamiento estable, el cual en este caso corresponde a las primeras 134 observaciones. A partir de este conjunto se estimarán los límites de control mediante bootstrap. Posteriormente, el conjunto restante de observaciones será utilizado como Fase II, con el fin de evaluar el comportamiento del proceso bajo los límites previamente construidos.
De las 134 observaciones inicialmente consideradas en la Fase I, 59 permanecieron bajo control y fueron utilizadas para la estimación final de los límites de control. A partir de estas observaciones, se obtuvieron como límites 5.682479 para el estadístico \(T^2\) y 341.1768 para el estadístico \(Q\).
Figura 17: Cartas de control funcional (T² y Q) Fase 1 - Opción 1
Figura 18: Cartas de control funcional (T² y Q) Fase 2 - Opción 1
Observaciones fuera de control según el estadístico T²
Observación
Valor T²
151
6.112
166
7.328
178
7.075
190
22.086
199
6.659
231
5.904
268
26.473
El porcentaje de observaciones fuera de control para el estadístico Q es de 47.76%.
En la segunda opción, se considerará una partición alternativa del conjunto de datos, tomando como Fase I las últimas observaciones que también presentan una misma media. En este caso, la separación se realizará utilizando el 80% de los datos para la Fase I y el 20% restante para la Fase II. Al igual que en el caso anterior, los límites de control serán obtenidos mediante bootstrap.
Del último conjunto de datos, conformado por las últimas 84 observaciones que presentan la misma media, se seleccionó el 80%, correspondiente a 67 observaciones, para la Fase I. Dentro de este conjunto, 50 observaciones se utilizaron para la estimación de los límites de control, mientras que las 17 observaciones restantes se destinaron a la Fase II, con el propósito de realizar el monitoreo del proceso.
A partir de la Fase I, los límites de control obtenidos fueron 5.571344 para el estadístico \(T^2\) y 300.8219 para el estadístico \(Q\).
Figura 19: Cartas de control funcional (T² y Q) Fase 1 - Opción 2
Figura 20: Cartas de control funcional (T² y Q) Fase 2 - Opción 2
Observaciones fuera de control considerando únicamente los índices válidos
Observación real
Valor T²
Valor Q
Fuera por T²
Fuera por Q
185
1.571
1452.490
No
Sí
187
2.731
608.605
No
Sí
212
1.327
343.029
No
Sí
221
0.346
418.832
No
Sí
228
1.069
1050.650
No
Sí
230
0.511
736.786
No
Sí
231
5.904
223.268
Sí
No
266
0.644
475.134
No
Sí
2.2.2 Construya una carta de control usando La distancia Funcional de Mahalanobis
Sea \(\chi\) una función aleatoria definida en \(L^2\), asumimos \[
\mu_\chi(t) = E[\chi(t)],
\] y \(\mathcal{C}_X\) el operador de covarianza \[
\mathcal{C}_\chi(\eta) = E\big[(X - \mu_X) \otimes (X - \mu_X)(\eta)\big].
\]
Sean \(\lambda_1, \lambda_2, \ldots\) los valores propios del operador y \(\psi_1, \psi_2, \ldots\) las funciones propias, que forman una base ortonormal de \(L^2\).
Usando la expansión de Karhunen–Loève de la función aleatoria \(X\): \[
\chi = \mu_\chi + \sum_{k=1}^{\infty} \xi_k \psi_k,
\] donde \[
\xi_k = \langle \chi - \mu_X, \psi_k \rangle,
\] los cuales son los scores de componentes principales, variables aleatorias no correlacionadas con media cero y varianza \(\lambda_k\).
El operador de covarianza se expresa como: \[
\mathcal{C}_\chi(x,y) = \sum_{j=1}^{\infty} \lambda_j \psi_j(x)\psi_j(y),
\] usando el teorema de Mercer.
Para una función \(y\), el operador inverso se escribe como: \[
\mathcal{C}_\chi^{-1}(y)
= \sum_{k=1}^{\infty} \frac{1}{\lambda_k} \langle y, \psi_k \rangle \psi_k.
\]
Se define la distancia funcional de Mahalanobis entre \(\chi\) y \(\mu_\chi\) como: \[
d_{FM}^2 = \left\langle \mathcal{C}_\chi^{-1/2}(\chi - \mu_\chi), \mathcal{C}_\chi^{-1/2}(\chi - \mu_\chi) \right\rangle.
\]
Expandiendo: \[
\mathcal{C}_\chi^{-1/2}(\chi - \mu_\chi)
= \sum_{k=1}^{\infty} \frac{1}{\sqrt{\lambda_k}} \xi_k \psi_k,
\] por lo que \[
d_{FM}^2 = \sum_{k=1}^{\infty} \frac{\xi_k^2}{\lambda_k}.
\]
Esta versión funcional de la distancia de Mahalanobis es una semi-distancia, ya que debido al truncamiento del operador de covarianza puede ocurrir que elementos distintos tengan distancia cero.
Para la construcción de las cartas de control se seguirá un procedimiento análogo al utilizado previamente en el contexto de FPCA, dividiendo el análisis en dos etapas: una fase de calibración (fase 1) y una fase de monitoreo (fase 2).
En la fase 1 se seleccionará un subconjunto de observaciones que se asume proviene de un proceso bajo control, es decir, datos que comparten la misma estructura de media. En este caso, se considerará nuevamente que el periodo estable corresponde a las observaciones finales, por lo que se tomará el 80% de los datos más recientes para conformar la fase 1, mientras que el 20% restante se destinará a la fase 2.
Esta partición permitirá estimar los límites de control a partir de un conjunto de referencia estable y, posteriormente, evaluar el comportamiento de las observaciones restantes. Manteniendo el mismo enfoque basado en bootstrap y en la distancia funcional de Mahalanobis.
Código
DFM.CL <-function(data, argvals, Lambda, Basis, ncomp, alpha, B, seed){ N <-dim(data)[2] all_DFM <-vector("list", B) fdParobj <-fdPar(fdobj = Basis, Lfdobj =2, lambda = Lambda)set.seed(seed)for (b inseq_len(B)) {# Remuestreo bootstrap idx <-sample(1:N, size = N, replace =TRUE) samples <- data[, idx, drop =FALSE]# Suavizado y FPCA smoothlist <-smooth.basis(argvals, samples, fdParobj) fdObj_c <-center.fd(smoothlist$fd) pcaObj <-pca.fd(fdObj_c, nharm = ncomp, centerfns =FALSE)# Scores y valores propios Scores <- pcaObj$scores Eigenval <- pcaObj$values[1:ncomp]# Distancia funcional de Mahalanobis all_DFM[[b]] <-sqrt(rowSums( (Scores^2) /matrix( Eigenval,nrow =nrow(Scores),ncol =length(Eigenval),byrow =TRUE ) ) ) } CL_DFM <-quantile(unlist(all_DFM), 1- alpha)# Modelo final con los datos originales smoothlist_f <-smooth.basis(argvals, data, fdParobj) fdObj_c_f <-center.fd(smoothlist_f$fd) pcaObj_f <-pca.fd(fdObj_c_f, nharm = ncomp, centerfns =FALSE) Scores_f <- pcaObj_f$scores Eigenval_f <- pcaObj_f$values[1:ncomp]# DFM final DFM_final <-sqrt(rowSums( (Scores_f^2) /matrix( Eigenval_f,nrow =nrow(Scores_f),ncol =length(Eigenval_f),byrow =TRUE ) ) )return(list(CL_DFM =as.numeric(CL_DFM),DFM = DFM_final ))}clean_phaseI_DFM <-function(data, p, argvals,Lambdas, Basis, ncomp =2, alpha =0.025, B =500, seed =123, r, cp) {set.seed(seed) data_variable <- data[, , p][, cp] n_total <-dim(data_variable)[2]# Selección aleatoria de Fase I idx_phase1 <-sample(1:n_total,size =floor(r * n_total),replace =FALSE ) data_phase1 <- data_variable[, idx_phase1, drop =FALSE]# Guardar índices originales indices <- idx_phase1 removed_indices <-c() Lambda <- Lambdas[p]repeat {# Estimar límite de control y DFM res <-DFM.CL(data = data_phase1,argvals = argvals,Lambda = Lambda,Basis = Basis,ncomp = ncomp,alpha = alpha,B = B,seed = seed )# Identificar observaciones fuera de control outliers <-which(res$DFM > res$CL_DFM)# Si no hay outliers, detenerif (length(outliers) ==0) break# Guardar índices eliminados removed_indices <-c( removed_indices, indices[outliers] )# Eliminar observaciones fuera de control data_phase1 <- data_phase1[, -outliers, drop =FALSE] indices <- indices[-outliers]# Evitar que queden muy pocas observacionesif (length(indices) <= ncomp) break }return(list(cleaned_data = data_phase1,final_result = res,removed_indices = removed_indices,n_removed =length(removed_indices),indices = indices ))}CL_DFM=clean_phaseI_DFM (data=wvl, p=2, argvals=t, Lambdas=Lambdas, Basis=Basis,B =500,alpha=0.05,r=0.8,cp=185:268)
Del último conjunto de datos, conformado por las últimas 84 observaciones que presentan la misma media, se seleccionó el 80%, correspondiente a 67 observaciones, para la Fase I. Dentro de este conjunto, 39 observaciones se utilizaron para la estimación de los límites de control, mientras que las 17 observaciones restantes se destinaron a la Fase II, con el propósito de realizar el monitoreo del proceso.
A partir de la Fase I, el límite de control obtenido fue 2.103766
Figura 21: Carta de control funcional DFM Fase 1
Figura 22: Carta de control funcional DFM Fase 2
Observaciones fuera de control según la DFM
Observación real
Valor DFM
231
2.43
3 MFPCA: APLICACIÓN
3.1 Considere todos los 7 procesos espectrométricos del proceso de producción de azúcar:
3.1.1 Cuáles son los supuestos que requiere el MFPCA y verique que estos supuestos se cumplen
El supuesto esencial de esta metodología es la existencia en cada tiempo \(t\) de unas direcciones principales que pueden cambiar a lo largo del tiempo pero de manera suave. Por ejemplo, la temperatura del agua a una profundidad fija y la temperatura ambiente son dos variables que están asociadas, pero es posible que el nivel de asociación cambie a lo largo del día; el supuesto está en que si bien se contemplan cambios en los niveles de asociación, esos cambios deben ser suaves, explícitamente deben ser modelados por funciones diferenciables como se expuso en la construcción del espacio de trabajo.
El producto interno en traspone las mediciones de distancia a un espacio en el que no hay asociación.
-Existe un operador \(\mathcal{F}\) (Operador de covarianza) invertible y un proceso funcional \(p-\)variado de media 0 \[
\begin{equation*}
\widetilde{\mathbf{Y}}_i = \left( \widetilde{Y}_{i,1}, \widetilde{Y}_{i,2}, \dots, \widetilde{Y}_{i,p} \right),
\end{equation*}
\] Las observaciones son realizaciones de un proceso funcional \(\mathbf{X}_i\) con \[
\begin{equation}
\mathbf{X}_i = \boldsymbol{\mu}_{\gamma} + \mathbf{Y}_i
\end{equation}
\]
\(\mathbf{Y}_i\) es un proceso de media 0, \(E(\mathbf{X}_i) = \boldsymbol{\mu}_{\gamma}\) con \(\gamma = 1, 2\), y se tiene
\[
\begin{equation}
\mathbf{Y}_i = \mathbf{X}_i - \boldsymbol{\mu}_{\gamma}
\end{equation}
\] donde
\[
\begin{equation}
\mathbf{Y}_i = \mathcal{F} \widetilde{\mathbf{Y}}_i, \quad \mathbf{X}_i = \mathcal{F} \widetilde{\mathbf{X}}_i, \quad \boldsymbol{\mu}_{\gamma} = \mathcal{F} \widetilde{\boldsymbol{\mu}}_{\gamma}
\end{equation}
\]
Si existe un punto de cambio en \(c\) igual a parte entera de \(N\theta\) con \(\theta \in [0,1]\) las observaciones provienen del proceso \(\mathbf{X}_i\) en el que desde 1 hasta el valor entero de \(c\) se tiene \(\boldsymbol{\mu}_{\gamma} = \boldsymbol{\mu}_1\) y después \(\boldsymbol{\mu}_{\gamma} = \boldsymbol{\mu}_2\). Si no hay punto de cambio \(\boldsymbol{\mu}_1 = \boldsymbol{\mu}_2\).
Para cada \(k\) las realizaciones \(Y_{i,k}\) provienen del proceso \(Y_k\) que es una componente del proceso funcional \(p-\)variado \(\mathbf{Y}_i\). Siendo este último la transformación de un proceso \(\widetilde{\mathbf{Y}}_i\) como se indicó en el anterior ítem.
Las siguientes definiciones son análogas a las expuestas en
\[
\begin{equation}
\hat{\mu}_{c,k}(t) = \frac{1}{c} \sum_{i=1}^{c} X_{i,k}(t), \quad \hat{\boldsymbol{\mu}}_c = (\hat{\mu}_{c,1}(t), \hat{\mu}_{c,2}(t), \dots, \hat{\mu}_{c,p}(t)) \tag{4-51}
\end{equation}
\]\[
\begin{equation}
\check{\mu}_{c,k}(t) = \frac{1}{N-c} \sum_{i=c+1}^{N} X_{i,k}(t), \quad \check{\boldsymbol{\mu}}_c(t) = (\check{\mu}_{c,1}(t), \check{\mu}_{c,2}(t), \dots, \check{\mu}_{c,p}(t)) \tag{4-52}
\end{equation}
\] Ahora se considera la diferencia entre los estimadores de las medias \(\hat{\boldsymbol{\mu}}_c\) y \(\check{\boldsymbol{\mu}}_c\) multiplicado por el factor de tipo parabólico.
el reemplazo de \(\hat{\boldsymbol{\mu}}_c\) y \(\check{\boldsymbol{\mu}}_c\) en la anterior expresión, conlleva a \[
\begin{equation}
P_c(t) = \sum_{1 \le i \le Nx} (\mathbf{X}_i(t) - \overline{\mathbf{X}}_N(t)) - \frac{c}{N} \sum_{i=1}^{N} (\mathbf{X}_i(t) - \overline{\mathbf{X}}_N(t)) \tag{4-54}
\end{equation}
\] donde \[
\begin{equation}
\overline{\mathbf{X}}_N = \frac{1}{N} \sum_{i=1}^{N} \mathbf{X}_i
\end{equation}
\]
Se define \(P_t(x)\) como función de \(x \in (0,1)\) mediante \[
\begin{equation}
P_t(x) = \sum_{1 \le i \le Nx} (\mathbf{X}_i(t) - \overline{\mathbf{X}}_N(t)) - x \sum_{i=1}^{N} (\mathbf{X}_i(t) - \overline{\mathbf{X}}_N(t))
\end{equation}
\]
Para \(\mathbf{X}_i\), se tiene que \(P_t(x) \in \mathcal{F}\mathbf{H}_D\).
3.1.2.1 Encuentre las estimaciones de las tres primeras funciones propias multivariadas, grafíquelas y presente una explicación de ellas.
Para determinar las componentes principales funcionales multivariadas, se seguirá el enfoque propuesto por Clara Happ, el cual permite realizar MFPCA incluso cuando los dominios de los procesos funcionales son diferentes.
En el presente caso, los dominios son iguales; no obstante, este enfoque resulta conveniente, ya que garantiza propiedades deseables del operador de covarianza del proceso funcional multivariado, tales como ser de tipo Hilbert–Schmidt, autoadjunto y definido positivo.
Dadas muestras \(\mathbf{\chi_1}, \dots, \mathbf{\chi_N}\) de \(\mathbf{\chi}\), el procedimiento de estimación propuesto para MFPCA consta de cuatro pasos:
Para cada elemento \(\chi^{(j)}\) se estima un FPCA univariante basado en las observaciones \(\chi^{(j)}_1, \dots, \chi^{(j)}_N\). Esto produce funciones propias estimadas \(\hat{\phi}^{(j)}_m\) y scores \(\hat{\xi}^{(j)}_{i,m}\), \(i = 1, \dots, N\), \(m = 1, \dots, M_j\),para soluciones de truncamiento elegidas adecuadamente \(M_j\).
Definir la matriz \(\Xi \in \mathbb{R}^{N \times M_+}\), donde cada fila \(\Xi_i\) contiene todos los scores estimados para una observación: \(\Xi_i = \big(\hat{\xi}^{(1)}_{i,1}, \dots, \hat{\xi}^{(1)}_{i,M_1}, \dots, \hat{\xi}^{(p)}_{i,1}, \dots, \hat{\xi}^{(p)}_{i,M_p}\big).\) Un estimador \(\hat{Z} \in \mathbb{R}^{M_+ \times M_+}\) de la matriz de bloques \(Z\) se obtiene como \(\hat{Z} = (N - 1)^{-1} \Xi^\top \Xi.\)
Realizar un análisis espectral de matrices para \(\hat{Z}\), obteniendo valores propios \(\hat{\nu}_m\) y vectores propios ortonormales \(\hat{\mathbf{c}}_m\), \(m = 1, \dots, M_+\).
Los estimadores elemento a elemento de las funciones propias multivariantes asociadas a \(\hat{\nu}_m\) están dados por: \(\hat{\psi}^{(j)}_m(t_j) = \sum_{n=1}^{M_j} [\hat{\mathbf{c}}_m]^{(j)}_n \, \hat{\phi}^{(j)}_n(t_j), t_j \in \mathcal{T}_j,\) y los scores multivariantes pueden calcularse como:
# inicializar matriz grande (2 PCs por proceso)cor_big <-matrix(NA, nrow =2*n, ncol =2*n)# nombreslabels <-unlist(lapply(1:n, function(i) paste0("P", i, "_PC", 1:2)))rownames(cor_big) <- labelscolnames(cor_big) <- labels
Código
for(i in1:n){for(j in1:n){# matriz 2x2 entre proceso i y j block <-cor_matrix(pca_list[[i]], pca_list[[j]])# posiciones en la matriz grande rows <- ((i-1)*2+1):(i*2) cols <- ((j-1)*2+1):(j*2) cor_big[rows, cols] <-round(block,2) }}
Código
cor_long <-melt(cor_big)ggplot(cor_long, aes(Var1, Var2, fill = value)) +geom_tile() +scale_fill_gradient2(low ="blue", high ="red", mid ="white",midpoint =0, limits =c(-1,1)) +theme_minimal() +theme(axis.text.x =element_text(angle =45, hjust =1)) +labs(x ="", y ="", fill ="Correlación")
Código
cor_scores_multi <-cor(MFPCAObj14$scores)cor_long <-melt(cor_scores_multi)ggplot(cor_long, aes(Var1, Var2, fill = value)) +geom_tile() +geom_text(aes(label =round(value, 2)), size =3) +scale_fill_gradient2(low ="blue", high ="red", mid ="white",midpoint =0, limits =c(-1,1)) +theme_minimal() +labs(x ="Componentes", y ="Componentes", fill ="Correlación") +theme(axis.text.x =element_text(angle =45, hjust =1))
3.1.8 Presente una matriz con los graficos de dispersión de las realizaciones de los scores que conjuntamente explican el 90 % de la variación del proceso. Explique el comportamiento de los scores
Código
df <-data.frame(PC1 = MFPCAObj2$scores[,1],PC2 = MFPCAObj2$scores[,2])ggplot(df, aes(x = PC1, y = PC2)) +geom_point(alpha =0.6, size =2, color ="steelblue") +theme_minimal() +labs(title ="Dispersión de los scores (PC1 vs PC2)",x ="Componente principal 1",y ="Componente principal 2" ) +geom_hline(yintercept =0, linetype ="dashed", color ="gray") +geom_vline(xintercept =0, linetype ="dashed", color ="gray")
3.2 Exprese las tres primeras observaciones muestrales usando la descomposición de de Karhunen-Loève
En el caso multivariado, se tiene la descomposición de Karhunen–Loève, de forma que para el vector de curvas aleatorias, $ L^2( _1 ) L^2( _p) $, se tiene que
\[
\mathbf{X}(\mathbf{t}) = \boldsymbol{\mu}(\mathbf{t}) + \sum_{k=1}^\infty \xi_k \boldsymbol{\psi}_k (\mathbf{t})
\] con \(\mathbf{t} = (t_1,\ldots,t_p)^t\). En este caso, se tiene un vector de funciones de tamaño \(p=7\), donde el dominio es el mismo para cada proceso, \(\mathcal{T_1}=\cdots=\mathcal{T_7} = [275, 560]\). De esta forma, se aproxima cada una de las observaciones muestrales de la siguiente manera:
En la sección 4 del artículo de Happ, C., & Greven, S. se presentan varias simulaciones para medir el desempeño de su propuesta. Se tienen tres escenarios:
Observaciones densas de un proceso funcional bivariado en un mismo intervalo unidimensional.
Datos funcionales trivariados en distintos intervalos unidimensionales con diferentes niveles de dispersión de observaciones.
Datos funcionales bivariados en dominios de distinta dimensionalidad (imágenes y funciones).
En cada caso, se tienen 100 datasets con \(N=250\) observaciones: \[
\mathbf{x}_i(\mathbf{t}) = \sum_{m=1}^{M} \rho_{im}\psi_m(\mathbf{t}) + \boldsymbol{\varepsilon}_i(\mathbf{t}), \qquad \boldsymbol{\varepsilon}_i(\mathbf{t}) \overset{\mathrm{iid}}{\sim} \mathrm{N}_p(0, \sigma^2 \mathbf{I})
\] con \(\mathbf{t} \in \mathcal{T}\) e \(i=1,\ldots, N = 250\).
Además se tienen otras configuraciones:
Se tienen datos con y sin error de medición.
Los scores \(\rho_{im}\) son muestras independientes de una distribución normal con media 0 y varianza \(\nu_m\).
Los valores propios son drececientes lineal y exponencialmente. Esto es:
La precisión de las estimaciones se mide con el error relativo.
3.3.1 Sección 4.1
3.3.1.1 Primera configuración
En la primera configuración se tienen en cuenta las primeras \(M=8\) funciones de la base de Fourier en el intervalo \([0,1]\) para ambos procesos funcionales que forman el proceso bivariado de forma que \(\mathcal{T_1}=\mathcal{T_2}=[0,1]\).
Las obsevaciones se muestrean de un grid equidistante de \(S_1=S_2=100\) puntos y se usan \(M_1=M_2=8\) componentes principales funcionales univariadas para estimar las \(M=8\) componentes principales funcionales multivariadas. El método propuesto por los autores se compara con el método implementado en fda, que se denotará como \(\mathrm{MFPCA_{RS}}\), donde se realiza un suavizamiento previo con \(K=15\) splines cúbicos. La función pca.fd(), a diferencia de MFPCA(), devuelve la estimación de dos scores por observación bivariada y función propia estimada, de forma que se suman para poder compararlos con la nueva metodología.
La simulación se realiza mediante la función simMultiFunData() del paquete funData.
A continuación, se define el número de observaciones a simular, el error, el dominio sobre el cual se generan las observaciones y el número de componentes principales univariadas a estimar. Además, se muestra un ejemplo de un dataset generado con valores propios que decaen exponencialmente.
SimDataS1 <-simMultiFunData(type ="split", argvals = argvalsSetting1, M = M, eFunType ="Fourier", eValType ="exponential", N = N)SimDataS1s2 <-addError(SimDataS1$simData, sd =sqrt(s2))
Figura 23: Ejemplo de un dataset simulado bajo la primera configuración
Figura 24: Ejemplo de un dataset simulado bajo la primera configuración
Figura 25: Ejemplo de las funciones propias simuladas bajo la primera configuración
A continuación, se realiza la simulación de esta primera configuración \(B=100\) veces con ambos tipos de decaimiento de los valores propios (exponencial y lineal) y errores de medida (\(\sigma^2=0\) y \(\sigma^2=0.25\)).
Código
S1_exp_s0 <-Sim_Setting1(eValType ="exponential", s2 =0, seed =1, N = N, M =8, argvals = argvalsSetting1, argvalsfd = argvalsfd,uniExpansions = uniExpansions, B =100)S1_exp_s <-Sim_Setting1(eValType ="exponential", s2 = s2, seed =1, N = N, M =8, argvals = argvalsSetting1, argvalsfd = argvalsfd,uniExpansions = uniExpansions, B =100)S1_lin_s0 <-Sim_Setting1(eValType ="linear", s2 =0, seed =1, N = N, M =8, argvals = argvalsSetting1, argvalsfd = argvalsfd,uniExpansions = uniExpansions,B =100)S1_lin_s <-Sim_Setting1(eValType ="linear", s2 = s2, seed =1, N = N, M =8, argvals = argvalsSetting1, uniExpansions = uniExpansions, argvalsfd = argvalsfd,B =100)
Figura 26: Resultados de la replicación de las simulaciones de la primera configuración
3.3.1.2 Segunda configuración
Para la segunda configuración, se evalúa el rendimiento de la nueva propuesta para datos dispersos con las primeras \(M=8\) funciones en la base de Fourier. Se realiza la comparación sin dispersión (Full data), dispersión media (Medium sparsity) y dispersión alta (High sparsity). A diferencia de la configuración anterior, se consideran realizaciones de un proceso funcional trivariado con distintos dominios (\(\mathcal{T}_1=[-1,-0.5]\), \(\mathcal{T}_2=[0,1]\), \(\mathcal{T}_3=[1.5,2]\)) y número de puntos discretizados distintos (\(S_1=S3=50\) y \(S_2=100\)). Además, para cada opción de sparsity se tienen las siguientes aclaraciones:
Full data: no hay faltantes.
Medium sparsity: 50% a 70% de faltantes.
Full sparsity: 70% a 90% de faltantes (modificación por estabilidad numérica).
El MFPCA se calcula dependiendo de la dispersión. Para las simulaciones de datos completos y dispersión media se usan \(M_1=M_2=M_3=8\) componentes principales funcionales univariadas. Con dispersión alta, se usan \(M_1=M_3=3\) y \(M_2=5\) por estabilidad.
A continuación, se muestra un ejemplo de un dataset simulado con un decaimiento exponencial de los valores propios. Al igual que en el caso anterior, se hace uso de la función simMultiFunData().
ggplot( scores_long_diag %>%filter(Component %in%"Score1"),aes(x = DIAGNOSIS, y = Score)) +geom_boxplot() +facet_wrap(~ Component, scales ="free_y") +theme_classic() +labs(x ="Diagnosis",y ="MFPCA score",title ="Boxplots of MFPCA scores by diagnosis" )
Código
ggplot( scores_long_gender %>%filter(Component %in%"Score2"),aes(x = GENDER, y = Score, group = GENDER)) +geom_boxplot() +facet_wrap(~ Component, scales ="free_y") +theme_classic() +labs(x ="Gender",y ="MFPCA score",title ="Boxplots of MFPCA scores by gender" )
Referencias
Berkes, István, Robertas Gabrys, Lajos Horváth, y Piotr Kokoszka. 2009. «Detecting Changes in the Mean of Functional Observations». Journal of the Royal Statistical Society: Series B (Statistical Methodology) 71 (5): 927-46. https://doi.org/10.1111/j.1467-9868.2009.00713.x.
Horváth, Lajos, y Piotr Kokoszka. 2012. Inference for Functional Data with Applications. New York: Springer.