## [1] 2
library(pacman)
p_load("ISLR", "ggplot2", "xfun","cluster","vembedr", "ggrepel", "ggplot")
## Installing package into 'C:/Users/luiso/OneDrive/Documentos/R/win-library/4.1'
## (as 'lib' is unspecified)
## Warning: package 'ggplot' is not available for this version of R
##
## A version of this package for your version of R might be available elsewhere,
## see the ideas at
## https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
## Warning: unable to access index for repository http://www.stats.ox.ac.uk/pub/RWin/bin/windows/contrib/4.1:
## no fue posible abrir la URL 'http://www.stats.ox.ac.uk/pub/RWin/bin/windows/contrib/4.1/PACKAGES'
## Warning: 'BiocManager' not available. Could not check Bioconductor.
##
## Please use `install.packages('BiocManager')` and then retry.
## Warning in p_install(package, character.only = TRUE, ...):
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'ggplot'
## Warning in p_load("ISLR", "ggplot2", "xfun", "cluster", "vembedr", "ggrepel", : Failed to install/load:
## ggplot
library(plspm)
##
## Attaching package: 'plspm'
## The following object is masked from 'package:ggplot2':
##
## alpha
data("cereals")
La reducción de dimensiones es el proceso de reducir el número de variables (también denominadas a veces características o, por supuesto, dimensiones) a un conjunto de valores de variables llamadas variables principales. La propiedad principal de las variables principales es la preservación de la estructura y la información contenida en las variables originales, hasta cierto punto. Las variables principales están ordenadas por importancia, con la primera variable conservando la mayor parte de la estructura y las siguientes variables preservando sucesivamente menos.
Hay muchas técnicas diferentes de reducción de dimensiones que intentan encontrar una representación de los datos en un espacio de menor dimensión que retiene la mayor cantidad de información posible. En general hay dos clases de reducción de dimensión:
La eliminación de funciones consiste en eliminar algunas variables por completo si son redundantes con alguna otra variable o si no proporcionan ninguna información nueva sobre el conjunto de datos. La ventaja de la eliminación de características es que es simple de implementar y hace que nuestro conjunto de datos sea pequeño, incluyendo solo las variables en las que estamos interesados. Pero como desventaja, podríamos perder algo de información de las variables que descartamos.
La extracción de características, por otro lado, es la formación de nuevas variables a partir de las antiguas. La ventaja de la extracción de características es que conserva la mayor parte de la estructura de su conjunto de datos original. Pero como desventaja, las variables recién creadas pierden su interpretación.
La reducción de dimensiones a través de la extracción de características (en lo sucesivo, simplemente reducción de dimensiones) es una herramienta estadística extremadamente poderosa y, por lo tanto, se aplica con frecuencia. Algunos de los principales usos de la reducción de dimensiones son:
simplificación eliminación de ruido selección de variables visualización
Sin embargo, para comprender realmente el poder incluso de las técnicas simples de reducción de dimensiones, consideremos el conjunto de datos reales de los cereales. El conjunto de datos contiene 77 cereales con 15 variables, para este ejemplo queremos separar a los cereales “divertidos” de los de trigo triturado
numeric_vars <- c(
"calories", "protein", "fat", "sodium", "fiber", "carbo",
"sugars", "potass", "vitamins", "weight", "cups", "rating"
)
cereals_num <- cereals[, numeric_vars]
fun_cereals <- c(
"Lucky_Charms", "Count_Chocula", "Froot_Loops",
"Frosted_Flakes", "Cocoa_Puffs", "Cinnamon_Toast_Crunch"
)
shredded_wheat_cereals <- c(
"Shredded_Wheat", "Shredded_Wheat_'n'Bran",
"Shredded_Wheat_spoon_size"
)
cereals_num_sub <- match(
c(fun_cereals, shredded_wheat_cereals),
rownames(cereals_num)
)
cereals_num$classification <- "normal"
cereals_num$classification[match(fun_cereals, rownames(cereals_num))] <- "fun"
cereals_num$classification[match(
shredded_wheat_cereals,
rownames(cereals_num)
)] <- "shredded"
cereals_num$label <- ""
cereals_num$label[cereals_num_sub] <- rownames(cereals_num)[cereals_num_sub]
Imaginemos que tenemos que contestar las preguntas
¿Hay correlacion entre el grupo de cereales divertidos? ¿Hay correlacion entre el grupo de cereales triturados? ¿Que tan diferentes son los cereales del grupo divertido y de triturados? ¿Hay otros cereales parecidos a los agrupados en el grupo divertido?
El uso de técnicas de visualización simples es increíblemente difícil y, a menudo, conduce a respuestas insatisfactorias. Para demostrar esto, solo consideraremos las grasas, las calorías, el sodio y los azúcares. Podemos ver que en cuanto a cantidad de azúcares los cereales rallados son parecidos y también lo son los cereales divertidos , pero son muy diferentes entre sí. Sin embargo, en términos de cantidades de grasas son más similares. Entonces, ¿son similares o diferentes? ¿Y cómo cambiaría nuestra evaluación si añadimos las otras 8 variables numéricas en el conjunto de datos de cereales, que hemos descontado actualmente?
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
ggpairs(cereals_num,
columns = c("fat", "calories", "sodium", "sugars"),
ggplot2::aes(colour = classification)
)
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
Aunque podemos notar algunas cosas nuestras preguntas no se pueden responder debido a la gran cantidad de variables que hay, se debe de representar toda la informacion en dos o tal vez tres dimensiones, afortunadamente eso es exactamente lo que la reduccion de dimesiones hace.
Principal Component Analysis (PCA) es un método estadístico que permite simplificar la complejidad de espacios muestrales con muchas dimensiones a la vez que conserva su información. Supóngase que existe una muestra con n individuos cada uno con p variables (X1, X2, …, Xp), es decir, el espacio muestral tiene p dimensiones. PCA permite encontrar un número de factores subyacentes (z<p) que explican aproximadamente lo mismo que las p variables originales. Donde antes se necesitaban p valores para caracterizar a cada individuo, ahora bastan z valores. Cada una de estas z nuevas variables recibe el nombre de componente principal.
El MDS es una técnica de representación espacial que trata de visualizar sobre un mapa un conjunto de estímulos (firmas, productos, candidatos políticos, ideas u otros artículos) cuya posición relativa se desea analizar. El propósito del MDS es transformar los juicios de similitud o preferencia llevados a cabo por una serie de individuos sobre un conjunto de objetos o estímulos en distancias susceptibles de ser representadas en un espacio multidimensional. El MDS está basado en la comparación de objetos o de estímulos, de forma que si un individuo juzga a los objetos A y B como los más similares entonces las técnicas de MDS colocarán a los objetos A y B en el gráfico de forma que la distancia entre ellos sea más pequeña que la distancia entre cualquier otro par de objetos.
dist_cereals_num <- dist(cereals_num[, 1:12], method = "canberra")
mds_cereals_num <- cmdscale(dist_cereals_num, eig = TRUE, k = 2)
mds_cereals_num <- data.frame(
MDS1 = mds_cereals_num$points[, 1],
MDS2 = mds_cereals_num$points[, 2],
label = cereals_num$label,
classification = cereals_num$classification
)
ggplot(mds_cereals_num, aes(
x = MDS1, y = MDS2,
label = label, col = classification
)) +
geom_point() +
ggrepel::geom_text_repel(cex = 2.5)
Entre otras tecnicas estan la tecnica ICA, la tecnica UMAP, y la t-SNE
library(Rtsne)
tsne_cereals_num <- Rtsne(cereals_num[, 1:12],
pca = FALSE, perplexity = 10,
theta = 0.0
)
tsne_cereals_num <- data.frame(
TSNE1 = tsne_cereals_num$Y[, 1],
TSNE2 = tsne_cereals_num$Y[, 2],
label = cereals_num$label,
classification = cereals_num$classification
)
ggplot(tsne_cereals_num, aes(
x = TSNE1, y = TSNE2,
label = label, col = classification
)) +
geom_point() +
ggrepel::geom_text_repel(cex = 2.5)
library(uwot)
## Loading required package: Matrix
umap_cereals_num <- umap(cereals_num[, 1:12],
n_neighbors = 15,
min_dist = 1, spread = 5
)
umap_cereals_num <- data.frame(
UMAP1 = umap_cereals_num[, 1],
UMAP2 = umap_cereals_num[, 2],
label = cereals_num$label,
classification = cereals_num$classification
)
ggplot(umap_cereals_num, aes(
x = UMAP1, y = UMAP2,
label = label, col = classification
)) +
geom_point() +
ggrepel::geom_text_repel(cex = 2.5)
cereals_num_int <- which(umap_cereals_num$UMAP1 < 2 &
umap_cereals_num$UMAP1 > -10 &
umap_cereals_num$UMAP2 > 2 &
umap_cereals_num$UMAP2 < 12)
umap_cereals_num$label2 <- ""
umap_cereals_num$label2[cereals_num_int] <- rownames(cereals_num)[cereals_num_int]
umap_cereals_num$label2[cereals_num_sub] <- ""
ggplot(umap_cereals_num, aes(
x = UMAP1, y = UMAP2,
label = label2, col = classification
)) +
geom_point() +
ggrepel::geom_text_repel(cex = 2.5)
La dificultad de aplicar la reducción de dimensiones es que cada técnica de reducción de dimensiones está diseñada para mantener ciertos aspectos de los datos originales y, por lo tanto, puede ser apropiada para una tarea e inapropiada para otra. Para muchas aplicaciones, puede ser difícil encontrar objetivamente el método o la parametrización correctos para la tarea de reducción de dimensiones. Para encontrar la técnica de reducción de dimensión adecuada para sus datos, considere la naturaleza y la resolución de sus datos. ¿Está interesado o es capaz de capturar solo relaciones a pequeña escala o se está enfocando en relaciones a largo plazo? En el primer caso, es posible que desee considerar solo técnicas de reducción de dimensiones que conserven la estructura local y, en el segundo caso, debe centrarse en técnicas de reducción de dimensiones que conserven la estructura global.
Para comprender si los algoritmos elegidos distorsionan las distancias, puede utilizar el paquete dimRed. En particular, este paquete proporciona una visualización útil. Esta visualización muestra la “corrección” de la reducción de la dimensión (R_NX) para diferentes números de vecinos más cercanos (K). Puede usar esto para ver si las distancias se distorsionan cuando varía la cantidad de vecinos considerados. Aquí puede ver que para un ejemplo tan simple como el conjunto de datos de cereales, los enfoques simples como PCA e ICA son mucho mejores para preservar las distancias. Tenga en cuenta que este paquete no proporciona necesariamente todas las reducciones de dimensión, pero es excelente para desarrollar una intuición para sus datos.
library(dimRed)
## Loading required package: DRR
## Loading required package: kernlab
##
## Attaching package: 'kernlab'
## The following objects are masked from 'package:plspm':
##
## alpha, rho
## The following object is masked from 'package:ggplot2':
##
## alpha
## Loading required package: CVST
##
## Attaching package: 'dimRed'
## The following object is masked from 'package:stats':
##
## embed
## The following object is masked from 'package:base':
##
## as.data.frame
embed_methods <- c("PCA", "FastICA")
data_emb <- lapply(embed_methods, function(x)
embed(cereals_num[, 1:12], x))
names(data_emb) <- embed_methods
plot_R_NX(data_emb)
## Warning: `gather_()` was deprecated in tidyr 1.2.0.
## Please use `gather()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.