2.1 R como calculadora

Los operadores aritméticos estándar +, -, \(\textbf{*}\), / y ^ están disponibles, donde x^y representa la exponenciación \(x^y\). Por eso

1 + 1
#> [1] 2
2^3
#> [1] 8

En la salida, [1] indica la posición del primer elemento del vector devuelto por R. Dicho resultado no es sorprendente en este contexto, donde todos los vectores tienen una longitud \(1\), pero será útil más adelante.

Las funciones matemáticas comunes, como log(), exp(), sin(), asin(), cos(), acos(), tan(), atan(), sign(), sqrt(), abs(), min() y max(), también están disponibles. Específicamente, log(x, base = a) devuelve el logaritmo de \(x\) a la base \(a\), dónde \(a\) se encuentra predeterminado por exp(1). Por lo tanto

log(exp(sin(pi/4)^2) * exp(cos(pi/4)^2))
#> [1] 1

que también muestra que \(pi\) es una constante incorporada. Existen otras funciones de conveniencia, como log10() y log2(), pero aquí se usará principalmente log(). Una lista completa de todas las opciones y funciones relacionadas está disponible al escribir ?log, ?sin, entre otros. Las funciones adicionales útiles en estadística y econometría son gamma(), beta(), y sus logaritmos y derivadas (se recomienda consultar ?gama para mayor información).

Aritmética vectorial

En R, la unidad básica es un vector y, por ende, todas estas funciones operan directamente sobre los vectores. Se genera un vector usando la función c(), dónde c significa “combinar” o “concatenar.” Así pues, el siguiente código genera un objeto \(x\), un vector, que contiene las entradas \(1.8\), \(3.14\), \(4\), \(88.169\) y \(13\):

x <- c(1.8, 3.14, 4, 88.169, 13)

La longitud de un vector está disponible usando length():

length(x)
#> [1] 5

Se debe tener en cuenta que la asignación de nombres distingue entre mayúsculas y minúsculas; por eso \(X\) y \(x\) son distintos.

La declaración anterior usa el operador de asignación <-, que debe leerse como un solo símbolo (aunque requiere dos pulsaciones de teclas), una flecha que apunta a la variable a la que se asigna el valor. Alternativamente, = puede usarse a nivel de usuario, pero como se prefiere <- para la programación, se usa en todo este curso. No existe un resultado inmediatamente visible, pero a partir de ahora x tiene como valor el vector definido anteriormente y, por esta razón, puede utilizarse en cálculos posteriores:

2 * x + 3
#> [1]   6.600   9.280  11.000 179.338  29.000
5:1 * x + 1:5
#> [1]  10.000  14.560  15.000 180.338  18.000

Esto requiere una explicación. En el primer enunciado, los escalares (es decir, vectores de longitud \(1\)) \(2\) y \(3\) se reciclan para coincidir con la longitud de x, de modo que cada elemento de x se multiplica por \(2\) antes de agregarle \(3\). En la segunda declaración, x se multiplicación por los elementos en el vector 5:1 (la secuencia de \(1\) a \(5\) que se puede ver arriba) y luego el vector 1:5 se agrega elemento por elemento.

También se pueden aplicar funciones matemáticas; así pues, el siguiente comando devuelve un vector que contiene los logaritmos de las entradas originales de x:

log(x)
#> [1] 0.5877867 1.1442228 1.3862944 4.4792554 2.5649494

Vectores de subconjuntos

A menudo es necesario acceder a subconjuntos de vectores. Lo anterior requiere hacer uso del operador [,, que se puede utilizar de varias formas para extraer elementos de un vector. Por ejemplo, se puede especificar qué elementos incluir o qué elementos excluir.

Un vector de índices positivos, como el que se codifica a continuación, especifica los elementos a extraer:

x[c(1, 4)]
#> [1]  1.800 88.169

Alternativamente, un vector de índices negativos, como el que se codifica a continuación, selecciona todos los elementos menos los indicados (obteniendo el mismo resultado de antes):

x[-c(2, 3, 5)]
#> [1]  1.800 88.169

De hecho, mucho otros métodos se encuentran disponibles para realizar subconjuntos con [, que se explican más abajo.

Modelado de vectores

En estadística y econometría, existen muchos casos en los que se necesitan vectores con patrones especiales. R proporciona una serie de funciones para crear dichos vectores, que incluyen:

ones <- rep(1, 10)
even <- seq(from = 2, to = 20, by = 2)
trend <- 1981:2005

Aquí, ones es un vector de unos de longitud \(10\), even es un vector que contiene los números pares del \(2\) al \(20\) y trend es un vector que contiene los números enteros de \(1981\) a \(2005\).

Dado que el elemento básico es un vector, también es posible concatenar vectores. Por lo tanto:

c(ones, even)
#>  [1]  1  1  1  1  1  1  1  1  1  1  2  4  6  8 10 12 14 16 18 20

El código anterior crea un vector de longitud \(20\) que consta de los vectores previamente definidos ones y even puesto de cabo a rabo.