# Função para VIP score por classe
vip_por_classe <- function(modelo, ncomp) {
  X <- modelo$X
  Tcomp <- modelo$variates$X[, 1:ncomp, drop = FALSE]   # scores
  W <- modelo$loadings$X[, 1:ncomp, drop = FALSE]       # loadings X
  Q <- modelo$loadings$Y[, 1:ncomp, drop = FALSE]       # loadings Y
  p <- ncol(X)
  G <- nrow(Q)                                          # nº de classes
  
  VIP <- matrix(0, nrow = p, ncol = G)
  rownames(VIP) <- colnames(X)
  colnames(VIP) <- rownames(Q)                          # nomes das classes
  
  for (g in 1:G) {
    SSg <- rep(0, ncomp)
    for (h in 1:ncomp) {
      th <- Tcomp[, h]
      qhg <- Q[g, h]
      SSg[h] <- sum(th^2) * (qhg^2)
    }
    
    for (j in 1:p) {
      soma_val <- 0
      for (h in 1:ncomp) {
        whj <- W[j, h]
        soma_val <- soma_val + (whj^2) * SSg[h]
      }
      VIP[j, g] <- sqrt(p * soma_val / sum(SSg))
    }
  }
  return(VIP)
}

# Calcular VIP por classe
vip_class <- vip_por_classe(Modelo_final, opt_comp)

vip_df <- as.data.frame(vip_class)
vip_df$Variavel <- rownames(vip_df)

# Formato longo
vip_long <- vip_df %>%
  pivot_longer(-Variavel, names_to = "Classe", values_to = "VIP")

# Top 5 por classe
top5_por_classe <- vip_long %>%
  group_by(Classe) %>%
  slice_max(order_by = VIP, n = 5) %>%
  arrange(Classe, desc(VIP))

# Mostrar tabela interativa dentro do relatório
tabela_vip <- datatable(top5_por_classe,
                        caption = "Top 5 VIP Scores por Classe")

tabela_vip