Preguntas de Los Videos
Preguntas de Los Videos
if(a=3){ print("Hola")}
?
a = 3
Objetivo
Estructura temática
Forma de trabajo
Utilizarás un IDE (Ambiente de Desarrollo Integrado) muy popular para trabajar con el
lenguaje R, llamado RStudio, que se ha vuelto el IDE de facto para programar en R.
Para complementar las lecciones, realizarás prácticas con el lenguaje, las cuales
tendrán valor para la evaluación.
Criterios de aprobación
100 % prácticas
Fuentes de información
Dalgaard, P. (2008). Introductory Statistics with R (Statistics and Computing) (2.a ed.). EE.
UU.: Springer.
Matloff, N. (2011). The Art of R Programming: A Tour of Statistical Software Design (2.a
ed.). EE. UU.: No Starch Press.
Historia e Introducción a R
[MUSIC]
Reproduce el video desde ::14 y sigue la transcripción0:14
La primera pregunta que se nos puede venir a la cabeza es, ¿qué es R?
R en pocas palabras no es más que un dialecto del lenguaje S.
S fue un lenguaje que fue desarrollado por John Chambers
en los laboratorios Bell durante los 70s.
Este fue pensado como un ambiente para el análisis
estadístico dentro de la compañía.
Es decir, que inicialmente se implementó como una serie de bibliotecas de Fortran.
Un lenguaje muy utilizado durante los 70s.
Y además las primeras versiones del lenguaje
no contenían funciones para análisis estadístico.
El sistema fue re escrito en los 80s en el lenguaje de programación C.
Esto con el objetivo de que fuera portable.
Y es entonces que también en estos años Chambers y Hastie documentan en el famoso
libro, Statistical Models in S, la funcionalidad,
del lenguaje para el análisis estadístico.
Porque you estaba tomando completa forma.
En los años 90s sale la versión 4,
que es más o menos la versión que nosotros conocemos hoy en día.
Y además aparece el libro Programming with Data de John Chambers.
Y en este se detallan las minucias del lenguaje.
Básicamente S fue pensado como un ambiente interactivo.
Que no necesariamente se puede ver en un principio
como un lenguaje de programación.
Pero a medida que el usuario va utilizando más y más
las particularidades del ambiente.
Acá va utilizando prácticas de programación.
El lenguaje S entonces you proveía un acceso relativamente simple a una gran
variedad de técnicas estadísticas.
Además, que para los usuarios avanzados, les permitía escribir
funciones por medio de un lenguaje de programación you bien definido.
Con el que podían añadir nuevas técnicas por medio de la definición de estas.
[SOUND] Como podemos ver,
el desarrollo de S y S-PLUS fue generado en este ambiente comercial.
Quizá, motivados por esta razón, en 1991,
Ross Ihaka y Robert Gentleman deciden implementar
su propia versión de S, ellos la bautizaron como R.
Tan bien lograron hacer esto que para 1993 ponen R al público general.
Esto tuvo tanto éxito, que para 1995 liberaron el código bajo una licencia GNU.
La liberación del lenguaje tuvo tanta popularidad, que para 1996,
se formaron por primera vez las listas de correo
o de distribución de información llamadas R-help y R-devel.
En estas se discutían temas relacionados con ayuda hacia el lenguaje.
Y por el otro lado, el desarrollo del propio lenguaje.
En 1997, se funda el R Core Group,
que es un grupo especializado de programadores.
Que llevan el desarrollo del lenguaje a través de los años.
Reproduce el video desde :3:23 y sigue la transcripción3:23
Tan bien ha ido el lenguaje que para el año 2000,
por primera vez se libera la versión 1.0 de este.
Para este año la explosión del lenguaje you fue muy grande.
Y es entonces que por primera vez aparece en el New York Times en el año 2006
un artículo hablando de cómo los
analistas de datos están cautivados por el poder de este lenguaje.
Reproduce el video desde :3:51 y sigue la transcripción3:51
Ahora estamos en el año 2015, y por fin tenemos una versión
3.2.2, que es la que utilizaremos en este curso.
Las características del lenguaje R son muchísimas,
y la mayoría de estas son tomadas como ventajas del mismo lenguaje.
Reproduce el video desde :4:10 y sigue la transcripción4:10
La principal y que es la razón por la cual fue adoptada ampliamente,
es que su sintaxis es muy similar al lenguaje S.
Reproduce el video desde :4:20 y sigue la transcripción4:20
La semántica también es muy parecida al lenguaje S.
Corre prácticamente en cualquier plataforma, Windows, Mac,
Linux y prácticamente cualquier Unix y tiene un cambio de versiones muy rápido.
El lenguaje R en realidad es muy pequeño
y todas las funcionalidades de él se van agregando con paquetes.
La capacidad de graficación además es muy madura y está
considerado uno de los mejores sistemas para graficar.
Reproduce el video desde :4:48 y sigue la transcripción4:48
Además recordemos que tenemos un modo interactivo que
sirve más que nada para probar ideas.
Pero una vez que hemos probado estas se pueden implementar en scripts
o programas mucho más grandes para hacer nuevas herramientas.
Otra de las grandes ventajas es que tenemos una comunidad
muy grande y estimulante y muy activa.
Esto en las listas R-help y R-devel y en el sitio web Stack Overflow.
Además es gratis.
Y es software libre.
Es entonces que ahora quisiera hablarles qué significa
que tenga las cuatro libertades básicas del software libre.
Estas son, la libertad para ejecutar el programa,
que eso prácticamente cualquier software nos lo da.
Reproduce el video desde :5:34 y sigue la transcripción5:34
Luego viene una de las más importantes que es la libertad de acceder al
código fuente.
¿Esto por qué es importante?
Porque podemos obtener conocimiento de ese código.
Finalmente, tenemos las dos últimas libertades que son las que hacen
fuerte a la licencia GNU.
Y esta es que podemos redistribuir nuestros cambios
o el mismo software que obtenemos.
Y finalmente los cambios que nosotros hacemos
Reproduce el video desde :6:4 y sigue la transcripción6:04
o mejoras pueden también ser distribuidas a la comunidad entera.
Por supuesto R no es perfecto y podemos listar algunas de sus desventajas.
Que es una tecnología relativamente vieja, tiene 40 años de edad.
Reproduce el video desde :6:19 y sigue la transcripción6:19
Y esto mismo se refleja en el sistema de gráficos en 3D,
el cual no está completamente integrado en el sistema.
La funcionalidad además, está basada en sus usuarios, ¿esto qué significa?
Significa que si tú quieres un nuevo análisis,
un nuevo modelo o algún tipo de tecnología nueva que quisieras probar.
Dependes, you sea de la comunidad de usuarios para que se genere o
tendrías que escribirlo tú mismo.
Reproduce el video desde :6:49 y sigue la transcripción6:49
Otro de los grandes problemas es que la mayoría de los objetos,
o las variables que estamos usando en el sistema.
Tienen que estar cargadas completamente en la memoria RAM.
Por lo que las computadoras que tienen poca memoria
pueden llegar a tener problemas.
Reproduce el video desde :7:6 y sigue la transcripción7:06
Además de que no es un sistema que es ideal para todo.
No hay bala de plata tanto en los análisis
Reproduce el video desde :7:14 y sigue la transcripción7:14
estadísticos como en la programación en sí.
Por lo cual R probablemente pertenece a un nicho muy pequeño todavía.
Es también importante que hablemos del diseño del lenguaje.
En principio hay un sistema base que contiene toda la funcionalidad
del lenguaje y además ciertos paquetes.
Que nos permiten poder manipular algunos datos
y algunos métodos que nos van a servir.
Encima de este sistema base tenemos paquetes que son recomendados.
Generalmente son funciones que son muy utilizadas en
general para casi cualquier tipo de de análisis estadístico.
Reproduce el video desde :7:58 y sigue la transcripción7:58
Y además, fuera de estos paquetes recomendados, existen más
de 7000 paquetes que están contribuidos por la comunidad de usuarios de R.
Y que suben todos los días algún paquete nuevo o mantienen estos en el sitio CRAN.
Si quisiéramos convencer a alguien de por qué usarlo.
Le podríamos decir que tiene muchas funciones estadísticas.
Además de que podemos implementar de manera rápida procedimientos estadísticos
y gráficos.
Estos gráficos son muy buenos y están basados en el sistema base del lenguaje.
Y los gráficos avanzados se pueden conseguir utilizando
paquetes como ggplot2.
Finalmente una cosa que a mí me parece maravillosa
es que los autores de los paquetes pueden ser contactados directamente.
Generalmente son personas que están dispuestas a ayudarte.
Ustedes se preguntarán, ¿quién está detrás de R?
Hay un grupo desde 1997, como you vimos en la historia,
que mantiene el core del lenguaje que es conocido como el R Development Core Team.
Este es financiado por la R Foundation que es una organización basada en Viena,
sin fines de lucro.
Podemos encontrar más información en el sitio de R que es www.r-project.org.
Podemos ver en pantalla la interfaz básica de R y como you les conté, es muy simple.
Las características de esta interfaz gráfica que es la oficial.
Es que se tiene muy mala interacción.
Te puedes olvidar muy fácilmente de qué variables y objetos están presentes en el
sistema en un momento dado.
Y las gráficas siempre aparecen en una ventana aparte.
Es por eso que se creó el IDE o Integrated Development Environment,
conocido como R Studio y es el que usaremos a lo largo del curso.
Para los que están impacientes por comenzar.
Pueden buscar algunos recursos de documentación en la página que you hemos
nombrado antes www.r-project.org.
Y estos son los cinco documentos básicos para poder tener,
toda la documentación de R a la mano.
Este es la introducción a R.
Cómo escribir extensiones en R.
Cómo importar y exportar datos en R.
Cómo instalar y administrar un sistema donde más usuarios van a utilizar R.
Y finalmente toda la implementación de los internos del lenguaje.
[MUSIC]
Obteniendo Ayuda
[MUSIC]
Reproduce el video desde ::14 y sigue la transcripción0:14
En esta lección vamos a aprender a utilizar el sistema de ayuda de R,
y también a aprender cómo podemos obtener ayuda.
En R es muy fácil obtener ayuda, el lenguaje y la línea de comandos,
viene con un sistema integrado de ayuda.
Y podemos obtener ayuda en el sistema.
En caso de que no podamos entender qué es lo que nos está explicando el sistema
de ayuda.
Podemos entonces generalmente preguntar con alguien que you sepa.
O ir a las listas de distribución de correo donde podemos hacer
nuestra pregunta y obtener alguna respuesta por ahí.
Otra gran ayuda que podemos tener en el web es utilizando el sitio Stackoverflow.
Donde podemos encontrar una gran cantidad de preguntas you hechas y respondidas.
Incluso están rankeadas por
Reproduce el video desde :1:11 y sigue la transcripción1:11
la calidad de las preguntas y la calidad de las respuestas.
El sistema de ayuda de R, como you observamos en la lección
preliminar, está integrado al sistema.
Hay cinco funciones que son muy útiles para obtener ayuda.
Una de ellas es help() y su equivalente que es el signo de interrogación.
La otra es example().
La siguiente es help.search().
Otra más es library con la opción help como parámetro.
Y vignette(),
que es un documento que se genera y puedes obtener ayuda por medio de un PDF.
Reproduce el video desde :1:55 y sigue la transcripción1:55
>> Aquí está la parte de RStudio, donde se ve la salida de read.table.
La primera función que vamos a utilizar es help().
Help() recibe como parámetros
entre comillas el nombre de la función a la cual queremos obtener ayuda.
En este caso no observamos cual es toda la salida de help().
Porque cuando nosotros tecleamos en la consola hep( "read.table").
Esto lo que va a hacer es que la ayuda se despliegue en la
ventana de ayuda de RStudio.
Una vez que suceda eso, podemos entonces ver que la página
del manual o de la ayuda de read.table al final siempre tiene ejemplos.
Reproduce el video desde :2:44 y sigue la transcripción2:44
Estos ejemplos, en caso de que tengamos una duda para poder resolver rápidamente.
Podemos utilizar entonces solamente la función example,
ponemos también el nombre de la función.
Entonces en este caso haríamos example("read.table").
Y entonces esto lo que hace es que nos despliega todos los ejemplos que hay
disponibles para la función "read.table".
En esta otra captura de pantalla, lo que estamos viendo es la función library,
Reproduce el video desde :3:14 y sigue la transcripción3:14
poniendo como parámetro help.
Si nosotros sabemos el tipo de ayuda que estamos buscando, podemos buscar
esa ayuda directamente desde la biblioteca que estamos utilizando.
Biblioteca o paquete.
En este caso grDevices es un paquete del sistema base.
Y entonces cuando llamamos al library help igual al nombre del paquete grDevices.
Lo que hace es que nos manda igual esta
documentación en una página aparte de RStudio.
En R los desarrolladores de paquetes a veces
generan un documento en PDF con viñetas.
La función que utilizamos para obtener ayuda de viñetas es vignette().
Cuando ejecutamos vignette(all=TRUE), lo que hacemos es.
Generamos una lista de todas las viñetas,
si es que están disponibles, y el nombre de éstas.
Por ejemplo, en el caso del paquete matrix,
si buscamos la viñeta "Intro2Matrix", podemos generar el PDF.
Y se nos desplegará en nuestra pantalla este PDF.
En las viñetas generalmente es una especie de white paper.
Que nos presenta toda la información del paquete,
y también vienen algunos ejemplos.
>> Si suponemos que no encontraste la respuesta a tu pregunta en
el manual de R o el sistema de ayuda interna de R.
Podemos utilizar alguna búsqueda en el Web usando Google.
O verificar en el sitio donde se encuentran las listas de correos si la
pregunta ha sido hecha antes, y además si you tuvo respuesta.
O finalmente puedes leer alguna de las FAQ,
que son listados de preguntas frecuentes que you se han hecho anteriormente.
Una opción que tienes conforme vas avanzando en el aprendizaje del sistema y
te vas volviendo un usuario más experimentado.
Es, justamente experimentar un poco.
Las páginas del manual te darán ejemplos.
Y tú puedes modificar estos ejemplos para ver si
Reproduce el video desde :5:25 y sigue la transcripción5:25
las modificaciones que hacen te dan los resultados deseados.
Otra opción que tienes es preguntar a alguien con más experiencia.
O finalmente, cuando seas un usuario muy avanzado, leer el código
fuente de las funciones y ver si hacen exactamente lo que estás buscando.
Es importante que hagas una revisión del manual antes de hacer una pregunta.
Reproduce el video desde :5:51 y sigue la transcripción5:51
Porque si no estarás haciendo perder el tiempo a los usuarios que
resuelven este tipo de problemas.
Además, debes poner bien en contexto el tipo de pregunta que estás haciendo.
Puedes incluir al hacer tu pregunta los pasos para resolver el problema.
Qué salida estás esperando, qué salida está recibiendo,
las versiones de R que estás usando del sistema operativo.
O cualquier otra información adicional que pudiera poner en contexto
a los demás usuarios.
Por ejemplo, si vas a hacer preguntas en una lista de correo,
crea un encabezado o subject en el correo que sea preciso.
Por ejemplo, no hagas algún tipo de encabezado que no tenga mucho sentido.
Por ejemplo, el primero que tenemos aquí en pantalla: "Auxilio!!!,
no puedo ajustar un modelo".
Eso no dice absolutamente nada,
y cuando esto aparezca en la red y esté indexado, no se entenderá.
Por ejemplo puedes hacer entonces una
modificación al encabezado y hacerlo de manera más inteligente.
En este caso puedes poner "R 3.2.2 función lm() produce un seg
fault con un data frame muy grande".
Esto, es mucho más preciso, aunque todavía es un poco ambiguo,
porque hay otra información que no está presente.
En este caso puedes ser un poco más inteligente y utilizar el siguiente
encabezado.
Que es "R 3.2.2 la función lm() en Mac OS versión 10.10.4,
genera un seg fault con un data frame muy grande".
Esto es completamente preciso y hará que incluso,
cuando alguien tenga la misma duda pueda encontrarla rápidamente la respuesta.
Cuando busques en las listas de correo, busca el objetivo, no los pasos.
Porque muchas veces los pasos que pudieras estar haciendo pudieran ser incorrectos.
Y podrías a veces también tener pasos diferentes para llegar al mismo punto.
Además, también puedes hacer búsquedas explícitas de la pregunta.
Ésto te puede ayudar si las personas que han hecho preguntas anteriormente,
hicieron los encabezados de manera inteligente.
Acuérdate siempre que, cuando posteés una pregunta,
proveas un mínimo de información necesaria.
Finalmente, si encuentras la respuesta, no olvides postearla.
Para que cuando alguien más tenga una duda exactamente igual a la tuya,
la pueda encontrar rápidamente.
Cuando preguntas en una lista,
no llegues diciendo primero que encontraste un error o un bug.
Es raro, muy muy raro que en los programadores
Reproduce el video desde :8:33 y sigue la transcripción8:33
entreguen un producto o un paquete con errores.
Ellos han testeado mucho tiempo sus paquetes tratando de que no
aparezcan con errores.
Por lo cual es muy difícil que tú pudieras encontrar uno.
Otra cosa que es también importante es que.
Como estas personas están ocupadas haciendo sus trabajos diarios,
no deberías preguntar para que te resuelvan la tarea.
No preguntes en las mismas listas al mismo tiempo.
Porque esto lo que genera es duplicación de la información en el tráfico que se
está generando en estas listas.
Y entonces también podría molestar a algunos usuarios.
Mis últimas recomendaciones para obtener ayuda es que te suscribas
inmediatamente a la lista de distribución de R en español.
Que se conoce como [email protected].
Una vez que estés subscrito,
también puedes tener acceso al listado en la página web.
Que es la que está apareciendo en pantalla.
Y finalmente, recuerda leer el listado de tips
sobre cómo hacer preguntas inteligentes.
[MUSIC]
Matrices
[MUSIC]
Reproduce el video desde ::14 y sigue la transcripción0:14
Nuestro siguiente tipo de objeto que vamos a aprender es las matrices.
Las matrices son un tipo de vector particular.
No son más que un vector con un atributo especial, llamado dimensión.
La dimensión nos dice el número de renglones
y el número de columnas que vamos a tener en una matriz.
Si ustedes you han estudiado las matrices, recordaremos que una matriz no es más que
un arreglo de números en renglones y columnas.
Entonces este atributo es un vector de tamaño dos,
que nos dice el número de renglones y el número de columnas.
Las matrices son creadas explícitamente con la función matrix().
En ella podemos poner como primer argumento los elementos de la matriz.
Y los siguientes dos argumentos son las dimensiones,
que es el número de renglones y de columnas.
Si utilizamos la función dim(m), podemos ver ese atributo, el de dimensión.
Y si vemos la clase de la dimensión,
podemos ver que es simplemente un vector de tamaño dos.
Un hecho que es importante a tener en cuenta con las matrices nr,
es que éstas se van rellenando columna a columna, de izquierda a derecha.
Contrario a cómo se rellenan los arreglos por ejemplo en C.
Que generalmente se rellenan de renglón en renglón de izquierda a derecha.
Es importante saber esto porque cuando queramos convertir un vector a una matriz,
tenemos que tener en cuenta cómo se va a ir rellenando
los elementos de esta matriz.
Las matrices pueden ser creadas también modificando o
generando el atributo de dimensión para un vector.
Como podemos ver en este ejemplo, que generamos un vector de tamaño 10.
Con los números del uno al 10.
Lo único que hacemos para convertirlo a una matriz, es utilizando la función
dim(m), y asignándole a esta función el vector 2,5.
Lo que hacemos es modificar ese atributo para que entonces se vuelva
una matriz con dimensión dos renglones y cinco columnas.
Otra manera de generar matrices en R es utilizando las funciones
cbind() y rbind().
Quizá el nombre les de una pista de lo que se trata.
Lo que hace cbind() es ir pegando vectores
a manera de columnas para formar una matriz.
Y rbind() es, toma esos vectores como si fueran renglones,
y va generando la matriz.
En el ejemplo, lo que pueden ver es que uno de los requerimientos para
poder generar una matriz con dos vectores,
renglones o columnas, es que éstos tengan el mismo número de elementos.
Para que a la hora que los pegues, pueda generarse una matriz.
Recuerden que una matriz no puede tener elementos faltantes.
En el caso de que lo hiciéramos así con matrices que son de distinto tamaño,
nos generaría un error.
[MUSIC]
Subjuntos de Datos
[MUSIC]
Reproduce el video desde ::14 y sigue la transcripción0:14
En esta lección lo que aprenderemos es a sacar un subconjunto
de datos de algún objeto o variable que you tengamos en memoria.
Y el cual probablemente sea muy grande como para poder utilizarlo completamente.
Generalmente, este tipo de objetos será de la forma
de matrices o de listas o de un DataFrame.
Hay generalmente tres operadores básicos para hacer
una extracción de un subconjunto de datos.
Y estos son los corchetes que extraen elementos de
la misma clase al objeto que estás extrayendo.
Los dobles corchetes que extraen elementos de una lista o un dataframe.
Y donde la clase que te va a regresar no necesariamente
tiene que ser de tipo lista o dataframe.
Y finalmente el símbolo de pesos que extrae elementos de un dataframe.
En el ejemplo que estamos viendo en la imagen en pantalla.
Podemos ver tres de las maneras que podemos usar corchetes.
Una es pidiendo uno de los elementos, por el número del índice que estamos buscando.
Reproduce el video desde :1:34 y sigue la transcripción1:34
Una cosa que es importante no olvidar es que los índices en R comienzan desde
el número uno, no desde el cero como en otros lenguajes.
Luego también podemos pasar una secuencia de números.
Y entonces esta secuencia de números, al pedirla por
medio de corchetes nos va a regresar los elementos que están en esa secuencia.
Y finalmente podemos pasar también un vector lógico.
Reproduce el video desde :2: y sigue la transcripción2:00
Donde nos va a regresar, al pedirlo por medio de corchetes, los lugares
en donde el valor del vector lógico sea igual a verdadero o TRUE.
Para hacer un subconjunto de datos de una matriz
o lo que es lo mismo un subsetting de matrices.
Podemos usar los operadores con corchetes,
pero recordemos que la matriz tiene dos dimensiones.
Que son los renglones y las columnas.
Entonces podemos mandar a llamar utilizando corchetes,
el valor de un renglón y una columna en específico,
o el valor de una columna entera o de un renglón entero.
Ésto lo hacemos, no poniendo ningún elemento en primer lugar en el corchete,
luego una coma y luego el valor del renglón o la columna que queremos.
Por supuesto también podemos pedir varias columnas poniendo igual secuencias.
O incluso también vectores lógicos.
Por ejemplo, en la imagen que estamos observando en pantalla,
podemos pedir una matriz que you formamos.
El elemento 1, 3 es decir, el renglón uno columna tres.
Pero por ejemplo, si pedimos el elemento 3, 1 que es al revés,
como no tenemos tres renglones, nos va a generar un error.
Reproduce el video desde :3:25 y sigue la transcripción3:25
Ésto porque el límite de los
índices no está dentro del que nosotros pedimos.
Los últimos dos ejemplos lo que estamos viendo es justamente eso.
Pedimos el renglón uno y nos da todo el renglón uno.
Y en el segundo, pedimos la columna cuatro y nos da exactamente la columna cuatro,
que es el siete y el ocho.
Una cosa que es importante recordar,
es que cuando pedimos un elemento de una matriz.
Reproduce el video desde :3:56 y sigue la transcripción3:56
Ésta, este elemento regresado en forma de vector.
Es decir, pierde su condición de matriz.
Pero si nosotros utilizamos el parámetro Drop = FALSE.
Lo que hace R es regresarnos también una matriz.
Pedimos igual, el mismo elemento 3, 4 pero el valor que nos está
regresando ese subsetting es una matriz que tiene un renglón y una columna,
es decir, no ha perdido su condición de matriz.
Sólo para reafirmar lo que he dicho, vemos el mismo subsetting.
Los valores uno, seis, 11 y 16,
de la misma matriz pero usando una el drop=FALSE.
Y en el otro el valor por default del parámetro drop que es igual a TRUE.
Podemos observar que cuando le pedimos la clase a uno de esos dos subsettings.
Lo que estamos observando es que uno es de clase entera y otro es de clase matriz.
Ahora, como extraemos elementos de una lista.
O hacemos subsetting de listas.
Podemos usar tres formas.
Una es usando los corchetes, la otra es usar los dobles corchetes y la última es
con el símbolo de pesos y el nombre que sólo puede utilizar nombres literales.
Cuando hemos nombrado a los elementos de nuestra lista.
Como podemos ver aquí en el ejemplo.
Reproduce el video desde :5:19 y sigue la transcripción5:19
Si mandamos a llamar, usando sólo corchetes podemos pasar de nuevo
Reproduce el video desde :5:24 y sigue la transcripción5:24
una secuencia o valores también lógicos.
O como en este caso, muy simple, un número de índice.
En este caso estamos pidiendo el índice número uno de la lista.
Entonces lo único que nos regresará,
es la lista o hola, el elemento de esa lista que es hola.
Es decir, los números del uno al diez.
Sólo para reafirmar, si pasamos un único índice,
un único número a los corchetes nos va regresar el elemento con
ese índice y su valor.
Ésto en forma de lista, es lo que estamos observando en pantalla.
Cuando usamos los dobles corchetes que es por ejemplo en el siguientes,
que es x[[1]].
Nos regresa el primer elemento porque es el índice uno,
de la lista que es ese vector.
Ahora pueden observar que ese vector tiene de forma su clase, es vector.
Reproduce el video desde :6:31 y sigue la transcripción6:31
Y finalmente podemos observar también que si inferimos con el símbolo de
pesos y el nombre de la variable literal, nos regresa exactamente el mismo valor.
Ahora que pasa cunado utilizamos los dobles corchetes con el nombre literal.
También nos puede dar ese valor y nos lo regresa en forma de vector.
Y finalmente si pedimos la variable literal solamente con un corchete,
nos va regresar ese elemento que pedimos, nombrado como hola2 en este caso,
pero si se dan cuenta podemos observar que ahora es de tipo lista también.
Reproduce el video desde :7:15 y sigue la transcripción7:15
Por ejemplo podemos notar que en la anotación que estamos observando en
pantalla, utilizando el operador corchete, podemos pasar un vector,
este vector en este ejemplo, tiene los elementos uno y tres.
Si se lo pasamos al operador corchetes,
nos va a extraer el elemento uno y el tres de nuestra lista X.
Que en este caso es dos, tres, cuatro, cinco, hasta el siete y la palabra puente.
Ahora observemos que pasa con el operador de doble corchete.
El operador doble corchete,
uno podría pensar que es similar al operador del signo de pesos.
Pero en realidad, en el fondo, no son tan similares.
El operador de doble corchete puede utilizar índices computados.
Es decir, que nosotros podemos calcular o generar un
índice y meterlo al doble corchete y nos irá a extraer esos elementos que queremos.
En este caso, en la lista X, calculamos o generamos una
variable llamada name cuyo único elemento es una cadena llamada hola3
y si se lo ponemos al operador doble corchete, nos regresa el elemento puente.
En este caso si nosotros pasamos la variable
name al operador de signo de pesos no va funcionar.
Ahora veamos qué pasa,
cuando queremos hacer subsetting de elementos anidados de una lista.
Para empezar, lo elementos anidados de una lista,
significa que dentro de la lista puede haber otra lista.
Que es justamente la lista x que estamos observando en pantalla.
Que contiene una lista que tiene los elementos 10, 11 y 12.
Y un vector que tiene los elementos 9.8 y 2.33.
Si quisiéramos tomar el valor 12, es decir,
el tercer valor del primer elemento de la lista X.
Entonces lo que hacemos es pasarle únicamente el vector 1,3
entre corchetes dobles.
Ahora si queremos utilizar otra notación que sea una notación equivalente.
Es usar corchetes, corchetes, uno, que significa ve y extráeme el
elemento uno de la lista, que es esa lista, 10, 11, 12.
Y luego, otra vez dobles corchetes tres.
Que lo que va a hacer es ir a extraer
el elemento tres de esa lista que you se generó.
El ejemplo de abajo no es más que solamente
la misma notación del primer ejemplo.
Para ir a acceder el segundo elemento de la lista,
el primer elemento de ese vector que nos genera.
supongamos que creamos una lista que tenga como elemento,
un único elemento que se llame mmmddd223s, es un nombre arbitrario
que se me ocurrió solamente para poder ejemplificar lo que vamos a observar.
Y este tiene los valores del uno al 35.
Es decir podríamos mandar a llamar o pedir usando la anotación de doble
corchete o de nombres literales, usando la anotación del signo de pesos.
Poniendo x$ el valor literal que es mmmddd223s
en este caso, te lo podríamos poner así.
Pero como es demasiado largo o demasiado complicado,
podríamos hacer uso de lo que se conoce como emparejado parcial.
El emparejado parcial, lo que hace es, si no encuentra un
Reproduce el video desde :10:51 y sigue la transcripción10:51
símbolo de alguno de los elementos que sea igual, idéntico al que estamos buscando.
nos regrese el más cercano, en este caso, si sólo mandamos a llamar con la letra m,
es decir, x[[¨m¨]] nos
regresa justamente el elemento que
estábamos diciendo en un principio, que es un nombre muy largo y muy complicado.
Lo mismo pasa con el signo de pesos.
Ahora.
Reproduce el video desde :11:21 y sigue la transcripción11:21
Este comportamiento se puede cambiar
si utilizamos el parámetro exact y le ponemos igual a TRUE.
Entonces, cuando hagamos uso de este,
de intentar de hacer uso del emparejado parcial, no va a funcionar.
Generalmente vamos a encontrar valores faltantes o NA,
que you hemos observado qué significan estos valores.
Cuando nos encontramos con este tipo de valores, algunas ocasiones
vamos a querer eliminarlos y quedarnos sólo con los valores que
sean diferentes a NA.
El ejemplo que estamos observando, tenemos un vector que contiene NA.
Lo que hacemos es generar un vector de valores lógicos,
utilizando la función is.na.
En éste nos regresará todo un vector que nos contenga los valores verdaderos,
donde el elemento sea NA, entonces
si lo que queremos es justo lo contrario, entonces tenemos que negar ese vector.
Utilizando el operador signo de admiración.
Entonces utilizando ese operador y el operador corchetes,
podemos pasarle al vector x ese operador y entonces nos regresará
sólo los elementos que son distintos de NA.
Reproduce el video desde :12:45 y sigue la transcripción12:45
Ahora, supongamos que tenemos un dataframe,
y que este dataframe contiene NA en algunas columnas.
Cómo le haríamos para eliminar
los renglones que contienen NA sea de la columna que sea.
Para eso utilizamos una función que es muy útil conocida como complete.cases().
Esta función lo único que tenemos que hacer es generar con ella
un vector lógico, y luego mandar a llamar ese vector lógico,
utilizando una operación de corchetes.
El dataset airquality, is se lo pasamos a la función
complete.cases nos genera un vector lógico, este vector lógico entonces
se lo podemos pasar a airquality de nuevo, utilizando la operador corchetes
para que nos de sólo los renglones donde los valores sean TRUE.
Es decir, quitándonos todos los valores NA que no necesitamos.
[MUSIC]
Leer y Escribir Datos
[MUSIC]
Reproduce el video desde ::14 y sigue la transcripción0:14
Es importante que sepas, antes de que comiences esta lección,
que los datos a los que haremos referencia son tipos de datos tabulares,
es decir, que están organizados en archivos por renglones y columnas.
[SOUND] En esta lección lo que aprenderemos a hacer es a escribir y
a leer datos, comenzaremos por leer datos.
Esta es una de las operaciones más importantes porque generalmente nos dan
datos en forma de archivos y si tenemos suerte estos serán archivos de texto.
Por supuesto no todos los datos que nos proporcionan o que estemos generando,
van a ser escritos en archivos de texto.
Estos pueden venir como archivos en formato de excel,
o algún otro formato de alguna hoja de cálculo.
También pueden ser conexiones a base de datos o, incluso,
podemos estar extrayendo información del web,
you sea vía alguna interfaz de aplicación o páginas
web directamente que tenemos, a las cuales tenemos que limpiarles estos datos.
Hay algunas funciones dentro del sistema base de R que nos servirán
para leer datos.
Estas están enfocadas a datos que están escritos en archivos de texto,
no los formatos, que hemos hablado como Excel
o conexiones a base de datos o datos que provienen del web.
Estas son las más importantes, las que están listadas en pantalla, pero además
nos enfocaremos por este momento en read.table y read.csv.
Así como hay funciones para leer datos en R,
también hay funciones en el sistema base para escribirlos.
Reproduce el video desde :2:4 y sigue la transcripción2:04
Estas funciones aparecen ahorita en pantalla y, de nuevo, estaremos
enfocando nuestros esfuerzos en aprender los detalles de la función write.table.
Comenzaremos con la función read.table para aprender cómo leer datos en R.
Read.table es una de las funciones más importantes para leer datos en el sistema.
Reproduce el video desde :2:28 y sigue la transcripción2:28
Es importante saber que, además, otras funciones
Reproduce el video desde :2:35 y sigue la transcripción2:35
para leer datos de archivos de texto, en realidad son funciones
con parámetros you preestablecidos de la función read.table.
Por ejemplo la función read.csv, read.csv2,
read.fortran y read.socket
son formas especializadas de read.table que you tienen parámetros preestablecidos.
Volviendo con nuestra función read.table, podemos observar que los parámetros
más importantes de esta función son: file, header,
sep, colClasses, nrows, comment.char,
skip y stringsAsFactors.
La función read.table es muy eficiente con
archivos pequeños porque al ser estos archivos pequeños,
puede hacer toda la revisión del archivo, de manera rápida y eficiente.
El problema comienza cuando los archivos son muy grandes,
en ese caso tenemos que empezar a utilizar los parámetros para mejorar tal vez
el rendimiento de la lectura.
Por defecto, la función read.table
ignorará todas las líneas que contengan este signo.
Reproduce el video desde :3:53 y sigue la transcripción3:53
Averiguará además, cuántos renglones tenemos.
Y, finalmente,
averiguará de qué tipo es cada columna de las variables que va encontrando,
que es justo lo que sucede cuando mandamos a llamar la función de esta manera.
Reproduce el video desde :4:9 y sigue la transcripción4:09
Ahora, con los archivos grandes debemos ser cuidadosos, porque muchas veces
una mala lectura o un mal parámetro pasado a la función read.table
podría generar esperas muy largas, por ejemplo.
Yo les sugiero no leer ningún archivo de datos si estos archivos
son más grandes del tamaño de la memoria ram que tiene disponible o, también,
Reproduce el video desde :4:39 y sigue la transcripción4:39
recuerden utilizar el parámetro comment.char="",
es decir, no hay ningún tipo de comentario, sí en el archivo no existe
ningún comentario así ese chequeo no se hace en cada línea que se va leyendo.
Es importante también que no olviden que aunque estamos tratando de revisar algunos
de los parámetros más importantes de las funciones que vemos en el curso.
Reproduce el video desde :5:10 y sigue la transcripción5:10
También ustedes pueden ir a revisar el manual de la página de ayuda
de cada una de las funciones, en este caso de read.table porque les dará una mejor
visión de todos los parámetros que pueden ser controlados con esta función.
Ahora vamos a ver algunos consejos para la función read.table uno de los primeros
consejos que les daría es utilizar el parámetro col.Classes.
Este parámetro lo que recibe es, en un vector,
cada uno de los tipos que van a observar de cada una de las columnas,
cuando estén leyendo esos valores con la función read.table.
¿Esto por qué es de ayuda?
Pues porque si tuviéramos digamos tres tipos diferentes en un
Reproduce el video desde :6:3 y sigue la transcripción6:03
archivo, lo que haríamos es ir leyendo cada uno.
Más bien lo que hace el sistema es ir leyendo cada uno de ellos y al final
decidir, de qué tipo es conforme a lo que ha observado en cada columna.
Pero si nosotros le decimos a priori que lo que va a ver, por ejemplo,
fuera una columna de puros nombres, otra de puras edades,
y otra de puras categorías, entonces no tiene que hacer ese chequeo en cada
una de las lecturas de los renglones, y podría hacerlo de manera más rápida.
Podemos averiguar la clase de las columnas de manera fácil
cuando tenemos archivos grandes.
Lo que podemos hacer, como en este ejemplo que estamos observando en pantalla,
es leer solamente los primeros cien renglones de nuestro archivo y
Reproduce el video desde :6:49 y sigue la transcripción6:49
utilizar la función sapply initial, o sea el nombre de nuestro objeto, y la clase.
Lo que está haciendo es aplicar la función class
a cada una de las columnas del objeto inicial.
Entonces, este objeto lo guardamos en el vector clases,
y luego leemos you entonces todo el archivo
pero pasándole el parámetro col.classes.
Otro consejo que les puedo dar es utilizar nrows desde el principio.
Nrows le diría a la función read.table a priori cuantos renglones va a leer.
Es por eso que nos ayudará a poder establecer el tamaño de
memoria que vamos a utilizar desde el principio y no ir
ampliando ese tamaño de memoria conforme vamos leyendo el archivo.
Es claro, sólo de ver la función read.table y cómo
puede llegar a complicarse leer un archivo de datos,
que es importante saber qué tipo de sistema tienes.
¿Esto que significa?
Pues que debemos aprender antes de empezar a utilizar el sistema,
qué tamaño es la memoria ram, qué aplicaciones se pueden estar usando al
mismo tiempo en ella, si el sistema es multiusuario.
Cuántos usuarios podría llegar a haber al mismo tiempo.
Qué tipo de sistema operativo estamos utilizando.
Y si es de 32 o 64 bits.
Ahora supongamos que nos dicen que nos van a dar
un millón de registros de usuarios del censo por ejemplo.
Y que han recabado, 100 datos de cada uno de esos usuarios del censo.
Reproduce el video desde :8:29 y sigue la transcripción8:29
Cómo podríamos calcular el tamaño posible
de ese archivo o de esos datos que van a ocupar en memoria.
Pues es muy simple.
Lo único que tenemos que hacer a sabiendas de que hay 1 millón
de renglones en ese archivo, y hay 100 columnas.
Tenemos que multiplicar esas columnas,
también suponiendo que van a ser numéricas, por 8 bytes cada una,
y eso nos daría el tamaño aproximado, Del archivo que vamos a tener,
en este caso serían aproximadamente unos 700, 800 megabytes.
Reproduce el video desde :9:9 y sigue la transcripción9:09
Una recomendación que es empírica pero que funciona,
es que generalmente es importante tener el doble de memoria RAM
de los datos que vas a estar cargando en el sistema.
[NOISE] La función write.table es muy parecida a la función read.table.
Esta también tiene sus formas especializadas como read.csv,
read.fortran, read.csv2, etcétera, etcétera.
Estas van a ser utilizadas a más detalle en la práctica.
Finalmente para terminar esta lección veremos las funciones para
escribir objetos que you tenemos en el sistema en un momento dado
utilizando las funciones dump y la función source para leerlos.
En este ejemplo, podemos observar que tenemos dos objetos, X y Y.
Utilizando la función dump, lo escribimos a un archivo llamado datos.r.
Posteriormente, borramos esos dos objetos, pero si utilizamos la función
source para leer de nuevo ese archivo que acabamos de crear, llamado datos.R,
podemos observar que si volvemos a llamar a esos objetos, siguen estando en memoria.
Bueno, haciendo un repaso final de esta lección,
podemos recordar que las dos funciones más importantes para leer
y escribir datos son read.table y write.table.
Estas tienen muchos parámetros y es importante
conocer nuestro sistema para poder saber qué parámetros debemos utilizar,
para que cuando estemos leyendo datos de archivos muy grandes,
nuestro rendimiento de esta lectura sea bastante bueno.
Espero, puedan llevar a cabo estas lecturas y escrituras de
sus datos en la práctica.
[MUSIC]
Estructuras de Control
Bienvenidos al módulo tres,
del curso de Introducción a la Programación Estadística con R,
en este módulo aprenderemos a programar en R por primera vez.
you que conocimos qué son los objetos, los tipos de datos que hay,
las operaciones que podemos llevar a cabo con estos objetos.
Reproduce el video desde ::37 y sigue la transcripción0:37
Lo primero que aprenderemos en esta lección es aprender
las diferentes estructuras de control que se pueden utilizar en R.
Y primero comenzaremos por definir su uso.
Reproduce el video desde ::50 y sigue la transcripción0:50
Las estructuras de control nos permiten controlar el flujo de un programa
Reproduce el video desde ::55 y sigue la transcripción0:55
dependiendo si se cumplen las condiciones o no de esta estructura.
Reproduce el video desde :1:1 y sigue la transcripción1:01
También permiten llevar a cabo tareas de manera repetida o alguna operación.
Hay varios tipos, éstas pueden ser condicionales,
pueden haber bucles de repetición, bucles de condición, bucles infinitos.
Y también podemos usar algunos operadores para romper un bucle
o saltarse uno de ellos.
La primera estructura de control que vamos a estudiar, es la estructura if.
If, como su nombre indica en inglés, significa si.
Reproduce el video desde :1:32 y sigue la transcripción1:32
La manera en como la sintaxis de esta estructura es: if entre
paréntesis ponemos la condición y luego abrimos y cerramos llaves.
Y en éstas pondremos las operaciones que se van a llevar a cabo.
Si la condición se cumple,
el cuerpo de esta condición se lleva a cabo y si no, podemos incluso
poner más condiciones utilizando la palabra else y abriendo otro if.
En el ejemplo que están viendo en pantalla, lo que tenemos es
una variable llamada r que tiene el valor número 4.
Y probamos si sí esa condición se cumple,
entonces lo que va a hacer es que el valor de un objeto llamado x,
objeto o variable llamado x va a tener valor 1.
En caso contrario,
x va a ser igual a 3 y crea otra variable nueva llamada y que va a ser igual a 4.
Entonces si ejecutamos esto podemos ver que como r en un principio
sí era igual a 3, sólo se ejecuta la primera parte que es igual a 1.
Si mandamos a llamar la variable y,
podemos observar que nos dará un error porque ésta nunca fue creada.
¿Por qué razón?, porque nunca entró a esa parte de la condición.
¿Por qué?, porque r era igual a cuatro.
Contrario a lo que pasa en este ejemplo.
Si r vale igual a tres desde un principio, si ejecutamos nuestro if,
podemos ver que ahora x es igual a tres, y y si existe, y es igual a cuatro.
¿Por qué?, porque ahora si se ejecutó esa parte del código.
Donde x toma ese valor, y y se crea.
Sólo para revisar una vez más, podemos observar que la forma idiomática,
o la forma más usada del if, es poniendo el if,
poniendo entre paréntesis la condición, se abre llaves y se cierra llaves y dentro de
estas llaves se ponen las operaciones que se van a llevar a cabo.
Reproduce el video desde :3:30 y sigue la transcripción3:30
Cuando se cierra la llave, podemos utilizar,
si queremos probar otra condición o si queremos llevar a cabo
alguna otra operación extra sin necesidad de probar condición.
Un else sin un if, o un else con un if si es necesario.
Otra forma que es muy común de usar en R, es hacer la asignación del if a un objeto.
¿Eso qué significa?
Que cualquier valor que te vaya a regresar ese if, o sea, si saliendo de
ese bloque te regresa algún valor, porque tiene que salir algún valor.
Ese valor se asigna directamente a una variable.
Esto con el fin de que quede claro que el valor de esa variable depende
justamente de ese bloque if.
Por supuesto, también podemos prescindir de la palabra especial else,
cuando estamos utilizando una estructura de control if.
Lo único que cambiaría es que el if se vuelve un completamente simple.
La condición, si se cumple o no, si no se cumple,
no entra a nada y no hace nada de lo del cuerpo del if, y si sí, se lleva a cabo.
Reproduce el video desde :4:37 y sigue la transcripción4:37
Esto es muy común también utlizarlo.
Reproduce el video desde :4:40 y sigue la transcripción4:40
La siguiente estructura de control que vamos a aprender es el for.
El for para lo que nos sirve es un bucle de repetición.
Reproduce el video desde :4:48 y sigue la transcripción4:48
Lo que se usa es utilizar la palabra especial for.
Se abre un paréntesis con algo en medio
y luego se abre y se cierran las llaves donde se lleva a cabo la operación.
Que es justo lo que estamos viendo en pantalla.
Es muy fácil ver lo que está haciendo este ejemplo.
Porque lo que está haciendo es tomar cada uno de los valores de i.
Cuando va iterando el vector del uno al diez y luego vamos a imprimir ese valor.
Ahora tendríamos entonces que explicar qué es lo que está sucediendo.
Lo que está sucediendo es la forma general del for.
En el for tenemos la palabra especial for,
luego entre paréntesis ahora sí lo que es conocido como un generador de rango.
Y entre, en el cuerpo del for,
las operaciones que estaríamos llevando a cabo.
Un generador de rangos no es más que una estructura
que podríamos ir recorriendo uno a uno.
Entonces el valor del objeto que está
tomando los valores del generador de rango.
Va tomando justamente esos valores y los va utilizando o nos pueden servir
dentro de la estructura for para llevar a cabo alguna tarea.
A veces, muchas veces solamente es necesario poner el número, o sea el número
de veces que queremos que se lleven a cabo esas repeticiones y con eso es suficiente.
Muchas veces, también requeriríamos hacer otras cosas.
Como pueden observar en este primer ejemplo.
Podemos generar un vector llamado mis_letras que
es un vector de caracteres donde son las letras a,b,c y d.
Entonces podemos utilizar este como un generador de rangos.
Para el objeto letras, es decir, en cada paso del for que vaya tomando,
letras va a ir tomando, los valores de vector mis_letras.
Es decir, que en cada uno de ellos de va a ir imprimiendo la letra primero a,
luego b, luego c y luego d.
Esto también se puede hacer de diferentes maneras.
Es decir imprimir cada uno de los elementos del vector mis_letras.
En este caso, en este segundo ejemplo que estamos viendo en pantalla,
utilizamos entonces la función seq_along.
Ésta lo que hace es, genera un vector donde los elementos van a ser
Reproduce el video desde :7:12 y sigue la transcripción7:12
los enteros que van apareciendo dentro del vector mis_letras.
Prácticamente lo que hace es generar un vector del 1 al 4.
Reproduce el video desde :7:25 y sigue la transcripción7:25
Una vez que you tomó estos elementos del 1 al 4.
Cuando vamos imprimiendo, en vez de imprimir letras, osea la función tal cual.
Vamos imprimiendo el vector mis_letras, pero de manera indexada,
como you lo hemos hecho antes con el operador de corchetes.
En este último ejemplo, que es equivalente al anterior.
Estamos también otra vez formando un generador de rangos,
igualito al que teníamos en el ejemplo anterior.
Reproduce el video desde :7:57 y sigue la transcripción7:57
En este caso, en vez de utilizar sec along,
que lo que genera es toda la secuencia del vector, o sea el vector 1, 2, 3, 4.
Lo que hacemos es, decimos, el primer número de la secuencia va a ser 1,
ponemos dos puntos, como cuando generamos secuencias.
Y luego ponemos lenght, de mis_letras.
Que lo que hace esta función, es encontrar el tamaño del vector mis_letras.
Como es 4, entonces nos va a generar, del 1 al 4, un vector del 1 al 4.
Y vamos a ir entonces imprimiendo el vector mis_letras,
utilizando el operador corchetes.
For, también funciona con las siguientes estructuras.
Por ejemplo un vector de números.
En este ejemplo que estamos observando en pantalla,
lo que estamos haciendo es tomar un vector, del 1 al 100.
Pero en vez de estar yendo entero por entero.
Es decir, uno, dos, tres, cuatro, así hasta el cien, lo que estamos haciendo es
caminando en incrementos de punto cinco por punto cinco, es decir, uno, uno
punto cinco, dos, dos punto cinco, tres y así sucesivamente hasta llegar al cien.
Por supuesto también podemos utilizar este vector para generar
nuestro rango que tomará los valores de la variable i.
Dentro de nuestro for.
Reproduce el video desde :9:17 y sigue la transcripción9:17
También podemos formar bucles anidados,
es decir podemos poner un for anidado dentro de otro for.
¿Esto para qué nos puede servir?.
Generalmente lo necesitamos cuando queremos ir
recorriendo todos los elementos de una matriz o de un data frame, por ejemplo.
Reproduce el video desde :9:35 y sigue la transcripción9:35
Como podemos ver en pantalla.
Estamos generando una matriz del 1 al 18, de 3 por
3 y lo que estamos observando es que estamos recorriendo la matriz una por una.
Si ejecutan este código que están viendo en pantalla podrán ver que lo
que estamos imprimiendo es uno por uno, los elementos de esa matriz.
Recuerden como los elementos de nuestra matriz, se van llenando
de izquierda a derecha y de arriba abajo, van a ir apareciendo en ese orden.
Es importante que tomen en cuenta que no hay abusar del uso de los bucles anidados.
¿Esto por qué?
Porque genera mucha complejidad en el código.
Y entre más bucles anidados vayan generando, más difícil de entenderlo será.
Reproduce el video desde :10:24 y sigue la transcripción10:24
Lo que les recomiendo es que vayan haciendo tal vez bucles anidados,
de dos en dos, para que no se pierdan entre tanto código.
La siguiente estructura que vamos a aprender es el while.
Aunque antes de eso vamos a hacer un poquito
de revisión de lo que significa el for.
En el for, por ejemplo, sabemos a priori cuantos pasos se van a llevar a cabo.
Es por eso que siempre sabemos el tamaño del vector
donde se van generando los rangos.
En el caso de un while no necesariamente sabemos ésto.
Es por eso que, mientras, que es lo que significa la palabra while en inglés,
se cumpla la condición, el cuerpo del while.
Va a ser ejecutado.
Por ejemplo, lo que estamos viendo en pantalla.
Generamos primero una variable llamada contador, esta comienza en cero.
La condición, es que este contador sea menor a diez estrictamente.
Entonces si entramos en el while,
lo primero que hace es imprimir el valor de contador.
Y luego aumentarle en dos al valor que tiene actualmente.
Una vez que haga eso, vuelve a entrar al while para probar la condición.
Y así va a ir haciendo la impresión y la suma esta de dos en dos.
Es decir, nos va a acabar imprimiendo 0, 2, 4, así hasta 8.
Porque la condición es estrictamente menor a 10.
While, también puede tener más de una condición y estas pueden ser
conectadas dentro de los paréntesis por medio de operadores lógicos.
En este caso estamos usando el operador lógico &.
Que se escribe &&, como you hemos anteriormente.
En este caso,
lo que estamos pidiendo es que el valor de la variable a siempre esté entre 3 y 10.
Mientras esté entre esos valores,
lo que está dentro de nuestro cuerpo del while, se va a ejecutar.
Reproduce el video desde :12:28 y sigue la transcripción12:28
Este ejemplo que están viendo en pantalla,
lo van a ejectuar en su computadora en la práctica.
Y observarán que lo que genera es una caminata aleatoria.
La siguiente estructura que vamos a aprender a utilizar es
la combinación de repeat y break.
Repeat lo que hace es entra directo al bucle,
sin preguntar si se puede o no hacer.
Y una vez adentro, nosotros podemos preguntar por medio de if,
si la condición se cumple o no.
Si la condición se cumple.
Entonces puede llevar a cabo lo que queremos que lleve a cabo,
las operaciones.
O en caso contrario, también podemos utilizar un break para romper
ese bucle y continuar con el camino del flujo del programa.
Puede llegar a suceder que la condición para romper el repeat nuncla se cumpla.
Entonces, ésto puede generarnos un bucle infinito.
Debemos tener cuidado con ésto,
al igual que cuando estemos utilizando un bucle while.
Si la condición En el bucle while siempre se cumple.
Entonces, puede llegar a pasar que también estemos dentro de un bucle infinito.
Generalmente vamos a aprender a usar la palabra next,
que se usa generalmente para saltarse los pasos de algún bucle.
Reproduce el video desde :13:51 y sigue la transcripción13:51
Por ejemplo, en una estructura de control for.
Reproduce el video desde :13:55 y sigue la transcripción13:55
Como la que tenemos en pantalla.
Lo que podemos observar es que estamos iterando sobre
un vector que va del 1 al 100.
Si nos quisiéramos saltar los primeros 20 valores de ese vector.
Lo único que hacemos es probar para i y si esta i es menor que 20,
entonces nos la vamos saltando.
Poniendo, por supuesto, una estructura if dentro de ese for
para poder ir haciendo eso.
Una vez que tenemos nuestro if,
osea nuestra condición, ponemos en el cuerpo del if la palabra next.
Y lo único que hará es saltar para volver a entrar al siguiente ciclo del for.
you para finalizar esta lección, tenemos que recordar 3 cosas.
If, while y for, son las estructuras de
control que nos sirven para controlar el flujo de un programa en R.
También debemos evitar el poder generar bucles infinitos.
Esto nos puede ocasionar problemas.
Y finalmente, utilizar estas estructuras de modo interactivo,
puede ser un poco complicado.
No lo dijimos de manera explícita, pero para evitarnos ésto,
podemos utilizar la familia de funciones conocidas como apply.
[MUSIC]
Funciones
En esta lección vamos a aprender cómo escribir funciones.
Las funciones en R o prácticamente en cualquier lenguaje de programación
son los bloques de construcción de análisis o programas más complejos.
Las funciones se crean utilizando la función especial llamada function().
Y, una vez creadas, se guardan como un objeto de R con clase tipo "function".
Estas se definen de la manera siguiente.
Podemos ver en pantalla el esqueleto de una función de manera formal.
Reproduce el video desde ::48 y sigue la transcripción0:48
Primero ponemos el nombre de la función,
luego el operador de asignación y luego la palabra especial function.
Entre paréntesis van a ir los argumentos de la función.
O también a veces son conocidos como parámetros.
Y, finalmente, en el cuerpo de la función,
abriendo y cerrando llaves, tendremos todas las operaciones que lleva a cabo.
Algo que es importante recordar es que el valor que genera una función,
o que regresa una función,
es el último o la última sentencia que está en el cuerpo de la función.
Hay dos particularidades que son importantes en las funciones.
La primera es que éstas pueden ser pasadas también como argumentos a otras funciones.
Y la segunda es que pueden ser anidadas, es decir,
dentro de una función podemos definir a otra función más pequeña.
Cuando creamos funciones, podemos crearlas con varios argumentos.
Estos argumentos o parámetros pueden incluso tener valores por omisión.
Los argumentos formales son aquellos que aparecen
incluidos en la definición de la función.
Estos pueden ser consultados utilizando la función formals() cuando you se encuentra
la función dentro del ambiente de la línea de comandos de R.
Si utilizamos formals() y el nombre de la función que vamos a consultar, formals
nos va a regresar una lista de todos los parámetros que tiene esa función.
Es importante que tomen en cuenta que en R no es necesario
pasar toda la lista de parámetros formales que tengamos.
Esto por dos razones.
Una, puede ser que ese parámetro no se esté utilizando.
Para un análisis en particular o para una operación en particular.
Y dos, puede ser que ese parámetro you tenga un valor por omisión.
Reproduce el video desde :2:56 y sigue la transcripción2:56
En R, cuando mandamos a llamar a una función para que se ejecute,
podemos ir poniendo los parámetros por nombre, uno por uno.
Pero, si no lo hacemos, R tiene manera de coincidir estos valores
que estamos pasándole a la función de dos maneras: de manera posicional
o directamente por el nombre, pero no necesariamente a todos.
¿Esto qué significa?, que los argumentos de R, siempre y cuando estén nombrados,
le podemos cambiar el orden en el que están definidos.
Reproduce el video desde :3:32 y sigue la transcripción3:32
Esto puede ser un poco confuso por lo que no se lo recomiendo.
Yo lo que generalmente hago es escribir los parámetros en el orden en
el que deben de ir, o nombrar uno por uno para que haya absolutamente no confusión.
Es importante recalcar que si decidimos cambiar el orden de los parámetros,
no lo hagamos de manera seguida.
Porque esto nos puede ocasionar mucha confusión en nuesto código.
Es importante entonces recordar que hay tres tipos de argumentos coincidentes.
El primero es una coincidencia exacta.
El segundo es una coincidencia parcial, pues es decir,
utilizando un nombre parcial de los nombres, así como you lo habíamos visto
cuando la usamos con las listas o con los Data Frames.
Y finalmente la coincidencia por posición.
Por ejemplo, en el ejemplo que está apareciendo en pantalla,
tenemos una variable llamada monedas.
Ésta no es más que el valor del lanzamiento de una moneda.
Reproduce el video desde :4:37 y sigue la transcripción4:37
No tenemos que ver de qué trata la función rbinom,
pero eso es justamente lo que está haciendo.
Entonces, la variable monedas tiene 100 valores,
y lo que queremos ver es el promedio de todos esos valores.
Para eso utilizamos la función mean.
Si mandamos a llamar mean(monedas), la función mean tiene como primer parámetro
un vector X, que es sobre el cual vas a tomar ese valor promedio.
En este caso como no mandamos a llamar a ningún otro parámetro,
lo que hace es justamente sacarnos el valor promedio de ese vector.
Ahora, también podemos mandar a llamar mean(x = monedas).
Y nos va a hacer exactamente la misma operación
que cuando mandamos a llamar solamente monedas sin nombrar a ese parámetro.
¿Por qué?, porque x es el valor o el nombre de ese parámetro
que necesita la función mean de manera obligatoria.
Hay otro parámetro llamado na.rm,
esto lo que hace es: nos elimina los valores faltantes.
Normalmente, el comportamiento de mean
nos indica que na.rm siempre va a ser igual a false.
Es decir, si nosotros lo ponemos ahorita al llamar a la función na mean y x=monedas
y na.rm=FALSE va a ser exactamente lo mismo que en los dos ejemplos anteriores.
Esto mismo puede pasar si cambiamos el orden de los parámetros.
Si están nombrados no hay ningún problema, R entenderá que uno es
un vector lógico y el otro es el vector al que le va a sacar el promedio.
Que es lo que no pasa en este último ejemplo,
donde na.rm=FALSE, pero el segundo parámetro no está nombrado.
R lo que hace es: si tú nombras a un parámetro nombrado,
los demás tratan de hacer los coincidentes de acuerdo a la posición.
Entonces, en este caso, supone que monedas
es el primer parámetro sin nombre que vas a poner que es exactamente el vector x.
La manera en que se evalúan los argumentos en una función en R
es conocida como "evaluación floja" o "lazy evaluation".
¿Esto qué significa?
Esto significa que un argumento no es
evaluado sino hasta el momento en que se necesita dentro de la función.
Por ejemplo podemos observar en la función que tenemos definida en pantalla que pide
dos parámetros: x y y, pero, dentro del cuerpo de la función, y nunca se utiliza.
Reproduce el video desde :7:28 y sigue la transcripción7:28
Es decir, si a la función cuando la llamamos,
que es lo que podemos ver abajo, como argumento al valor 4.
Lo único que hace es sumarle 1 a ese valor 4 y nos lo regresa.
Y no nos genera ningún error.
¿Ésto porqué?
Por que en ningún momento llegó a necesitar evaluar
el segundo parámetro que era y.
Ahora vamos a hablar del argumento Este argumento se utiliza si no
sabemos a priori el número de parámetros que le vamos a pasar a una función.
O si un número variable de argumentos se le va a pasar a otras funciones
que existan dentro del cuerpo de esa función que se está definiendo.
Las funciones genéricas también hacen uso del argumento "···".
Estas funciones son funciones que, justo como su nombre lo dice,
son de tipo genérico.
Esto significa que pueden llevar a cabo esa operación que se supone hacen,
pero sobre diferentes tipos de objeto.
Por ejemplo, la función mean.
Puedes llevar a cabo encontrar el valor de un promedio,
pero no sólo en un vector, sino puede ser en otro tipo de objeto.
you sea un Data Frame o una matriz, por ejemplo.
En éste momento estamos observando la función mi_graficador.
Que es una función que he definido y en donde hago uso,
dentro de ella, de la función plot.
Como la función plot tiene que recibir además parámetros extra,
es entonces que nosotros utilizamos el argumento "···".
En este último ejemplo, podemos observar el uso de la función "···".
Primero vamos a analizar los argumentos que requiere la función paste.
Reproduce el video desde :9:21 y sigue la transcripción9:21
Utilizando la función args.
Podemos ver que como primer argumento tiene el parámetro "···".
La función paste lo único que hace es concatena cadenas de parámetros.
Reproduce el video desde :9:35 y sigue la transcripción9:35
En este caso lo que estamos observando es que solamente concatenamos
la cadena "hola" y la cadena "mundo".
Pero podríamos poner muchas más o sólo una.
Es decir, no sabemos a priori, el número de argumentos que vamos a pasar.
Es por eso que En la definición, en la función paste, usa los "···" de argumento.
Finalmente como última anotación, para el parámetro "···".
Es importante hacer notar que una vez que utilizamos el parámetro "···",
cualquier parámetro que continúe después de él,
tiene que ir nombrado explícitamente y no puede ser emparejado parcialmente.
[MUSIC]
Reglas de Alcance
[MUSIC]
Reproduce el video desde ::14 y sigue la transcripción0:14
En esta lección aprenderemos las reglas de alcance,
que son la principal diferencia entre el lenguaje R y el lenguaje S.
Las reglas de alcance determinan como se asocia un valor con una
variable libre en una función en R.
Las variables libres no son más que
variables que no aparecen en la lista de argumentos formales de una función.
Reproduce el video desde ::37 y sigue la transcripción0:37
R, en particular, utiliza el alcance léxico.
Por ejemplo en el código que está apareciendo en pantalla podemos observar
que está definida la función funcion1.
Y tiene como argumentos X y Y.
Podemos observar que hay un valor dentro de la función,
del cuerpo de la función donde se suma X, Y y otra variable Z.
Esa Z es una variable libre.
¿Como sabe R qué valor asignar a un símbolo?
Por ejemplo, sabemos
que existe una función llamada lm dentro del paquete stats.
¿Qué pasaría entonces si definimos
una función que le llamemos de la misma manera?
lm. Si esta función con exáctamente
el mismo nombre.
¿Qué creen ustedes que pasaría?
Por ejemplo,
la función lm que estoy definiendo en el código que está apareciendo en pantalla,
lo único que hace es, recibe un parámetro X y regresa el valor de esa X al cuadrado.
Si mandamos a llamar inmediatamente en nuestra consola a la función
lm con un valor, digamos cuatro, el resultado es 16.
Es decir, está utilizando el valor de la función
lm que nosotros acabamos de definir.
Cuando R trata de ligar un valor a un símbolo lo que hace es hacer una búsqueda
en una serie de ambientes para encontrar el valor apropiado.
Cuando estamos trabajando en la línea de comandos
y queremos traer el valor de un objeto, el orden en el que se busca es el siguiente.
Primero busca en el ambiente global por un
símbolo con el nombre que se está solicitando.
Reproduce el video desde :2:17 y sigue la transcripción2:17
Luego busca en los espacios de nombres, en la lista de búsqueda.
La lista de búsqueda la podemos consultar utilizando la función search.
El ambiente global siempre es el primero en la lista de búsqueda y el paquete base
siempre es el último en la lista de búsqueda.
El orden de los paquetes en la lista es el orden en el que se hará la búsqueda.
Los usuarios pueden configurar los paquetes que se cargan al iniciar.
Por lo que no podemos suponer que habrá una lista de paquetes disponibles siempre.
Cuando cargamos un paquete con la función library, el espacio de nombres
de este paquete quedará en segundo lugar en la lista de búsqueda.
Y todos los demás paquetes se irán un lugar hacia abajo.
Hay que notar que R tiene un espacio de nombres específico para
funciones y para cualquier cosa que no sea una función.
¿Esto que significa?
Que por ejemplo podemos tener una función que you hemos utilizado llamada C,
que nos puede ayudar a crear vectores.
Y también un objeto llamado C que puede tener un valor.
Como lo que estamos viendo en pantalla.
Recuerdan este ejemplo que está apareciendo en pantalla.
La función Z era una variable libre.
¿Qué pasaría si ejecutáramos ese código?
Si mandamos a llamar a la función1 con los argumentos uno y dos, y.
Como la variable Z no está definida,
nos mandará un error, que nos dice que la Z no se encuentra.
Pero si definimos Z anteriormente, y luego volvemos a hacer una
llamada a la función1, con los argumentos unidos, nos regresará ocho.
Esto significa que el valor de Z dentro de la función es el valor que encuentra
primero, es decir, en el ambiente global, que es donde se definió que Z vale cinco.
Y ese es justamente de lo que trata el alcance léxico, que es que los valores
de las variables se buscan en el ambiente en el que la función fue definida.
Un ambiente no es más que una colección
de parejas de símbolos y valores asociados a esos símbolos.
Cada ambiente tiene un ambiente padre
y es posible que un ambiente tenga múltiples ambientes hijos.
El único ambiente que no tiene padre, es el ambiente vacío.
SI el valor de un símbolo no se encuentra en el ambiente en el
que la función fue definida, se busca en el padre, y así hacia arriba
hasta el llegar al nivel más alto, es decir, generalmente el ambiente global.
O el espacio de nombres de un paquete.
Después de llegar al nivel más alto, se continúa hasta llegar al ambiente vacío.
Si el valor de un símbolo no es encontrado en un ambiente
antes de llegar al ambiente vacío, entonces se va a encontrar con un error,
que es justo lo que pasó con el ejemplo que observamos al principio.
Esto típicamente no tendría mucho sentido,
pero en R, nosotros podemos definir funciones dentro de otras funciones.
En este caso, el ambiente de una función es justamente el cuerpo de otra.
Por ejemplo la función que estamos observando en pantalla en este momento,
llamada elevar.potencia recibe un parámetro n.
Y dentro de ella se define otra función que utiliza ese parámetro para
generarnos una función.
Es decir, que lo que regresa esa función es una función también.
Vamos a ver cómo funciona.
Por ejemplo, si mandamos a llamar la función elevar.potencia
con diferentes parámetros.
Y guardamos en diferentes objetos
el resultado de esas ejecuciones de la función elevar.potencia,
podemos observar que esos objetos que guardan el resultado de esas llamadas.
Reproduce el video desde :6:11 y sigue la transcripción6:11
También, a su vez, son funciones pero que hacen una función en específico,
es decir, una eleva a la cuarta y la otra eleva al cuadrado.
Podemos ver que estos objetos en realidad son funciones también.
Podemos ver de manera más clara qué es lo que está sucediendo
con los siguientes comandos.
La función ambiente o enviroment nos permite analizar qué hay
en el ambiente en donde está definida en la función que le pasamos a environment.
Entonces, si usamos ls(environment(alacuarta)),
que es uno de los objetos que definimos cuando hicimos la llamada.
Podemos ver que hay dos objetos, m y pow,
al igual que con el ambiente de alcuadrado.
También existe "n" y "pow", pero si mandamos a llamar con la función get,
el valor del nombre
n podemos ver que en un ambiente tiene un valor 4 y en el otro tiene valor de 2.
Es por eso que cuando se mandan a llamar los respectivos objetos con
un argumento en uno elevará a la cuarta y en otro eleva al cuadrado.
Es importante no olvidar la manera en que R lleva a cabo la evaluación
y las reglas de alcance, esto nos servirá a escribir código más claro y conciso.
Es importante y creo que en este momento you es un poco obvio.
Que no se repitan los nombres de variables o de funciones,
you que esto puede causar confusión si no estamos en el contexto correcto,
o si no tenemos total conocimiento del código que estamos modificando.
Finalmente, siempre es importante tomar en cuenta esto cuando
vayamos a modificar el código de alguien mas.
[MUSIC]
Creación de Gráficas en 3D
[MUSIC]
Reproduce el video desde ::14 y sigue la transcripción0:14
En esta lección veremos cómo crear gráficas en tres dimensiones.
Para esto es importante que sepan que este tipo de gráficas,
no están implementadas en el sistema base de R,
sino que tenemos que utilizar un paquete conocido como rgl,
por lo que tenemos que instalar antes de poder utilizarlo este paquete.
Lo podemos instalar de la siguiente manera, con el comando install.packages
y pasamos entre comillas el nombre del paquete que en este caso es rgl.
Reproduce el video desde ::48 y sigue la transcripción0:48
Una vez instalado el paquete rgl, podemos utilizar la función Plot3d, esta funciona
de manera similar a la función Plot de dos dimensiones del sistema base de R.
En este caso como es en tres dimensiones recibe una tripleta de valores, X,
Y y Z y una vez que recibe esta tripleta, dibuja el punto que queremos visualizar.
Reproduce el video desde :1:12 y sigue la transcripción1:12
Por ejemplo, supongamos que tenemos una serie
de valores guardadas en tres vectores, X, Y y Z.
Cada uno de los puntos que va graficar va ser,
uno proveniente del vector X, para la dimensión x.
El siguiente para la dimensión y, será el del vector Y.
Y el siguiente punto será el Z.
En el ejemplo, lo que estamos haciendo es solamente crear los tres vectores, X,
Y y Z, utilizando funciones aleatorias y una función trigonométrica.
Una vez creados estos tres vectores podemos proceder a utilizar la
función open3d, esto lo que hace es abre el sistema
de opengl para poder entonces pintar los puntos que queremos obtener.
Finalmente, podemos utilizar entonces, la función plot3d,
que recibe los tres vectores numéricos, para pintar nuestros puntos.
Podemos observar que utilicé el parámetro col, utilizando como valor
Reproduce el video desde :2:16 y sigue la transcripción2:16
rainbow, para poder generar puntos de distintos colores.
Además que el tipo de gráfica será de puntos, pero esto también puede cambiar,
podemos utilizar otros tipos como puede ser líneas o esferas.
[MUSIC]
Expresiones Regulares
[MÚSICA] [MÚSICA]
[MÚSICA] En esta
lección vamos a hablar
de una herramienta muy importante conocida como expresión de regulares.
Hasta el momento hemos visto que en el lenguaje se nos ha presentado
en muchísimas ocasiones vectores numéricos o matrices,
pero también hemos visto en algunas ocasiones algunos vectores con
cadenas de caracteres, estas son muy importantes, por ejemplo,
anteriormente you hemos utilizado cadenas de caracteres cuando leemos archivos con
fechas que estas vienen definidas en los archivos como una cadena de caracteres.
Sin embargo también hay otros tipos de cadenas con las que nos podemos encontrar,
para esto R nos provee con algunas
funciones que nos sirven para manipular cadenas de caracteres.
Ahora veremos algunas funciones para manipular cadenas
y finalizaremos entonces con el uso
de las expresiones regulares para aprender a utilizar mejor estas funciones.
La primera función que vamos a aprender a utilizar es la función grep,
esta función toma como parámetros primero un patrón y
el segundo parámetro es un vector de caracteres.
Donde x es un vector de cadenas, entonces grep lo que hace es regresarnos un
vector numérico en donde los números de ese vector
numérico son los índices donde se encontró el patrón que estamos buscando.
En este ejemplo lo que vemos es que el patrón que estamos buscando es hola
en minúsculas, es importante saber que este patrón
es sensible a las mayúsculas o minúsculas, es decir si usáramos
hola con una mayúscula el patrón puede o no ser encontrado.
Como segundo parámetro le estamos pasando a grep en el ejemplo un
Reproduce el video desde :2:5 y sigue la transcripción2:05
vector de 4 cadenas, entre ellas una que tiene la palabra
hola que va en el segundo lugar de ese vector.
Ahora si llamamos esta función nos regresa un número 2, eso significa que en el lugar
2 de ese vector de caracteres se encuentra la cadena o patrón que estábamos buscando.
En este otro ejemplo utilizando una H mayúscula, este patrón no es encontrado en
el vector de caracteres y por lo tanto nos regresa un vector de tamaño 0.
Ahora la siguiente función que veremos es nchar, esta lo único que nos dice es el
tamaño de el vector de caracteres que tengamos, si el
vector tiene más de un elemento entonces nos regresa un vector numérico dándonos el
tamaño de cada uno de los elementos, de las cadenas que conforman ese vector.
La siguiente función paste concatena
todas las cadenas que recibe como parámetros y nos regresa una única cadena.
Por omisión estas cadenas son separadas con un espacio en blanco,
pero podemos hacer cambiar el comportamiento de la función usando
el parámetro sep, justamente como lo hacemos en el ejemplo.
Sprintf es la siguiente función que veremos, esta ensambla una cadena y
genera una nueva cadena formateada con los valores que vayamos pidiendo,
por ejemplo, en este caso lo que tenemos es una variable llamada i que tiene un
valor numérico que es 9, si quisiéramos conformar una cadena que nos
Reproduce el video desde :3:47 y sigue la transcripción3:47
diera la información sobre i, lo que podemos hacer es usar la función sprintf
y pasarle en cada lugar donde vamos a utilizar el valor numérico,
la cadena especial de %d,
eso significa que es de una un valor decimal y luego cerramos esa cadena y
utilizamos comas para poner los valores de las variables que queremos utilizar,
en este caso es i y además su cuadrado por eso ponemos i, i cuadrada.
La función substring lo que hace es extrae una subcadena de la cadena que
le estemos pasando, los 2 parámetros que recibe después
de la cadena a la cual vamos a extraer la subcadena es el
índice de inicio y de término de donde queremos que extraiga esta subcadena.
Entonces podemos tener una frase que en este caso es R es muy útil
y dependiendo de los valores de los 2 índices de inicio y de final,
la subcadena resultante será diferente en cada caso.
Ahora la función strsplit lo que hace es subdivide una cadena
en cadenas más pequeñas dependiendo de un caracter de separación.
Lo que estamos viendo es que pasamos una cadena que dice esta es una cadena donde
cada una de las palabras está separada por un guión y como segundo parámetro pasamos
ese guión, entonces lo que nos va a regresar la función strsplit es
cada uno de las palabras de esa cadena, pero quitándole el guión,
porque you definimos que el guión es justamente la cadena divisoria.
La siguiente función tiene su nombre regular expression,
la cual es regexpr, esta función recibe un patrón o una expresión
regular como primer parámetro y como segundo parámetro un texto o una cadena.
Lo que hace esta función es nos regresa el índice en donde encuentra la primera
instancia del patrón o expresión regular que estamos buscando.
está función tiene un comportamiento similar a la función anterior,
solamente que en este caso al utilizar esta nueva función nos
regresa los índices donde son encontrados el patrón que estamos buscando.
Es decir nos regresa los índices donde encuentra la instancia inicial
y subsecuentes instancias que son encontradas.
Reproduce el video desde :6:31 y sigue la transcripción6:31
Ahora sí, tenemos que explicar qué es una expresión regular.
Las expresiones regulares o patrones no son más que una especie de comodín o
un atajo para podernos referir a una gran cantidad de cadenas, por ejemplo, esta
expresión se refiere a cualquier cadena que contenga a la letra b o a la letra v.
En términos más formales una expresión regular o una regexpr,
como se conoce en la jerga computacional,
es una secuencia de caracteres que define una búsqueda de un patrón,
principalmente para hacer coincidencia de patrones con cadenas de caracteres.
Las expresiones regulares pueden ser muy ricas e incluso muy complicadas.
El objetivo del curso no define que veamos
a profundidad de estas pero podemos ver en particular cómo las utiliza R,
haciendo una llamada a la función help de la palabra regexp.
Reproduce el video desde :7:31 y sigue la transcripción7:31
Aquí podemos ver todas las expresiones que nos sirven para utilizar
expresiones regulares dentro del lenguaje con las funciones que you hemos visto.
Además hay libros completos que te enseñan
únicamente a utilizar expresiones regulares.
Ahora veremos un par de ejemplos que podrían ser muy útiles
para hacer uso de estas.
Como you vimos en el ejemplo de la b o la v podemos usar los corchetes para
hacer búsquedas de esas letras dentro de una cadena.
Por ejemplo en este momentos estamos observando cómo podemos buscar algunas de
las vocales y la primera función nos regresa el índice en
donde encuentra por primera vez una de esas vocales y la segunda función
encuentra todos los índices donde son encontradas algunas de esas vocales.
En una expresión regular en R un punto nos indica un caracter simple,
entonces cuando lo utilizamos dentro de una expresión regular
lo que estamos indicando es que no importa qué caracter este ahí,
cualquiera que se ponga valida esa expresión regular.
En el ejemplo lo que estamos viendo es hacemos una búsqueda de la expresión
regular a.i, esto nos está indicando que queremos buscar
una cadena que empiece con a, que siga un cualquier caracter y luego el caracter i.
Entonces nos indicará en cuál cadena va a encontrar ese tipo de patrón.
En esta segunda parte lo que hacemos es cambiar el orden de cómo estamos buscando
los caracteres la i y la a, y como se encuentra
más de una vez nos da los índices en donde esta cadena fue encontrada.
Por ejemplo,
¿ahora qué pasaría si quisiéramos buscar un punto dentro de una cadena?
En este caso lo que tenemos que hacer es escapar ese caracter, como el
punto dentro de una expresión regular tiene un significado muy particular,
entonces tenemos que escapar ese caracter utilizando la diagonal invertida,
pero en este caso como la diagonal invertida también es un carácter especial
tenemos que escaparla también,
por eso utilizamos una doble diagonal invertida y luego el punto.
Con esto estamos indicándole a R que esa expresión regular
se está refiriendo a la búsqueda de un punto exactamente.
Graficación con ggplot2
[MÚSICA] [MÚSICA]
[MÚSICA] Ahora
aprenderemos un poco del paquete ggplot2.
Reproduce el video desde ::18 y sigue la transcripción0:18
Este paquete para fines prácticos nos provee con gráficos
de alto nivel donde el usuario no tiene que preocuparse por los detalles,
como lo hacíamos en el sistema base de gráficos de R.
Reproduce el video desde ::33 y sigue la transcripción0:33
En este, las leyendas, los tipos de fuentes y todos los detalles que son
Reproduce el video desde ::39 y sigue la transcripción0:39
llevados a cabo hasta la última minucia con el paquete base,
no tenemos que preocuparnos por ello, porque you trae valores por omisión.
Reproduce el video desde ::49 y sigue la transcripción0:49
Estos valores por omisión son de tan buena calidad, que incluso estos gráficos
podemos utilizarlos inmediatamente en publicaciones.
A diferencia del sistema base de gráficos de R,
el sistema ggplot2 funciona con base en capas,
donde cada una de las capas va añadiendo nueva información.
Por ejemplo, en la primera capa se pueden ver los datos crudos,
y luego se van añadiendo capas con anotaciones o de resúmenes estadísticos.
Este modo de trabajo es la manera en cómo se estila hacer los análisis estadísticos.
Así que en vez de pasar demasiado tiempo concentrado en
los detalles de tu gráfico, lo que puedes hacer aquí es
pensar de qué manera puedes ir ajustando tus datos y los mapeos hacia
atributos estéticos de tal manera que puedas revelar más información de ellos.
La única función que veremos en este curso del paquete de ggplot2
es la función qplot.
Esta función nos permitirá hacer una gran cantidad de gráficos
y de modificar varios atributos estéticos de estos gráficos.
you que incluso llevar a cabo o tratar de entender
todas las minucias del paquete, nos tomaría todo un curso entero.
Con esta función aprenderemos a hacer diferentes gráficos,
y una vez que sepamos qué gráficos podemos hacer aprenderemos cómo mapear variables
a diferentes atributos estéticos, como son los colores, los tamaños o las formas.
También podemos usar condicionamientos para dividir subconjuntos de
nuestros datos y así poder cambiar la apariencia de los gráficos que se generen.
Para poder llevar a cabo los ejemplos utilizaremos un data set o conjunto de
datos, que viene con el paquete ggplot2, este se llama diamonds.
Este no es más que las medidas y la información de calidad y precios
de más de 54.000 diamantes.
Como podemos observar, las columnas x, y, z,
depth y table no son más que las medidas de las dimensiones del diamante.
Ahora, como los datos son demasiados,
tomaremos una pequeña muestra para hacer algunos ejemplos y en algunos otros
utilizaremos todos los datos para poder generarlos.
Reproduce el video desde :3:27 y sigue la transcripción3:27
Esta muestra se toma de la siguiente manera, utilizando la función sample y
pasándola a el dataframe de diamonds y
finalmente guardándolo en un nuevo, en una nueva variable que conocemos como dchico.
Es solo un nombre que le puse para utilizar esta nueva subconjunto de datos.
Ahora podemos crear algunas gráficas, qplot al igual que la función plot del
sistema base, recibe 2 parámetros iniciales que es los valores en x,
y los valores en y, y entonces grafica la gráfica de dispersión.
Reproduce el video desde :4:9 y sigue la transcripción4:09
La diferencia con plot es que en este caso no necesitamos pasarle
los vectores directamente, sino los nombres de las columnas del dataframe,
y luego utilizamos el parámetro data donde especificamos
el nombre del dataset que estamos utilizando para graficar.
Podemos ver que hay mucha saturación por la gran cantidad de datos que hay,
you que estamos utilizando el dataset completo.
Ahora, si utilizamos la muestra que le llamamos dchico,
podemos observar entonces de una mejor manera la gráfica que se genera.
Podemos observar en el gráfico inicial que hay cierta correlación, parece ser
exponencial y además hay ciertos lugares en donde parece hacerse estrías.
Reproduce el video desde :4:59 y sigue la transcripción4:59
Esto, el primer problema podemos tratar de compensarlo haciendo una transformación de
las variables, es decir en vez de utilizar los ejes lineales, podemos hacer una
transformación logarítmica de las variables y entonces estaríamos graficando
los valores logarítmicos contra los valores logarítmicos de x y de y.
Se puede ver que hay un poco de sobregraficación todavía,
por lo que no podemos llevar a cabo conclusiones tan prontas.
Es decir, todavía podemos hacer algunas modificaciones
a nuestra gráfica para poder entender mejor qué está pasando.
También podemos utilizar los argumentos de la variable como combinaciones de otros,
por ejemplo en este caso que estamos viendo, las variables x, y,
y z las combinamos para formar una única variable y las comparamos con
la variable o la columna cara del dataset diamonds.
Ahora hablaremos de los atributos estéticos, comenzamos por el color.
En ggplot2 podemos mapear algún
atributo o categoría que tenga una variable a un atributo estético,
en este caso el color que va a ser dibujado en la gráfica.
Por ejemplo si utilizamos el dataset dchico,
podemos mapear la columna color que nos indica el color del diamante
a un color distinto en la gráfica, que es justo lo que estamos observando.
Además del color, otro atributo estético que tenemos es shape,
shape se refiere a la forma con la que va a pintar los puntos en la gráfica.
Por ejemplo, shape también es muy bueno para poder mapear de características
categóricas a una característica gráfica.
En este caso utilizando nuestro subconjunto de datos dchico,
podemos mapear cada uno de los cortes distintos del diamante, de los diamantes
que tenemos a una figurita distinta cuando se pinta en la gráfica.
Así podemos observar cómo cada tipo de corte va
formando algún tipo de grupo en la gráfica.
¿Recuerdan cuando en la primera gráfica, cuando pintamos todos los puntos
de nuestro dataset diamonds, estaba demasiado saturado?
Bueno, pues el tercer atributo que vamos a ver es alpha, este nos indica
cuántos puntos se necesitan pintar o aparecer
en un mismo lugar para que podemos pintar un punto completamente opaco.
En el caso que estamos observando en este momento, podemos ver que le pide
un alpha de un décimo, es decir cada vez que se pinte un punto en un lugar,
se pintará solo un décimo de lo que sería un punto único opaco.
Es decir,
necesitaríamos 10 puntos en el mismo lugar para que se pinte un primer punto.
Notemos ahora en esta segunda gráfica, como si cambiamos el alpha
de un décimo a un centésimo, podemos encontrar nuevos patrones que
no eran tan claros cuando utilizábamos un alpha más grande.
El último atributo estético que vamos a aprender a utilizar es size,
o como su nombre lo indica en inglés tamaño.
Este atributo lo que hace es que en cada uno de los puntos que estamos dibujando,
dependiendo de la medida o de la categoría que estemos mapeando a la variable,
nos pintará un punto más grande o más pequeño.
Podemos ver que mapeando la variable table podemos
pintar puntos de distintos tamaños.
El particular uso de este ejemplo, no es muy bueno y no nos da nueva información,
por lo que quizá no sea conveniente utilizarlo.
Reproduce el video desde :9:3 y sigue la transcripción9:03
Antes de continuar tenemos que hacer algunas consideraciones estéticas
para tratar de generar las mejores gráficas.
Como you se habrán dado cuenta, algunas variables mapean mejor
Reproduce el video desde :9:16 y sigue la transcripción9:16
a ciertos atributos estéticos de mejor manera.
Por ejemplo, color y la
forma o shape se mapean muy bien a variables categóricas.
Mientras que tamaño o size trabaja mejor con variables que son del tipo continuo.
A veces la cantidad de datos puede hacer una gran diferencia y you
vimos que podemos usar el alpha para poder cambiar
la saturación mayor o menor, dependiendo del número de puntos que tengamos.
Si esto no nos ayuda,
entonces podemos tratar de subdividir los grupos de las variables
que se forman en una sola variable con una técnica especial conocida como faceting.
Este atributo nos permite crear una tabla, donde podemos subdividir en grupos.
Por ejemplo, como lo estamos viendo en este momento,
Reproduce el video desde :10:15 y sigue la transcripción10:15
si queremos ver cómo se comporta la variable carat contra la variable price
y le pedimos que nos haga el faceting por color,
entonces por cada color de diamante nos va pintando el carat contra
el price, o el peso del diamante contra el precio.
Entonces, podemos observar cómo se va comportando
para cada uno de los diferentes colores de diamantes.
Esto nos permite la comparación visual inmediata.
En una primera instancia, la función qplot nos sirvió para crear gráficas de
dispersión, es decir valores x contra valores y.
Este comportamiento puede ser modificado utilizando los geoms
o geometric objects, que no son más
que una descripción del tipo de objeto que queremos utilizar para graficar.
Haremos una revisión de los geoms disponibles que tenemos con qplot.
En principio, el primero y el que se utiliza
por omisión es point, que es justo lo que utilizamos en un principio,
valores x contra valores y, y los que nos dibuja es un puntito.
También podemos utilizar otro geom conocido como smooth,
este lo que hace es que ajusta una curva a los puntos que estamos pintando,
además de que también nos dibuja el error estándar de esta curva.
Una característica de smooth es que podemos especificar
qué tipo de ajuste queremos para la curva, puede ser de regresión lineal,
o incluso métodos más sofisticados como los splice.
Otros geoms importantes que vamos a ver son el jitter y boxplot.
Jitter nos permite analizar en cajas cómo se están dispersando
nuestros puntos, dependiendo de las variables que queramos observar.
Si usamos el geom boxplot, este nos graficará
una gráfica de caja donde podemos observar la distribución de nuestros datos
divididos por las categorías que nosotros querramos observar.
Otros 2 geoms que son muy importantes y que están fuertemente ligados
son line y path.
Line nos dibuja una línea entre 2 puntos, como si fuera uno seguido del otro,
y esta gráfica va generándose de izquierda a derecha.
Mientras que path lo que va haciendo es puede tomar cualquier dirección,
de izquierda a derecha, de derecha a izquierda.
Es por eso que line se usa mucho para graficar series de tiempo,
como la que estamos observando en pantalla.
También es importante notar que en este ejemplo,
el dataset que estamos utilizando es otro.
En este, lo que estamos observando es el cambio de un precio en el tiempo.
Finalmente podemos generar gráficas en una sola dimensión.
Esto cuando por ejemplo queremos observar cómo se está comportando la distribución
de cierta variable en nuestro conjunto de datos.
Hay 3 muy importantes, la primera es histogram,
que es justamente la que estamos observando en este ejemplo.
En esta utilizamos el geom histogram para generar el
histograma de la variable carat.
Reproduce el video desde :13:49 y sigue la transcripción13:49
Además de esta, también existen freqpoly que nos genera un polinomio de
frecuencias, y finalmente density, que nos genera una gráfica de
la densidad de nuestros datos, una gráfica suave de la densidad de nuestros datos.
Funciones Matemáticas y Utilitarias
[MÚSICA] [MÚSICA] [MÚSICA]
R provee una gran cantidad de funciones
para hacer operaciones matemáticas,
estadísticas, de álgebra lineal,
de conjuntos, e incluso algunas operaciones utilitarias.
En esta lección aprenderemos qué tipo de funciones podemos acceder
y además cómo podemos utilizar estas para llevar a cabo simulaciones.
Los primeros tipos de funciones que veremos son las funciones matemáticas.
Por ejemplo, la función exponencial, que lo que hace es recibe un vector numérico
o un valor numérico y nos regresa el número e elevado a ese valor numérico.
También está la función logarítmica que hace exactamente lo mismo,
recibe un vector o un valor numérico y nos regresa el logaritmo en base e
y también la función en base 10 del logaritmo, que son muy parecidas.
Además también tenemos la función raíz cuadrada que saca la raíz cuadrada
del número que introduzcamos o de todo el vector completo,
también la función abs o valor absoluto que nos encuentra el valor absoluto del
vector o número que estemos observando, también las funciones trigonométricas,
las 6 básicas, seno, coseno, tangente, secante,
cosecante y cotangente, y también las funciones mínimo y máximo,
que nos encuentran el mínimo en un vector y el máximo en un vector completo.
También tenemos las funciones which.min y which.max que nos indican
el índice en donde se encuentra el valor mínimo y el valor máximo.
Reproduce el video desde :1:55 y sigue la transcripción1:55
Además, de que también tenemos las funciones pmin y pmax
que reciben varios vectores, y entonces va sacando renglón a renglón
Reproduce el video desde :2:7 y sigue la transcripción2:07
el valor mínimo o máximo de ese conjunto de vectores, es decir nos
regresa un vector con los valores mínimos del conjunto de varios al mismo tiempo.
También tenemos un par de funciones que you hemos usado antes, sum y prod,
estas reciben como entrada un vector y lo único que hacen es
regresan la suma o el producto de todos los elementos de ese vector.
En esa misma línea cumsum y cumprod son 2 funciones que hacen más o menos lo mismo,
la primera lo que hace recibe un vector y nos regresa un vector donde
cada uno de los elementos va acumulando la suma
elemento a elemento de todos los elementos del vector original,
mientras que cumprod lo que va haciendo es ir acumulando pero la multiplicación
de los elementos elemento a elemento en ese vector inicial.
También tenemos las funciones round, ceiling y floor.
Estas lo que hacen es redondean al entero más cercano, pero depende de cada una.
Round lo hace dependiendo del elemento más cercano numéricamente,
mientras que floor lo que hace es redondea pero
al entero hacia abajo y ceiling redondea al entero hacia arriba.
Por supuesto el vector o valor numérico que va a recibir
es un número que puede ser decimal.
Finalmente una última función que veremos es la función factorial,
esta lo que hace es calcula el factorial de x.
Por lo tanto, el vector que tiene que recibir es un vector de valores
enteros o al menos numéricos que estén redondeados a 0.
Ahora veremos algunas funciones para álgebra lineal.
you nos hemos topado un poco con el álgebra lineal porque trabajamos en
general con vectores o matrices, pero también hemos visto que
podemos multiplicar un escalar, es decir un valor numérico por un vector completo
y también que podemos llevar a cabo la operación de multiplicación entre matrices
utilizando el operador %*%.
Otra función importante es crossprod,
esa lo que hace es recibe 2 vectores con la misma dimensión y nos regresa
el producto punto de esos 2 vectores, es decir que el producto punto se
define como la multiplicación elemento a elemento de 2 vectores,
y al final sumas todos los elementos para tener un único valor numérico.
Una función muy importante dentro de las funciones de álgebra lineal
es la función solve, esta lo que hace es resuelve sistemas de ecuaciones lineales
o incluso puede resolver matrices inversas.
Por ejemplo supongamos que tenemos el siguiente sistema de ecuaciones lineales,
Reproduce el video desde :5:11 y sigue la transcripción5:11
x1 + x2 igual a 2 y menos x1 + x2 igual a 4.
Esto lo podemos expresar de manera matricial de la siguiente forma,
primero una matriz 1, menos 1, 1, 1, multiplicada por un vector columna x1,
x2 y eso igual a un vector columna 2, 4.
Ahora, si quisiéramos resolver este sistema
en R lo haríamos de la siguiente manera.
Creamos nuestra matriz por supuesto, y luego generamos también nuestro vector
de salida, que es el vector y 2,4 y luego simplemente decimos solve
la matriz x y el vector columna y.
Esto nos regresará la solución de ese sistema,
en ese caso x1 igual a menos 1 y x2 igual a 3.
La segunda llamada solve donde solo recibe como entrada la matriz x,
nos dará la matriz inversa de x, y podemos ver o comprobar que es correcto
you que al multiplicar la matriz inversa de x, es decir solve x con
Reproduce el video desde :6:23 y sigue la transcripción6:23
la matriz original x entonces nos dará la matriz identidad.
Otras funciones que son útiles dentro del álgebra lineal es la función t
que lo que nos da es una transpuesta de una matriz, la función
qr que nos encuentra la descomposición qr de álgebra lineal de una matriz,
y finalmente la función chol que nos encuentra la descomposición de Cholesky.
Estas funciones nos pueden servir mucho para agilizar algunos cálculos cuando
queremos encontrar matrices inversas.
Otras 2 funciones que son muy útiles son det,
que nos encuentra el determinante de una matriz y eigen,
que nos encuentra los eigenvectores y los eigenvalores de una matriz.
Esas son muy útiles porque si tuviéramos que escribir el código para ellas
haciéndolo serialmente sería 1, muy complicado y 2,
también nos haría el código demasiado largo.
Otra función muy importante dentro de las funciones de álgebra lineal es la función
diag, que nos ayuda a extraer la diagonal de una matriz cuadrada.
En este ejemplo podemos ver que podemos extraer la diagonal de la función,
de la matriz x y una vez creada podemos crear una función
con esa diagonal usando también la función diag de nuevo,
solo que nos llenará de ceros todo lo que no sea la diagonal.
Otra manera de utilizar la función diag es indicándole con un valor numérico las
dimensiones que queremos, es decir si utilizamos diag2 o diag3,
los que nos generará es una matrix de 2 por 2 o de 3 por 3 identidad donde
solo la diagonal está llena de unos y lo demás completamente lleno de ceros.
La última función que veremos en las funciones de álgebra lineal es la función
sweep, lo que hace esta función es hacer operaciones de barrido sobre matrices.
Esta funciona muy parecido a la función apply donde teníamos que indicar
el modo, que iba a ser si va a ser por renglones o por columnas.
En el ejemplo lo que estamos observando es que estamos haciendo una operación renglón
a renglón, y como le estamos pasando un vector, el vector 1, 2, 3, y una matriz,
la matriz b, lo que va a hacer es operar la operación que decimos al final,
es decir la suma, renglón por renglón, es decir una vez que se lleva
a cabo va a ir sumando el elemento de ese vector que estamos poniendo el 1, 2, 3,
a cada uno de los renglones que estamos observando de nuestra matriz.
Reproduce el video desde :9:5 y sigue la transcripción9:05
Ahora veremos un par de funciones que son utilitarias.
Una de ellas pues es la función sort.
Esta recibe un vector como argumento y nos regresa el mismo vector pero ordenado,
por omisión nos regresa el vector ordenado de forma creciente,
pero podemos utilizar el parámetro decreasing
igual a true para que nos lo haga de forma decreciente.
Luego tenemos la función choose donde recibe 2 parámetros n y k,
ambos enteros donde nos da el posible
números de subconjuntos de tamaño k de un conjunto de tamaño n.
Esto es muy común cuando se están tratando de encontrar combinaciones por ejemplo.
También podemos llevar a cabo operaciones con conjuntos,
donde nuestros conjuntos pueden ser vectores.
Las 3 primeras funciones que vamos a ver son la unión,
que lo que hace es une el conjunto x con el conjunto y, la función intersección
que nos regresan los elementos que son comunes a ambos conjuntos y la función
diferencia que nos da la diferencia de conjuntos de 2 vectores.
Las últimas 2 operaciones de conjuntos que vamos a ver son setequal,
que esta nos regresa un valor lógico, verdadero o falso,
donde nos da verdadero si los 2 vectores son
iguales y falso si estos tienen algún elemento o varios elementos diferentes.
También está el operador que también es una función en realidad,
%in% que nos dice si el elemento que estamos poniendo primero
Reproduce el video desde :10:51 y sigue la transcripción10:51
pertenece al vector que estamos teniendo del lado derecho.
Ahora veremos las funciones de distribuciones estadísticas en R.
R prácticamente tiene toda función de distribución estadísticas conocida.
Principalmente, las que son base de un curso de probabilidad básico.
La convención para nombrarlas es usar un prefijo y luego el nombre de la función.
Hay 4 prefijos, r para designar aquellas funciones que están generando
números aleatorios de esa distribución, p para designar aquellas funciones que están
designando la acumulada de esa función de distribución,
d para las funciones que nos están dando la densidad de masa
de esa función, y q para designar aquellas funciones donde estamos
queriendo encontrar un cuantil de esa función de distribución.
En realidad hay una gran cantidad de ellas,
como las que estamos observando en este momento.
Pero, solo para ejemplificar una,
utilizaremos por ejemplo la función rnorm donde antes
Reproduce el video desde :12:1 y sigue la transcripción12:01
ponemos la semilla de esta función set.seed que you habíamos hablado antes,
y luego generamos un número, un gran número de funciones,
de valores provenientes de una normal con parámetros 0 y 1,
es decir la media 0 y la varianza 1.
Y una vez que tengamos eso sacamos la media de ella
y encontraremos que el promedio es muy cercano a 1.
En este otro ejemplo,
estamos también utilizando la función qnorm para encontrar los cuantiles.
En el primero, buscamos un valor de un cuantil que nosotros
you conocemos para una función normal con parámetros 0 y 1.
Sabemos que el cuantil 0.5,
es decir donde la probabilidad se ha acumulado a 0.5 nos va a dar 0.
Solo para comprobarlo, utilizamos la función qnorm y podemos observar que sí,
efectivamente el valor es 0.
Para un valor donde la probabilidad se ha acumulado más, es muy cerca a 1,
podemos ver que después del valor 1.64 esa
probabilidad you se ha acumulado, al igual también por ejemplo cuando nosotros
pedimos el valor de la función cuando ha acumulado la probabilidad 1,
podemos ver que es infinito, y cuando es 0, es menos infinito.
Es decir, la función qnorm nos está dando los cuantiles correctos.
[MÚSICA] [MÚSICA]
Simulación
[MÚSICA] [MÚSICA] [MÚSICA]
[MÚSICA] Ahora veremos cómo todas
estas funciones, o algunas de ellas
nos pueden servir para llevar a cabo la resolución de un problema de simulación.
Supongamos por ejemplo que quisiéramos encontrar la probabilidad de que
pudiéramos tener al menos 5 caras al lanzar 7 veces una moneda.
Sólo para recordar, podemos ver que el lanzamiento de una moneda
puede ser modelado con una variable aleatoria, Bernoulli.
Es decir, donde tiene como parámetro p, que es la probabilidad de éxito.
En este caso, la probabilidad de éxito para nosotros va a ser que caiga una cara.
Y el 1 menos p, la probabilidad de fracaso, que es que salga el otro, o cruz.
En este caso entonces, una vez que you recordamos la variable aleatoria
Bernoulli, podemos entonces utilizar la variable aleatoria binomial, que
lo que nos dice es, el número de éxito en n repeticiones de experimentos Bernoulli.
Esta variable aleatoria la podemos modelar con
una función que you tenemos en r, que se llama rbinom.
No olviden que cuando n es igual a 1, en la función rbinom
o cualquiera de la familia binom, el experimento que estaríamos observando
es el lanzamiento de una moneda, es el caso más simple.
Pero, también podemos utilizar para nuestro caso, n igual a 7,
que son los 7 lanzamientos de la moneda.
Ahora vamos a generar esos números aleatorios utilizando la función rbinom.
Observemos que si lleváramos a cabo ese experimento una única vez,
tendríamos que llamar a rbinom de la siguiente manera.
El primer parámetro es el número de veces que se va a llevar a cabo ese experimento.
Luego, 7 nos dice el número de lanzamientos de
monedas que se va a llevar a cabo y el tercer parámetro que es 0.5,
en este caso, un medio es, la probabilidad de éxito.
Como estamos hablando del lanzamiento de una moneda y como la moneda
estamos suponiendo además que es una moneda justa.
Es decir, la probabilidad de éxito o de fracaso es un medio,
entonces por eso ponemos 0.5 en ese parámetro.
Reproduce el video desde :2:36 y sigue la transcripción2:36
El resultado de esa llamada rbinom
es como si hubiéramos hecho una única vez ese experimento.
Ahora si quisiéramos sacar la proporción de éxitos que tendríamos,
tendríamos que llevar a cabo ese experimento una gran cantidad de veces.
Esto se puede justificar de manera matemática, con la ley de los grandes
números, pero en este caso lo podemos hacer de manera intuitiva,
aplicando ese mismo experimento muchas veces.
En este caso muchas veces va a significar hacerlo 100 mil veces.
Una vez teniendo los resultados de esas 100 mil veces del experimento,
lo que podemos hacer es encontrar ahora, cuántos de esos
experimentos tuvieron 5 veces o más éxito.
Es decir, donde el vector de resultado sea mayor o igual a 5.
Una vez que tengamos este vector que va a ser un vector de lógicos, podemos entonces
encontrar la proporción de verdaderos contra falsos, sacando la media.
Reproduce el video desde :3:44 y sigue la transcripción3:44
Esto es posible you que, recordemos,
los valores lógicos falsos se pueden tomar como 0
y los valores verdaderos se pueden tomar como 1 cuando hay coacción.
Al final, al haber encontrado este promedio,
lo que estamos encontrando entonces en realidad es la probabilidad de que al
llevar a cabo el lanzamiento de una moneda 7 veces, ¿cuántas veces nos caería cara?
Reproduce el video desde :4:14 y sigue la transcripción4:14
Al menos 5 veces o más.
[MÚSICA]
Depuración
[MÚSICA]
[MÚSICA]
[MÚSICA] Es muy común que quizá nos aparezcan errores en nuestro código.
Reproduce el video desde ::19 y sigue la transcripción0:19
A veces podemos intentar resolver esto
utilizando funciones como print para encontrar dónde pudiera estar el error.
En R tenemos un conjunto de herramientas que nos pueden ayudar a poder
localizar mucho más rápido un error y, además, también hay algunas técnicas que
nos pueden ayudar a depurar cuando you hay un error de manera más rápida.
Reproduce el video desde ::44 y sigue la transcripción0:44
Es justo eso lo que veremos en esta lección.
Este es el flujo que se debe llevar a cabo para hacer una depuración.
En primer lugar tenemos que darnos cuenta que hay un error,
muchas veces ni siquiera sabemos eso.
Esto va a depender de los tipos de mensajes de error que nosotros
enviemos, por ejemplo,
cuando no estemos introduciendo los parámetros correctos a una función.
Una vez que sepamos que hay un error tenemos que saber bien cómo reproducirlo.
Reproduce el video desde :1:13 y sigue la transcripción1:13
Esto es un poco complicado a veces porque, como you hemos visto,
muchas ocasiones, las funciones que estamos utilizando no son completamente
terminísticas sino pueden ser aleatorias.
Entonces, puede ser complicado encontrar un error en ese tipo de funciones.
Para eso es recomendable utilizar
funciones como set seed para llevar siempre a cabo el mismo,
los mismos números aleatorios que pueden llevarnos a reproducir el problema.
Una vez que you encontramos el problema y lo pudimos reproducir,
entonces, debemos encontrar en qué parte del código
está llevándose a cabo ese error y, una vez habiéndolo encontrado,
tenemos que arreglarlo y volver a probar para ver que se haya resuelto.
Una consideración importante cuando estemos escribiendo código en R y que you
hemos hecho énfasis anteriormente es que las funciones tengan un tamaño adecuado,
que no sean demasiado largas porque esto lo que provocan
es que cuando haya algún tipo de problema sea difícil encontrarlo.
Reproduce el video desde :2:17 y sigue la transcripción2:17
Por ejemplo,
hemos visto que es muy bueno que las funciones no pasen de una página, y si
pasan más de una página podemos entonces repartirla en funciones más pequeñas donde
así nos será más fácil encontrar errores o problemas cuando estos se presenten.
En R Studio tenemos 3 herramientas que nos pueden servir
muchísimo para llevar a cabo la depuración de nuestro código.
La primera es Traceback, que nos ayuda a regresar los pasos que
se han llevado a cabo hasta que encuentra el que nos está ocasionando el problema.
Reproduce el video desde :2:56 y sigue la transcripción2:56
Luego, también dentro de R studio hay otro que se conoce como Rerun and Debug,
que lo que hace es que vuelve a correr el código de tal manera que cuando se empiece
a ejecutar, uno puede ir llevando a cabo, paso por paso, las líneas del código
de tal manera que pudiéramos probar línea por línea, y Breakpoints,
que lo podemos mandar a llamar utilizando la función Breakpoints dentro de R Studio.
Por ejemplo, en esta definición de las funciones f, g, h e i,
podemos ver que no son más que las llamadas de una detrás de otra y,
cuando llamamos a la función f con el parámetro 10, nos genera un error.
En R Studio se genera entonces un error en color rojo y nos da 2 opciones.
La primera es Show traceback, que es justamente el uso de la herramienta
traceback, y la otra es Rerun and debug, que es justamente este modo interactivo
donde nosotros podemos llevar a cabo la corrida paso por paso de nuestro código.
Si damos clic en la opción Show traceback, lo que podemos ver es que nos
aparece toda la pila de las llamadas de las funciones que se han llevado a cabo.
Esta se debe leer de abajo hacia arriba.
Si la leemos así, podemos llegar al
punto donde se rompe el programa o donde se encuentra el error.
En este caso, justamente, cuando se llama la función i.
En el caso de que el error hubiera sido provocado en alguna función que hubiera
sido cargada con la función source, este modo de R Studio nos permitiría darle
clic al archivo donde están definidas las funciones que nos están dando el error.
A veces esto es suficiente para poder encontrar el error y arreglarlo,
pero otras esto no es posible.
Para eso, necesitamos entonces,
tal vez un modo más interactivo, que nos permita entonces
poder llevar a cabo una depuración más fina de lo que está pasando.
A este modo o herramienta para llevar a cabo este tipo de trabajo
se el conoce como un debugger o depurador.
Este nos permite correr el programa o la parte donde estamos teniendo el error
paso a paso, para que así podamos nosotros hacer
pruebas dentro de este modo para tratar de poder localizar el error también.
Si nosotros queremos entrar en ese modo, entonces tenemos que darle clic a la
opción de Rerun and Debug.
En este modo nosotros tenemos 5 comandos básicos,
que pueden ser utilizados con las teclas.
El primero es n, que nos permite ejecutar el siguiente comando; s,
que da paso a la siguiente función para ejecutarse; f,
que termina el bucle actual o la función que se estuviera ejecutando; c,
que continúa ejecutándose normalmente y q para salirse de esa consola.
El uso de esta consola y sus comandos podrán manipularlos en la práctica.
Para finalizar este tema de depuración hablaremos de la programación defensiva.
Esta es una aproximación a la escritura del código de tal manera
que los errores se generen pronto, para así, una vez que tenemos un error,
se genere un mensaje que nos indique de manera clara que algo está fallando.
Esto se puede hacer de 3 manera.
La primera es checar que los parámetros de entrada sean los correctos.
Es muy común, por ejemplo, que cuando tenemos funciones que no sean
vectorizadas, estar utilizando dentro de estas funciones funciones que sí lo son.
Entonces tenemos que checar los valores de entrada que sean de manera correcta,
utilizando ifs o la función stop para parar cuando haya un error de este tipo.
La segunda es evitar la evaluación no estándar.
Esto es muy común cuando utilizamos funciones como subset, transform o with,
que son funciones muy útiles cuando estamos utilizándolas de
manera interactiva porque hacen suposiciones sobre los tipos pero
que no mandan muchos mensajes informativos cuando pudiera haber una falla.
Es por eso que debemos evitarlas cuando estemos escribiendo código
que va a ser utilizado por alguien más.
La tercera es evitar funciones que nos regresen diferentes tipos de salida.
En este caso, es muy común que nos suceda cuando utilizamos el operador corchete
o la función sapply.
Para evitar esto, cuando utilicemos el operador corchete, podemos utilizar el
parámetro Drop igual a False para que no nos haga un tipo de cambio de clase.
Por ejemplo, cuando hacemos una extracción de una matriz y nos regrese un vector.
De la misma manera podemos utilizar la función vapply,
que es más estricta que sapply cuando se haga uso de ella dentro de una función.
Una última recomendación es que tomemos en cuenta que cuando estamos
escribiendo código en modo interactivo,
lo que queremos son resultados rápidos, de tal manera que podamos corregir también,
algún error o algún detalle al vuelo, pero, cuando estemos escribiendo código
debemos evitar hacer suposiciones sobre lo que nuestro usuario quiere hacer.
Es decir, debemos enviar mensajes de error o advertencia
tan pronto nos percatemos de que pudiera haber un error de este tipo.
Reproduce el video desde :8:38 y sigue la transcripción8:38
Este es el último video en nuestro curso,
por lo que quisiera agradecer a ustedes la atención y el tiempo invertido en este.
Espero que una vez que hayan tenido los objetivos cumplidos puedan llevar a cabo
análisis de datos más sofisticados.
También a todo el equipo de producción
y de diseño instruccional para poder lleva a buen puerto este curso.
Y finalmente, quisiera agradecer a Coursera por haberme daplado esta oportunidad
de poder compartir con ustedes un poco el conocimiento en esta área.
Muchísimas gracias.
[MÚSICA] [MÚSICA]