Codigo - Multivariate Methods: T² Chart de Hotelling con detección de valores atípicos multivariados

Genera datos espectrales para dos sensores, detecta valores atípicos multivariados mediante T² Chart con límite de control UCL basado en la distribución F, verifica normalidad (Royston) e igualdad de covarianzas (Box), y compara sensores con T² de Hotelling para varianzas iguales y desiguales.

Scripts multivariados

T² Chart de Hotelling con detección de outliers multivariados en espectroscopía

Genera datos espectrales para dos sensores, detecta valores atípicos multivariados mediante T² Chart con límite de control UCL basado en la distribución F, verifica normalidad (Royston) e igualdad de covarianzas (Box), y compara sensores con T² de Hotelling para varianzas iguales y desiguales.

# T² CHART DE HOTELLING CON DETECCIÓN DE OUTLIERS MULTIVARIADOS
library(MASS)
library(ggplot2)
library(MVN)
library(biotools)

set.seed(2024)

# Parámetros
n1 <- 50; n2 <- 50; p <- 3
mu_1 <- c(0.30, 0.25, 0.45)
mu_2 <- c(0.32, 0.24, 0.46)

Sigma_1 <- matrix(c(
  0.0015,  0.0008,  0.0010,
  0.0008,  0.0012, -0.0003,
  0.0010, -0.0003,  0.0020
), nrow = 3, byrow = TRUE)

Sigma_2 <- matrix(c(
  0.0018,  0.0009,  0.0011,
  0.0009,  0.0014, -0.0004,
  0.0011, -0.0004,  0.0022
), nrow = 3, byrow = TRUE)

datos_sensor1 <- mvrnorm(n = n1, mu = mu_1, Sigma = Sigma_1)
colnames(datos_sensor1) <- c("Rojo_650nm", "Verde_550nm", "NIR_850nm")
datos_sensor2 <- mvrnorm(n = n2, mu = mu_2, Sigma = Sigma_2)
colnames(datos_sensor2) <- c("Rojo_650nm", "Verde_550nm", "NIR_850nm")

# Función para T² Chart (detección de outliers)
detectar_outliers_T2 <- function(datos, alpha = 0.05) {
  n <- nrow(datos); p <- ncol(datos)
  x_bar <- colMeans(datos); S <- cov(datos); S_inv <- solve(S)
  T2_values <- numeric(n)
  for(i in 1:n) {
    diff <- datos[i, ] - x_bar
    T2_values[i] <- as.numeric(t(diff) %*% S_inv %*% diff)
  }
  F_crit <- qf(1 - alpha, df1 = p, df2 = n - p)
  UCL <- ((p * (n - 1) * (n + 1)) / (n * (n - p))) * F_crit
  outliers_idx <- which(T2_values > UCL)
  data.frame(Obs = 1:n, T2 = T2_values, UCL = UCL, Es_Outlier = T2_values > UCL)
}

# Detectar outliers en ambos sensores
res_s1 <- detectar_outliers_T2(datos_sensor1)
res_s2 <- detectar_outliers_T2(datos_sensor2)

cat(sprintf("Sensor 1: %d outliers de %d (UCL=%.4f)\n",
    sum(res_s1$Es_Outlier), n1, res_s1$UCL[1]))
cat(sprintf("Sensor 2: %d outliers de %d (UCL=%.4f)\n\n",
    sum(res_s2$Es_Outlier), n2, res_s2$UCL[1]))

# Normalidad multivariada
shapiro_1 <- mvn(data = datos_sensor1, mvnTest = "royston", multivariatePlot = "none")
shapiro_2 <- mvn(data = datos_sensor2, mvnTest = "royston", multivariatePlot = "none")
cat(sprintf("Normalidad Sensor 1: p = %.4f\n", shapiro_1$multivariateNormality$`p value`))
cat(sprintf("Normalidad Sensor 2: p = %.4f\n\n", shapiro_2$multivariateNormality$`p value`))

# Test de Box
datos_combined <- rbind(datos_sensor1, datos_sensor2)
grupo <- factor(rep(c("S1", "S2"), c(n1, n2)))
box_test <- boxM(datos_combined, grupo)
varianzas_iguales <- box_test$p.value > 0.05
cat(sprintf("Test de Box: p = %.4f → %s\n\n", box_test$p.value,
    ifelse(varianzas_iguales, "Varianzas iguales", "Varianzas desiguales")))

# T² de Hotelling dos muestras
x_bar_1 <- colMeans(datos_sensor1); x_bar_2 <- colMeans(datos_sensor2)
S_1 <- cov(datos_sensor1); S_2 <- cov(datos_sensor2)
d <- x_bar_1 - x_bar_2

S_pooled <- ((n1-1)*S_1 + (n2-1)*S_2) / (n1+n2-2)
T2_pooled <- as.numeric((n1*n2)/(n1+n2) * t(d) %*% solve(S_pooled) %*% d)
F_pooled <- ((n1+n2-p-1)/((n1+n2-2)*p)) * T2_pooled
p_val_pooled <- 1 - pf(F_pooled, p, n1+n2-p-1)
cat(sprintf("T² Pooled: F = %.4f, p = %.6f\n", F_pooled, p_val_pooled))

# T² Chart - Gráfico Sensor 1
ggplot(res_s1, aes(x = Obs, y = T2)) +
  geom_line(color = "#2E86AB", size = 1) +
  geom_point(aes(color = Es_Outlier), size = 3) +
  geom_hline(yintercept = res_s1$UCL[1], color = "red", linetype = "dashed", size = 1.5) +
  scale_color_manual(values = c("FALSE" = "#2E86AB", "TRUE" = "#e74c3c"),
                     labels = c("Normal", "Outlier")) +
  annotate("text", x = n1*0.9, y = res_s1$UCL[1]*1.1,
           label = sprintf("UCL = %.2f", res_s1$UCL[1]), color = "red", fontface = "bold") +
  labs(title = "T² Chart - Sensor 1",
       subtitle = sprintf("Outliers: %d de %d", sum(res_s1$Es_Outlier), n1),
       x = "Observación", y = "Estadístico T²", color = "Estado") +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"),
        legend.position = "top")
Lenguaje: RDescargar script

Notebooks de analisis multivariado

T² Chart y detección de outliers multivariados

Gráficos de control T² de Hotelling para detección de valores atípicos en datos espectrales.

Control de calidad multivariado en sensores

Monitoreo de calidad espectral con límites de control basados en T².

Repositorios de metodos multivariados

Repositorio T² Chart outliers multivariados

Detección de valores atípicos multivariados mediante T² Chart de Hotelling.

Control estadístico multivariado

Herramientas de control de calidad multivariado para espectroscopía.

    T² Chart de Hotelling con detección de valores atípicos multivariados - Metodos Multivariados