Licenciado bajo Creative Commons BY-NC-SA 4.0.

1 Introducción a R

1.1 R y Rstudio

R es un lenguaje de programación de scripting orientado al análisis estadístico y gráfico. Cuenta con una nutrida masa de usuarios y desarrolladores que lo han convertido en líder indiscutible dentro de la comunidad estadística internacional, tanto en el ámbito empresarial como en el académico.

Vamos a utilizar R desde la aplicación gráfica RStudio, un IDE (Integrated Development Environment) que proporciona un espacio de trabajo muy amigable y muy similar al de MATLAB.

1.2 Instalación de R y Rstudio

R se puede instalar desde la página web The Comprehensive R Archive Network, mientras que la versión gratuita de Rstudio se puede descargar desde la página de download de Rstudio

1.3 Descripción del entorno

RStudio proporciona un espacio de trabajo muy amigable y similar al de MATLAB. Al abrir el programa, se distinguen cuatro regiones de arriba a abajo y de izquierda a derecha:

  • Editor de scripts. Se recomienda trabajar aquí para guardar un archivo coherente con los ejercicios que se vayan realizando. Al seleccionar código y darle a Run, automáticamente se ejecuta en el panel de debajo, la consola.
  • Consola de comandos, para introducción directa de código o ejecución desde el editor.
  • Panel de historial de comandos y workspace similar al de MATLAB, donde se visualizan las variables en uso y su valor (escalares) o tipo (vectores, matrices, etc.).
  • Panel en el que se agrupan las pestañas de gestión de archivos, gráficas, paquetes y ayuda.

1.4 R basics

# Esto es un comentario

# Un cálculo simple
2^10 - 24
## [1] 1000

Operador de asignación: <- (= también es válido)

x <- 1
x = 1

Si se quiere poner dos instrucciones en la misma línea, hay que separar con punto y coma. Escribiendo solo la variable en la terminal mostraremos su valor por terminal

# Two commands in the same line
x <- 2^10 - 24; x
## [1] 1000

Creación de secuencias:

# secuencia simple
x <- seq(1, 2, 0.1); x
##  [1] 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0
# secuencias más compleja usando la función seq(inicio, final, paso)
y <- seq(1, 2, 0.1); y
##  [1] 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0
#Una secuencia algo más heterogenea, hecha como 
# na concatenación (`c`) de dos partes (1, 5 y seq(100, 110, 2))
z <- c(1, 5, seq(100, 110, 2)); z
## [1]   1   5 100 102 104 106 108 110

Acceso a elementos de una secuencia:

x <- 1:10;

# Accedemos al primer elemento de la secuencia
x[1]
## [1] 1

¿Qué hace tal o cuál función? La ayuda de R es muy completa. Tenemos la búsqueda específica por nombre de función:

? c

Declaración de funciones:

# Ejemplo: Fibonacci, que admite dos parámetros:
#  - n:     numero de valores de la secuencia que queremos calcular (required)
#  - full:  Indica si quermos que la función devuelva 
# toda la secuencia o solo el último valor (optional)  DEFAULT=FALSE

fibonacci <- function(n, full=FALSE) {
  # Reservamos memoria para el vector
  fibvals <- numeric(n)
  
  # ponemos los dos primeros valores de la secuencia
  fibvals[1] <- 1
  fibvals[2] <- 1
  
  # Bucle para calcular el resto de valores
  if (n > 2) {
    x <- 3:n
    for (i in x) { 
      fibvals[i] <- fibvals[i-1] + fibvals[i-2]
    }
    
  }
  
  # Por defecto, devolvemos el valor en la posicion n
  if (!full) {
    return(fibvals[n])
  } 
  # en otro caso, retornamos toda la secuencia
  else {
    return(fibvals)
  }
}

# Pedimos el décimo elemento
fibonacci(10)
## [1] 55
 # Toda la serie hasta el décimo elemento
fibonacci(10, TRUE)
##  [1]  1  1  2  3  5  8 13 21 34 55

2 Estadística con R

2.1 Generación de variables aleatorias

Los paquetes base y stats son fundamentales en R (vienen por defecto) y nos proveen de gran cantidad de funciones básicas que en otros lenguajes deberíamos implementar por nuestra cuenta. Echemos un vistazo a las distribuciones disponibles. Léase lo siguiente, donde disponemos de links a la ayuda de las diferentes distribuciones:

? distributions

Vemos que, para cada distribución xxx, hay cuatro funciones disponibles:

  • rxxx(n, ...) genera \(n\) muestras aleatorias distribuidas según xxx.
  • dxxx(x, ...) devuelve \(f(x)\) para un valor o conjunto de valores, donde \(f\) es la función de densidad. Por tanto, para cualquier xxx, dxxx(Inf) == dxxx(-Inf) == 0.
  • pxxx(q, ...) devuelve \(F(q) = \int_{-\infty}^q f(x)dx\), donde \(F\) es la función de distribución que hemos visto en teoría (basta cambiar la notación integral por sumatorios en el caso de distribuciones discretas). Por tanto, pxxx(Inf) == 1.
  • qxxx(p, ...) devuelve el \(q\) para el que \(F(q) = p\). Es decir, la función inversa a la anterior, y pxxx(1) == Inf.

Generamos 1000 muestras de una \(N(0,1)\) (normal de media 0, varianza 1) y simplemente vemos lo generado

# Generamos valores random de una distribucion normal
x <- rnorm(1000, 0, 1)

# Mostramos los valores obtenidos
plot(x)