{ "cells": [ { "cell_type": "markdown", "id": "8d7113e4", "metadata": {}, "source": [ "# Programación para las ciencias biológicas\n", "## R \n", "**Docente:** Charles Escobar \n", "2025" ] }, { "cell_type": "markdown", "id": "b180836f", "metadata": {}, "source": [ "**Nombre del estudiante:**" ] }, { "cell_type": "markdown", "id": "6a4a50ff", "metadata": {}, "source": [ "Ingrese aquí su nombre" ] }, { "cell_type": "markdown", "id": "79cc321f-1236-46aa-9c3a-111cfc28d262", "metadata": {}, "source": [ "# **\"Biología Computacional con R\"**\n", "\n", "**¿Qué esperamos aprender en esta libreta?**\n", "\n", "En esta libreta de trabajo, vamos a explorar los siguientes temas:\n", "\n", "* Trabajar con R y Jupyer \n", "* Breve revisión de las estructuras de programación en R\n", "* Importar archivos\n", "* Usar librerías para trbajar con secuencias biológicas\n", "\n" ] }, { "cell_type": "markdown", "id": "fba10e01", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## R - Operadores Básicos\n", "\n", "\n", "|Operadores|||\t\n", "|:--- |:--- |:--- |\n", "|**Ariméticos**|**Comparativos**|**Lógicos**|\n", "|+ :Suma\t|x>y :Mayor que\t|!x :Negación (NOT)|\n", "|- :Resta\t|x=y :Mayor o igual que\t|x\\|\\|y :O (OR)\n", "|/ :División\t|x<=y :Menor o igual que||\t\n", "|^ :Potencia\t|== :Igual a||\t\n", "|%% :Módulo\t|!= :No es igual a||\t\n", "|%/% :División de enteros|||\t\t\n", "\n", "\n" ] }, { "cell_type": "markdown", "id": "2510dd13", "metadata": {}, "source": [ "## R - Funciones Básicas\n", "\n", "|Función\t|Operación|\n", "|:---|:---|\n", "|max(x)\t|Valor máximo de x|\n", "|minx(x)\t|Valor mínimo de x|\n", "|sum(x)\t|Suma de todos los valores de x|\n", "|mean(x)\t|Promedio de los valores de x|\n", "|median(x)\t|Mediana de los valores de x|\n", "|range(x)\t|Rango entre los valores de x|\n", "|var(x)\t|Varianza de los valores de x|\n", "|cor(x,y)\t|Correlación entre los vectores x y y|\n", "|sort(x)\t|Ordenar x|\n", "|exp(x)\t|Función exponencial de x|\n", "|factor(x)|\tVector que se usa para especificar una clasificación discreta de los componentes de otros vectores|" ] }, { "cell_type": "markdown", "id": "da7bd823", "metadata": {}, "source": [ "## R - Operaciones con matrices\n", "\n", "|Función\t|Operación|\n", "|:---|:---|\n", "|rowSums(x)\t|Suma los valores de las filas|\n", "|colSums(x)\t|Suma los valores de las columnas|\n", "|rowMeans(x)\t|Obtiene el promedio de las filas|\n", "|colMean(x)\t|Obtiene el promedio de las columnas|\n", "|+\t|Suma de matrices|\n", "|-\t|Resta de matrices|\n", "|*\t|Multiplicación vectorizada de matrices|\n", "|%*%\t|Producto de matrices|\n", "|t()\t|Transposición de la matriz|\n", "|det()\t|Determinante de la matriz|\n", "|solve()\t|Inverso de la matriz|" ] }, { "cell_type": "markdown", "id": "f5f34f36", "metadata": {}, "source": [ "# R - Importar y exportar datos datos\n", "En R es posible importar y exportar datos con el entorno del sistema operativo con el que se esté trabajando\n", "\n", "## R - Importar datos\n", "\n", "|Función\t|Operación|\n", "|:--|:--|\n", "|read.table()\t|Importa datos separados por tabuladores. Requiere de algunos argumentos básicos:
• file: Ruta y nombre del archivo a importar
• header: Indica si existe un encabezado (TRUE) o no (FALSE)
• as.is: convierte las cadenas de caracteres a factores (TRUE) o los importa como tales (FALSE)|\n", "|read.delim()\t|Variante que importa datos separados por otros separadores que deben ser especificados con el argumento sep|\n", "|read.csv()\t|Variante de read.table que importa datos separados por comas|\n", "|readLines()\t|Lee las líneas de un archivo de texto|\n", "|source()\t|Lee un archivo de scrips de R|\n", "|load()\t|Lee y carga espacios de trabajo guardados|\n", "\n", "\n", "\n", "## R - Exportar datos\n", "|Función\t|Operación|\n", "|:--|:--|\n", "|write.table()\t|Crea un archivo tabular a partir del objeto especificado. Requiere de algunos argumentos importantes
• x: Objeto a exportar
• file: Ruta y nombre del archivo a crear
• append: Agrega (TRUE) o no (FALSE) el objeto al final del archivo especificado
• quote: Coloca (TRUE) o no (FALSE) las comillas a las cadenas de caracteres
• row.names o col.names: Incluye (TRUE) o no (FALSE) los nombres de las columnas en el archivo|\n", "|write.cvs()\t|Crea un archivo separado por comas a partir del objeto|\n", "|writeChar()\t|Escribe cadenas de caracteres en un archivo existente|\n", "|writeLines()\t|Escribe líneas en un archivo existente|" ] }, { "cell_type": "markdown", "id": "59745209-8042-4fa6-b97f-adc2c70866d9", "metadata": {}, "source": [ "# Ejemplos\n", "\n", "## Ejemplos con matrices:\n", "\n", "A continuación se crea una matriz de 3 filas y 3 columnas.\n", "\n", "A<-matrix(c(2,3,4,1,2,3,2,1,0),nrow=3)\n", "\n", "\n", "print(A)" ] }, { "cell_type": "code", "execution_count": null, "id": "6fc1de4c-9378-4e8e-bf31-f40b70ae86de", "metadata": {}, "outputs": [], "source": [ "A<-matrix(c(2,3,4,1,2,3,2,1,0),nrow=3) \n", "print(A)" ] }, { "cell_type": "markdown", "id": "2d12ae6f", "metadata": {}, "source": [ "A<-matrix(c(2,3,4,1,2,3,2,1,0),nrow=3,byrow = T)\n", "\n", "print(A) " ] }, { "cell_type": "markdown", "id": "9ac0bec6-acf0-40e0-a44e-9495b901f334", "metadata": {}, "source": [ "Aquí se crea una matriz de 3 filas y 3 columnas, pero con la opción `byrow = TRUE`, los números se colocan por filas." ] }, { "cell_type": "code", "execution_count": null, "id": "d5715cab", "metadata": { "scrolled": true }, "outputs": [], "source": [ "A<-matrix(c(2,3,4,1,2,3,2,1,0),nrow=3,byrow = T)\n", "\n", "print(A)" ] }, { "cell_type": "markdown", "id": "a8fc6d85-8643-46ca-9ee2-2b2f95cba527", "metadata": {}, "source": [ "El operador `*` con matrices en R realiza una multiplicación elemento a elemento (no es multiplicación de matrices)." ] }, { "cell_type": "markdown", "id": "5d4dc4b1", "metadata": {}, "source": [ "A<-matrix(c(2,3,4,1,2,3,2,1,0),nrow=3,byrow = T)\n", "\n", "B<-A*A\n", "\n", "print(B)" ] }, { "cell_type": "code", "execution_count": null, "id": "dd8cb871", "metadata": {}, "outputs": [], "source": [ "A<-matrix(c(2,3,4,1,2,3,2,1,0),nrow=3,byrow = TRUE)\n", "\n", "B<-A*A\n", "\n", "print(B)" ] }, { "cell_type": "markdown", "id": "1b3ab041-54a2-414c-9cfb-999a36d732e8", "metadata": {}, "source": [ "### Inversa de una matriz.\n", "\n", "Para obtener la inversa de una matriz el determinante debe ser distinto de cero" ] }, { "cell_type": "markdown", "id": "7a3cb2ac-ed40-4df9-b901-2b2da6bbf5a3", "metadata": {}, "source": [ "Determinante de una matriz\n", "\n", "det(B)" ] }, { "cell_type": "code", "execution_count": null, "id": "5734f661-6472-4548-9320-fb8819ebf06a", "metadata": {}, "outputs": [], "source": [ "det(B)" ] }, { "cell_type": "markdown", "id": "cdca3747", "metadata": {}, "source": [ "Dado que el determinante es distinto de cero se puede obtener su inversa\n", "\n", "C<-solve(B)\n", "\n", "print(C)" ] }, { "cell_type": "code", "execution_count": null, "id": "1cc89e10-8359-421e-8165-fd8ae071e761", "metadata": {}, "outputs": [], "source": [ "C<-solve(B)\n", "\n", "print(C)" ] }, { "cell_type": "markdown", "id": "fb1481fb-6dc8-4cc3-a343-9f085380988d", "metadata": {}, "source": [ "Para que se muestre de mejor manera se puede redondear limitando los decimales\n", "\n", "print(round(C, 2)) " ] }, { "cell_type": "code", "execution_count": null, "id": "fa26b839-a84b-47ea-9775-2f1537e4649b", "metadata": {}, "outputs": [], "source": [ "print(round(C, 2)) " ] }, { "cell_type": "markdown", "id": "47b8dcf8-04cb-46c1-ac54-62b92902bf6f", "metadata": {}, "source": [ "Dado que B es invertible, `B %*% C` debería devolver la matriz identidad:\n", "\n", "D<- B%*%C\n", "\n", "print(D)" ] }, { "cell_type": "code", "execution_count": null, "id": "04d4307b-28fe-48db-9d65-ab8b8182a035", "metadata": {}, "outputs": [], "source": [ "D<- B%*%C\n", "\n", "print(D)" ] }, { "cell_type": "markdown", "id": "b57e705f-dedf-420a-87eb-b4b86c0ee73d", "metadata": {}, "source": [ "Para que se muestre de mejor manera se puede redondear limitando los decimales\n", "\n", "print(round(D, 2)) " ] }, { "cell_type": "code", "execution_count": null, "id": "c599382a-3b12-4a12-92fa-f9c914ae2d6a", "metadata": {}, "outputs": [], "source": [ "print(round(D, 2)) " ] }, { "cell_type": "markdown", "id": "f86313ee", "metadata": {}, "source": [ "Dado que hemos creado varios objetos podemos visualizarlos como lo habíamos visto previamente.\n", "\n", "\n", "objects()" ] }, { "cell_type": "code", "execution_count": null, "id": "17cd6611", "metadata": { "scrolled": true }, "outputs": [], "source": [ "help(solve)" ] }, { "cell_type": "code", "execution_count": null, "id": "5d169246-7c84-454f-a057-dd4f11bb97a8", "metadata": {}, "outputs": [], "source": [ "b=c(1,2,3)" ] }, { "cell_type": "code", "execution_count": null, "id": "9dba1ebf-3132-4c54-b016-3b791edd721f", "metadata": {}, "outputs": [], "source": [ "print(round(D, 2)) " ] }, { "cell_type": "code", "execution_count": null, "id": "fd0ee172-0f7a-4a4f-8873-b1a23e3f0420", "metadata": { "scrolled": true }, "outputs": [], "source": [ "solve(D,b)" ] }, { "cell_type": "markdown", "id": "09f7823e-9eaf-45d1-af92-6dd9be626fc8", "metadata": {}, "source": [ "|||||\n", "|-|-|-|-|\n", "|X|0|0|1|\n", "|0|Y|0|2|\n", "|0|0|Z|3|" ] }, { "cell_type": "markdown", "id": "cdd30221-f2ad-4633-afe4-86b66e12ea20", "metadata": {}, "source": [ "solve() en R se puede usar para dos propósitos relacionados pero distintos:\n", "\n", "1. Calcular la inversa de una matriz.\n", " * Cuando se llama a `solve(A)` con una sola matriz cuadrada A, R devuelve la inversa de esa matriz. \n", "\n", "2. Resolver sistemas de ecuaciones lineales.\n", " * Cuando se llama a `solve(A, b)`, R resuelve el sistema de ecuaciones lineales de la forma `𝐴 ⋅ 𝑥 = 𝑏`\n", "\n", "\n", "Aunque parecen tareas diferentes, ambas se basan en principios de álgebra lineal \n", "\n" ] }, { "cell_type": "markdown", "id": "dd83d9ef", "metadata": {}, "source": [ "# Ejemplos con datasets\n", "\n", "## Dataset Iris\n", "https://archive.ics.uci.edu/static/public/53/iris.zip\n", "\n", "Primero descargamos el archivo en formato ZIP" ] }, { "cell_type": "code", "execution_count": null, "id": "1585f186-779b-4616-8c48-242e708eebee", "metadata": {}, "outputs": [], "source": [ "system(\"wget https://archive.ics.uci.edu/static/public/53/iris.zip 2>&1\")" ] }, { "cell_type": "markdown", "id": "1935b05b-8cfa-4473-840a-6edb1c0a1696", "metadata": {}, "source": [ "Para poder listar todos los archivos en el zip directamente en R, sin tener que descomprimirlo, podemos usar la función `unzip()` con el argumento `list = TRUE`, que le dice a R que no extraiga los archivos, sino que muestre una lista de los archivos contenidos en el zip.\n", "\n", "El resultado de `unzip(..., list = TRUE)` es un data frame que tiene varias columnas. `$Name` extrae la columna con los nombres de los archivos que están dentro del archivo .zip." ] }, { "cell_type": "code", "execution_count": null, "id": "0ab90823-e0bb-451d-9822-f4b921f9d473", "metadata": {}, "outputs": [], "source": [ "archivos <- unzip(\"iris.zip\", list = TRUE)$Name\n", "print(archivos)" ] }, { "cell_type": "markdown", "id": "5e6a3e80-a8ad-47d5-a64f-b84873ed67f9", "metadata": {}, "source": [ "Aquí es de interés el archivo `iris.names` que contiene la descripción de este empaquetado, por tanto lo leeremos con `readLines`, primero como un flujo en crudo y luego veremos como formatear la salida." ] }, { "cell_type": "code", "execution_count": null, "id": "cb0c7d55-9e98-4659-bc8c-af6886593c30", "metadata": {}, "outputs": [], "source": [ "readLines(unz(\"iris.zip\", \"iris.names\"))" ] }, { "cell_type": "markdown", "id": "92388019-a0b1-46aa-a1ca-b9aee86801f1", "metadata": {}, "source": [ "Veamos el efecto de usar la función `cat()`:" ] }, { "cell_type": "code", "execution_count": null, "id": "1a5a31c2-9947-4dc2-8224-9950f8498128", "metadata": {}, "outputs": [], "source": [ "cat(readLines(unz(\"iris.zip\", \"iris.names\")))" ] }, { "cell_type": "markdown", "id": "79529e13-0423-4ef9-862a-6e8190c12c2a", "metadata": {}, "source": [ "Como vemos " ] }, { "cell_type": "code", "execution_count": null, "id": "a5d3e9ba-11b0-46be-86a4-5d680c310334", "metadata": {}, "outputs": [], "source": [ "print(readLines(unz(\"iris.zip\", \"iris.names\")))" ] }, { "cell_type": "markdown", "id": "d209d2e6-9a69-49d3-ae05-8a958036090e", "metadata": {}, "source": [ "Una vez que hemos revisado la documentación de este dataset veamos la data" ] }, { "cell_type": "code", "execution_count": null, "id": "a4d0e1c7-9cd7-4454-8ed9-0b6da8c43124", "metadata": {}, "outputs": [], "source": [ "head(read.csv(unz(\"iris.zip\", \"iris.data\")),10)" ] }, { "cell_type": "markdown", "id": "d3071458-1193-46cd-985c-d1a7fab27e79", "metadata": {}, "source": [ "Asignemos esos datos a la variable X" ] }, { "cell_type": "code", "execution_count": null, "id": "2e35488c-6683-4e96-8ac6-08db723a5ed1", "metadata": {}, "outputs": [], "source": [ "X=read.csv(unz(\"iris.zip\", \"iris.data\"), header = FALSE)" ] }, { "cell_type": "code", "execution_count": null, "id": "b968b10d-03a1-44f6-9c40-8f9ce20e11c1", "metadata": {}, "outputs": [], "source": [ "typeof(X)" ] }, { "cell_type": "code", "execution_count": null, "id": "f14f9ca7-7fb9-46fb-a09c-8e2236feaf2b", "metadata": {}, "outputs": [], "source": [ "class(X)" ] }, { "cell_type": "markdown", "id": "4d05a97f", "metadata": {}, "source": [ "* Revisemos los nombres de la cabecera con names(x)" ] }, { "cell_type": "markdown", "id": "275db013", "metadata": {}, "source": [ "* Revisemos los primeros registros\n", "\n", "\n", "head(X)" ] }, { "cell_type": "code", "execution_count": null, "id": "859c359d", "metadata": { "scrolled": true }, "outputs": [], "source": [ "head(X)" ] }, { "cell_type": "markdown", "id": "385cf3c5-30d1-4b14-a7ae-3a2218778325", "metadata": {}, "source": [ "Dado que la cabecera fue creada de manera genérica por R, odemos reemplazar esos datos con `names()`\n", "\n", "names(X)=c(\"sepal.length\",\"sepal.width\",\" petal.length\",\" petal.width\",\"class\")" ] }, { "cell_type": "code", "execution_count": null, "id": "22f17a4c-6247-49de-bbb7-c15e1c4e5edd", "metadata": {}, "outputs": [], "source": [ "names(X)=c(\"sepal.length\",\"sepal.width\",\"petal.length\",\"petal.width\",\"class\")" ] }, { "cell_type": "code", "execution_count": null, "id": "1ee90236-1a4c-4f70-b556-43325cd950e1", "metadata": {}, "outputs": [], "source": [ "head(X)" ] }, { "cell_type": "markdown", "id": "f4a71b64", "metadata": {}, "source": [ "* Revisemos los últimos 10 registros\n", "\n", "\n", "tail(X,n=10)" ] }, { "cell_type": "code", "execution_count": null, "id": "41797d64", "metadata": { "scrolled": true }, "outputs": [], "source": [ "tail(X,n=10)" ] }, { "cell_type": "markdown", "id": "8735c2c2", "metadata": {}, "source": [ "* Veamos un resumen de los estadísticos de cada unas de las columnas\n", "\n", "\n", "summary(x)" ] }, { "cell_type": "code", "execution_count": null, "id": "e93d519e", "metadata": { "scrolled": true }, "outputs": [], "source": [ "summary(X)" ] }, { "cell_type": "markdown", "id": "24a68fce", "metadata": {}, "source": [ "* Veamos un gráfico de cajas de cada unas de las columnas\n", "\n", "\n", "boxplot(X)" ] }, { "cell_type": "code", "execution_count": null, "id": "5ca25eef", "metadata": {}, "outputs": [], "source": [ "boxplot(X$`petal.length`,X$`petal.width`,X$sepal.length,X$sepal.width)" ] }, { "cell_type": "markdown", "id": "172a15ff-b721-41c2-808b-f486effc2c52", "metadata": {}, "source": [ "# Librería iris\n", "\n", "data(iris)" ] }, { "cell_type": "code", "execution_count": null, "id": "7bb9f511-1bca-42d2-bdec-6ec3a2c1aadc", "metadata": {}, "outputs": [], "source": [ "# Cargar dataset iris\n", "data(iris)" ] }, { "cell_type": "markdown", "id": "618dd18b", "metadata": {}, "source": [ "\n", "### Factor\n", "\n", "Los factores son la forma en la que R guarda toda la informacion categorica. Un ejemplo de factor puede ser el genero (masculino/femenino), tienen sus propios valores y orden.\n", "\n", "Fuente: https://rpubs.com/mikeldejuan/424099\n", "\n", "irisfactor<-factor(iris$Species)\n", "\n", "levels(irisfactor)" ] }, { "cell_type": "code", "execution_count": null, "id": "7a674bdb", "metadata": {}, "outputs": [], "source": [ "irisfactor<-factor(iris$Species)\n", "levels(irisfactor)" ] }, { "cell_type": "markdown", "id": "66018b2b", "metadata": {}, "source": [ "summary(irisfactor)" ] }, { "cell_type": "code", "execution_count": null, "id": "f416b3c2", "metadata": { "scrolled": true }, "outputs": [], "source": [ "summary(irisfactor)" ] }, { "cell_type": "markdown", "id": "8208022c", "metadata": {}, "source": [ "Primeros 10 registros\n", "\n", "\n", "head(y,n=10)" ] }, { "cell_type": "markdown", "id": "61c558d0-b971-481f-b76a-e259737e8f62", "metadata": {}, "source": [ "summary(irisfactor)" ] }, { "cell_type": "code", "execution_count": null, "id": "52e62445", "metadata": { "scrolled": true }, "outputs": [], "source": [ "class(iris)" ] }, { "cell_type": "markdown", "id": "060f775e", "metadata": {}, "source": [ "# R - Gráficos\n", "Existe una enorme variedad de gráficos que se pueden crear con R\n", "\n", "* Distribuciones\n", " * Violín\n", " * Densidad\n", " * Histograma\n", " * BoxPlot\n", " * Ridgeline\n", "* Correlaciones\n", " * Dispersión\n", " * Mapas de calor\n", " * Correlogramas\n", " * Burbujas\n", " * Dispersión conectados\n", " * Densidad 2D\n", "* Rankings\n", " * Gráficos de barras\n", " * Araña / radar\n", " * Nube de palabras\n", " * Paralelos\n", " * Lollipop\n", " * Barras circulares\n", "* Partes de un todo\n", " * Árboles\n", " * Dendogramas\n", " * Diagrama de Venn\n", " * Barras divididas\n", " * Pasteles\n", " * Donas\n", " * Paquetes circulares\n", "* Mapas\n", " * Mapas\n", " * Conexiones\n", " * Burbujas\n", " * etc\n", "* Flujos\n", " * Redes\n", " * Diagramas de cuerdas\n", " * Agrupamiento jerárquico\n", " * Diagrama de Sankey\n", "* Etc, etc.\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "id": "6328fc1f-2b9e-4779-963e-48fb0a0a039f", "metadata": { "scrolled": true }, "source": [ "## R - Gráficos\n", "|Función\t|Operación|\n", "|:--|:--|\n", "|plot()\t|Crea gráficos de nubes de puntos (Scatterplots) que varía según el objeto graficado|\n", "|lines()\t|Agrega lineas a un gráfico existente según una matriz de coordenadas de inicio y fin en los ejes x y y|\n", "|points()\t|Agrega puntos a un gráfico existente según las coordenadas dadas|\n", "|text()\t|Agrega un texto a un gráfico existente según las coordenadas dadas|\n", "|title()\t|Agrega anotaciones a los ejes, título o subtítulo|\n", "|mtext()\t|Agrega un texto a las márgenes|\n", "|axis()\t|Agrega graduación a los ejes|" ] }, { "cell_type": "markdown", "id": "1e4d27c9-91ad-45e5-bcde-2c19fe0926ba", "metadata": {}, "source": [ "## R - Gráficos dataset iris (Histograma)\n", "\n", "hist(iris$Sepal.Length, \n", " col='green',\n", " main='Histograma', \n", " xlab='Longitud', \n", " ylab='Frecuencia') " ] }, { "cell_type": "code", "execution_count": null, "id": "37ffe174", "metadata": {}, "outputs": [], "source": [ "hist(iris$Sepal.Length, \n", " col='green',\n", " main='Histograma', \n", " xlab='Longitud', \n", " ylab='Frecuencia') " ] }, { "cell_type": "markdown", "id": "3d2903a6-81d6-4440-8b60-24dfc1cbf5c9", "metadata": {}, "source": [ "## R - Gráficos dataset iris (Dispersión)\n", "\n", "
plot(iris$Sepal.Width, iris$Sepal.Length,\n",
    "     col='red',\n",
    "     main='Scatterplot',\n",
    "     xlab='Ancho sépalo',\n",
    "     ylab='Longitud sépalo',\n",
    "     pch=19)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1d879526-31b0-47a6-ac0e-3d298301c9f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "plot(iris$Sepal.Width, iris$Sepal.Length,\n",
    "     col='red',\n",
    "     main='Scatterplot',\n",
    "     xlab='Ancho sépalo',\n",
    "     ylab='Longitud sépalo',\n",
    "     pch=19)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "301248af-5c09-4056-a671-de63747ded72",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Graficar incluyendo las clases por color\n",
    "plot(iris$Sepal.Width, iris$Sepal.Length,\n",
    "     col = as.numeric(iris$Species),  # Asignar un color por especie\n",
    "     main = 'Scatterplot de Iris',\n",
    "     xlab = 'Ancho del Sépalo',\n",
    "     ylab = 'Longitud del Sépalo',\n",
    "     pch = 19)\n",
    "\n",
    "# Añadir una leyenda para identificar las clases\n",
    "legend(\"topright\", legend = levels(iris$Species),\n",
    "       col = 1:3, pch = 19)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "70157eec-f46f-4c28-8169-2896b2f349ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "names(iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "03b1376e-dcc6-4bf8-9266-4cac00fc0066",
   "metadata": {},
   "outputs": [],
   "source": [
    "summary(iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d83ff77-52e6-4c70-8deb-27d772a14e9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "boxplot(iris)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9885610-5146-4895-b409-ec21dfb02804",
   "metadata": {},
   "source": [
    "### Correlación y Regresión Lineal\n",
    "\n",
    "En ocasiones nos puede interesar estudiar si existe o no algún tipo de relación entre dos variables aleatorias. Las relaciones o asociaciones de este tipo entre variables se denominan correlaciones; y están medidas en escalas ordinales o de intervalos. En particular, nos interesa cuantificar la intensidad de la relación lineal entre dos variables.\n",
    "\n",
    "Cuando el aumento de una de las variables viene acompañado del aumento de la otra, se trata de una correlación positiva o directa. La superficie de un bosque y el numero de nidos en el están correlacionados positivamente. Si el aumento de una variable viene acompañado de una disminución en la otra, la correlación es negativa o inversa.\n",
    "\n",
    "El hecho de que dos variables estén correlacionadas no quiere decir que una sea la causante de la otra dos variables pueden estar independientemente relacionadas con una tercera (quizás no identificada).\n",
    "\n",
    "Es importante notar que la existencia de correlación entre variables no implica causalidad.\n",
    "\n",
    "Una Correlación perfecta se da cuando todos los puntos de un diagrama de dispersión forman una linea recta perfecta. Estas correlaciones perfectas (positivas o negativas) prácticamente no existen en biología; suelen ser privilegio exclusivo de los físicos.\n",
    "\n",
    "En lenguaje llano, la palabra “correlación” describe cualquier tipo de relación entre objetos y hechos. No obstante, en estadística tiene un significado mas preciso: se refiere a la relación cuantitativa entre dos variables medidas en escalas ordinales o de intervalos.\n",
    "\n",
    "Los coeficientes de correlación se pueden calcular mediante métodos paramétricos y no paramétricos. Un coeficiente paramétrico es el Coeficiente de Correlación de Pearson, que se usa para observaciones obtenidas sobre una escala de intervalos y esta sujeto a condiciones mas restrictivas que las alternativas no paramétricas. De estas, una de las mas ampliamente utilizadas es el Coeficiente de Correlación por Rangos de Spearman.\n",
    "\n",
    "Si no hay correlación de ningún tipo entre dos variable, entonces tampoco habrá correlación lineal, por lo que r = 0. Sin embargo, el que ocurra r = 0 solo nos dice que no hay correlación lineal, pero puede que la haya de otro tipo. Mientras mas cercano a cero la correlación es mas débil.\n",
    "\n",
    "Fuente: https://rpubs.com/osoramirez/316691 \n",
    "\n",
    "```R\n",
    "cor(iris$Sepal.Length,iris$Petal.Length)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "22495a25-726e-49ea-8614-6eb117084867",
   "metadata": {},
   "outputs": [],
   "source": [
    "cor(iris$Sepal.Length,iris$Petal.Length)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b80f7d97-11b8-4181-bb34-4a4c8de94769",
   "metadata": {},
   "source": [
    "```R\n",
    "cor(iris$Sepal.Length,iris$Petal.Width)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e29115c8-6d85-4700-8268-da4ee78d3514",
   "metadata": {},
   "outputs": [],
   "source": [
    "cor(iris$Sepal.Length,iris$Petal.Width)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "953661da-3915-4543-b9ee-b4ff17152850",
   "metadata": {},
   "source": [
    "```R\n",
    "cor(iris$Sepal.Width,iris$Petal.Width)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "24aa44a2-2ff0-4834-b023-e8b4ab475351",
   "metadata": {},
   "outputs": [],
   "source": [
    "cor(iris$Sepal.Width,iris$Petal.Width)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca753a64-7622-409b-9478-72871c6055ee",
   "metadata": {},
   "source": [
    "## Correlaciones\n",
    "\n",
    "cor()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "43c0e992-af60-4d95-8d60-e9802dfa2ea7",
   "metadata": {},
   "outputs": [],
   "source": [
    "cor(data.frame(iris$Sepal.Length,iris$Sepal.Width,iris$Petal.Length,iris$Petal.Width))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67dcb770-aa0a-4a02-a056-5a8d4e2c2ca2",
   "metadata": {},
   "source": [
    "### Selección por columnas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c4a5676c-35a3-4620-9140-2b7b15a5dc0c",
   "metadata": {},
   "outputs": [],
   "source": [
    "cor(iris[, 1:4])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "deb25288-7769-4bac-9957-b47f37594287",
   "metadata": {},
   "source": [
    "### Mapa de Calor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "36d03d42-a5b2-4e09-99d5-6b3198cc0c2e",
   "metadata": {},
   "outputs": [],
   "source": [
    "heatmap(cor(iris[, 1:4]),\n",
    "       main = \"Heatmap de Correlaciones - Iris\",\n",
    "       scale = \"none\",\n",
    "       symm = TRUE)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77bc4847-1061-494b-95ee-6ffa05b9aee7",
   "metadata": {},
   "source": [
    "# Ejemplos con `seqinr`\n",
    "\n",
    "Desde la consola de R instale `seqinr`\n",
    "\n",
    "* install.packages(\"seqinr\")\n",
    "\n",
    "Una vez instalado, cargue la librería\n",
    "\n",
    "library(seqinr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "73c30af2-805d-4897-94e5-b6e12c100f7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cargar la librería\n",
    "library(seqinr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8aa5c9c2-09c3-4458-aa67-fec6ab238de1",
   "metadata": {},
   "source": [
    "* Leer el archivo FASTA\n",
    "  \n",
    "ruta_fasta <- \"sampledata/t-coffee/sproteases_small_dna.fasta\"\n",
    "\n",
    "secuencias <- read.fasta(file = ruta_fasta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "25774e56-fa3b-4a16-ab92-8c33bd904b55",
   "metadata": {},
   "outputs": [],
   "source": [
    "ruta_fasta <- \"sampledata/t-coffee/sproteases_small_dna.fasta\"\n",
    "\n",
    "secuencias <- read.fasta(file = ruta_fasta)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0755a47-fe07-4767-9cbe-e2dbf3920d5a",
   "metadata": {},
   "source": [
    "* Verificar las secuencias leídas\n",
    "  \n",
    "print(secuencias)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bfd5247c-89fd-406a-9b63-3ad03656d807",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "print(secuencias)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4186ef19-b9ee-4396-bdd4-381c8b3b0495",
   "metadata": {},
   "source": [
    "* Ver el número de secuencias\n",
    "  \n",
    "length(secuencias)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6ffc674b-efa8-4f7f-ba15-c1952d63b8a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "length(secuencias)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0f92b4b-1882-487b-940b-eb109b70175d",
   "metadata": {},
   "source": [
    "* Ver los nombres de las secuencias\n",
    "\n",
    "names(secuencias)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ba6fffd7-421d-4649-9701-a8d52fb63361",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "names(secuencias)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c85652b1-b0d8-4d54-9fd3-a9fff582847a",
   "metadata": {},
   "source": [
    "* Acceder a la primera secuencia\n",
    "\n",
    "primera_secuencia <- secuencias[[1]]\n",
    "\n",
    "print(primera_secuencia)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a71b0dee-6595-4df0-bf8d-af9f350b83b8",
   "metadata": {},
   "outputs": [],
   "source": [
    "primera_secuencia <- secuencias[[1]]\n",
    "\n",
    "print(primera_secuencia)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3d48c39-166e-4f24-b28e-7ff8b188443d",
   "metadata": {},
   "source": [
    "* Ver la longitud de la primera secuencia\n",
    "\n",
    "length(primera_secuencia)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9027c6f1-058b-4021-aadd-a8b58bda6f7a",
   "metadata": {},
   "outputs": [],
   "source": [
    "length(primera_secuencia)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0ccffc0-dd3c-4858-9318-c0abe0d9726f",
   "metadata": {},
   "source": [
    "* Calcular la composición de bases de la primera secuencia\n",
    "\n",
    "composicion_bases <- count(primera_secuencia, 1)\n",
    "\n",
    "print(composicion_bases)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e5997f0a-a286-40c4-abe9-528974e84b14",
   "metadata": {},
   "outputs": [],
   "source": [
    "composicion_bases <- count(primera_secuencia, 1)\n",
    "\n",
    "print(composicion_bases)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c0e3a76-6752-4a5d-96ec-2e24a60864f0",
   "metadata": {},
   "source": [
    "* Porcentaje GC de la secuencia C)\n",
    "\n",
    "GC_content <- GC(primera_secuencia)\n",
    "\n",
    "cat(\"Contenido GC de la primera secuencia:\", GC_content, \"%\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "34548b9b-4345-4b20-920e-11a8d03c68c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "GC_content <- GC(primera_secuencia)\n",
    "\n",
    "cat(\"Contenido GC de la primera secuencia:\", GC_content*100, \"%\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2674fd87-d276-4ab8-a949-6cebbe95b880",
   "metadata": {},
   "source": [
    "* Traducir la primera secuencia de ADN a aminoácidos\n",
    "\n",
    "proteina <- translate(primera_secuencia)\n",
    "\n",
    "print(proteina)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d3f173ca-4b62-42fb-8e4d-8e2fb33db420",
   "metadata": {},
   "outputs": [],
   "source": [
    "proteina <- translate(primera_secuencia)\n",
    "\n",
    "print(proteina)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb722e9d-2f1b-45bd-9f81-7c87f2a6f356",
   "metadata": {},
   "source": [
    "* Graficar la composición de nucleótidos\n",
    "\n",
    "barplot(composicion_bases, \n",
    "        col = \"skyblue\",   \n",
    "        main = \"Composición de Nucleótidos\",  \n",
    "        xlab = \"Nucleótidos\",   \n",
    "        ylab = \"Frecuencia\")  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f51f3d7d-9e44-426a-a8ca-6e0105aba991",
   "metadata": {},
   "outputs": [],
   "source": [
    "barplot(composicion_bases, \n",
    "        col = \"skyblue\", \n",
    "        main = \"Composición de Nucleótidos\",\n",
    "        xlab = \"Nucleótidos\", \n",
    "        ylab = \"Frecuencia\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c123bd03-2a61-47fb-ba7e-1d9b368a797a",
   "metadata": {},
   "source": [
    "## Tarea \n",
    "\n",
    "### 1. Práctica\n",
    "Usando `seqinr`, de la siguiente secuencia https://seracademia.com/academia/Bio_Info/M5/ASM1888508v1/ncbi_dataset/data/GCA_018885085.1/GCA_018885085.1_ASM1888508v1_genomic.fna extraiga:\n",
    "\n",
    "* El nombre de la secuencia\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f88abc5c-8b07-423a-b429-84052b92fcc4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "a808c9f9-8cf1-4d56-a36b-dd825c2062b3",
   "metadata": {},
   "source": [
    "* La longitud de la secuencia"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ab269be1-736c-4f8d-8493-0d7be28b8ab8",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "aeb0a3d4-e809-4d97-9313-eabacf104ba4",
   "metadata": {},
   "source": [
    "* Contenido GC de la secuencia"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad3861fa-a315-42dd-8912-cf3182695d34",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "e93de2eb-bcc5-4e83-9543-e24b75a47614",
   "metadata": {},
   "source": [
    "* Grafique como  barras la composición de los nucléotidos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8054368e-f0ad-4913-9966-bd788b0529a6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "52b1799d-bb32-4120-a747-5c2987c0ee0f",
   "metadata": {},
   "source": [
    "### 2. Cuestionario\n",
    "\n",
    "Conteste las siguientes preguntas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "80c0d0c3-9859-4493-ac26-8f60804b0719",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "54b45a3a-2bfb-4f86-9e0d-9f90cdcdd502",
   "metadata": {},
   "source": [
    "#### 2.1. ¿Cómo se hace el análisis exploratio de archivos  en R?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "701221f7-3e26-4671-aadc-4fa2afe3dc53",
   "metadata": {},
   "source": [
    "ponga aquí su respuesta"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "732ca0b0-65b0-47ff-9cd0-76ba2bb6258b",
   "metadata": {},
   "source": [
    "#### 2.3. ¿Qué es `seqinr` en R?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc2e174d-ace0-4421-94b8-5e74d5c3b14f",
   "metadata": {},
   "source": [
    "ponga aquí su respuesta"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "852e3bf6-ec1e-4fd1-8299-4864b67d4309",
   "metadata": {},
   "source": [
    "#### 2.2. ¿Cómo se hace la traducción a proteínas con `seqinr`?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c6a4ea1e-7bf1-42a8-9023-8d0a945e57f0",
   "metadata": {},
   "source": [
    "ponga aquí su respuesta"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d81031c",
   "metadata": {},
   "source": [
    "# Conclusiones y Recomendaciones\n",
    "\n",
    "Una vez ejecutado este cuaderno de trabajo y seguido las instrucciones que en el se detallan, desarrolle por lo menos tres conclusiones y recomendaciones delimitadas exclusivamente a las actividades ejecutadas en este cuaderno de trabajo."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c2eefd8-be81-4cd0-807e-b570d68ce4f5",
   "metadata": {},
   "source": [
    "## Conclusiones\n",
    "1. Conclusión 1\n",
    "2. Conclusión 2\n",
    "3. Conclusión 3"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3978a305-ec1e-4a7c-8c03-00c46b575143",
   "metadata": {},
   "source": [
    "## Recomendaciones\n",
    "1. Recomendación 1\n",
    "2. Recomendación 2\n",
    "3. Recomendación 3"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db76f64e-3999-455d-ac08-6f457bc11032",
   "metadata": {},
   "source": [
    "|RÚBRICA Y CRITERIOS DE EVALUACIÓN |||||\n",
    "|:-|:-:|:-:|:-:|:-|\n",
    "|PARÁMETROS|100%|50%|0%|Total parcial|\n",
    "|Desempeño en el desarrollo del cuaderno de trabajo (toma de datos, realización de cálculos, ejecución de comandos, realización de programas, obtención de resultados, obtención de un producto, aplicación de una herramienta, realización de un procedimiento para experimento, etc.)|El estudiantes demuestra solvencia al desempeñarse  durante la práctica|El estudiante demuestra parcialmente solvencia al desempeñarse durante la práctica |El estudiante no demuestra solvencia al desempeñarse durante la práctica |40%|\n",
    "|Cuestionario|El estudiante contesta el cuestionario de forma correcta |El estudiante contesta la mitad del cuestionario de forma correcta|El estudiante contesta el cuestionario de forma incorrecta|30%|\n",
    "|Conclusiones y Recomendaciones|Todas las conclusiones son adecuadas, objetivas y aplicables exclusivamente a la práctica|Las conclusiones son parcialmente adecuadas, objetivas y aplicables|Las conclusiones no son adecuadas, objetivas y aplicables|30%|\n",
    "|TOTAL||||100%|"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70716aa1",
   "metadata": {},
   "source": [
    "# Bibliografía\n",
    "[1] R para principiantes https://cran.r-project.org/doc/contrib/rdebuts_es.pdf\n",
    "\n",
    "[2] Introducción a R https://cran.r-project.org/doc/contrib/R-intro-1.1.0-espanol.1.pdf\n",
    "\n",
    "[3] Bioestatística https://cran.r-project.org/doc/contrib/Beasley-BioestatisticaUsandoR.pdf"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "R",
   "language": "R",
   "name": "ir"
  },
  "language_info": {
   "codemirror_mode": "r",
   "file_extension": ".r",
   "mimetype": "text/x-r-source",
   "name": "R",
   "pygments_lexer": "r",
   "version": "4.2.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}