R es un lenguaje interpretado con orientación al computo estadistico y la realización de gráficos.
Para la instalación del interprete de R en ubuntu, usaremos el gestor de paquetes como administrador
apt install -y r-base
Ahora debemos realizar la instalación de los complementos necesarios para su uso en los notebooks.
Para la instalación de paquetes desde R es necesario tener los siguientes paquetes:
apt install -y curl libssl-dev libcurl4-openssl-dev libxml2-dev
En este paso requerimos iniciar R en la terminal (aun como administrador), lo cual hacemos con R
. Una vez estamos en la consola de R realizamos lo siguiente:
install.packages(c('repr', 'IRdisplay', 'crayon', 'pbdZMQ', 'devtools'))
devtools::install_github('IRkernel/IRkernel')
Tras la primera linea es necesario (si es la primera vez que realizamos una instalación) configurar el servidor CRAN, de preferencia al lugar geografico más cercano. En este punto ya esta instalado el kernel, pero ahora debe registrarse para que sea reconocido por jupyter, proceso que se realiza en cada sesión de usuario que lo requiera.
IRkernel::installspec()
Ahora ya podemos salir del administrador, y ejecutar como usuario normal a jupyter
seguido del comando de interes (notebook
, console
, lab
) y finalmente --kernel=ir
. La última parte indica el kernel asociado a R. Igualmente se puede hacer la selección del kernel de forma grafica con el gui de la interface que deseamos usar.
Si usamos Anaconda para la instalación de python, una forma simple de hacer este mismo proceso será:
conda install -c r r-essentials
Esto nos ofrece una gran ventaja si nuestra distribución de linux no contiene las dependecias en la versión requerida (incluyendo R >= 3.2
) para que los paquetes que requerimos instalar con el gestor de R sean reconocidos en el repositorio o si estamos en windows. Otra opción si no queremos usar Anaconda en linux y tenemos una versión de R anterior, es especificar el repositorio de instalación:
install.packages(c('rzmq','repr','IRkernel','IRdisplay'), repos = 'http://irkernel.github.io/', type = 'source')
Para la instalación de paquetes adicionales, se usa tal como se indico al inicio, la instrucción install.packages(PKGNAME)
donde PKGNAME
se reemplaza por el nombre del paquete. Para cargar el paquete usamos library(PKGNAME)
. Tambien es posible desasociar la carga de un paquete con el fin de reducir la memoria. Pruebe el siguiente código, usando la primera linea como administrador dentro de R.
install.packages('fortunes')
library(fortunes)
fortunes()
detach(package:fortunes)
fortunes()
Podemos consultar la ayuda sobre una función dada con help
y hacer una busqueda de posibles funciones con base a una parte del nombre con apropos
.
In [1]:
help("library")
In [2]:
apropos("install")
El lenguaje R soporte dos mecanismos equivalentes de asignación, uno mediante =
y otro mediante <-
o ->
donde la dirección de la flecha indica donde esta la variable en la cual se hará la asignación.
La asignación es de tipo dinamico, es decir, no se requiere indicar el tipo de dato para su asignación, sino que es inferido por el lenguaje.
La sintaxis aritmetica es de forma tradicional a la usada en python 3 (resaltando el uso de la división flotante) pero diferenciando en el operador modulo el cual requiere %%
y no %
. Al igual que octave, tiene soporte para el operador de potencia tradicional ^
y para el equivalente en python **
. R viene con funciones matematicas accesibles de forma inmediata sin realizar la carga de paquetes.
In [3]:
# Al igual que la mayor parte de lenguajes compatibles con los interpretes linux, los comentarios son con signo numero
x = 1/2; x
y <- 2; y
3 -> z; z
x + y
x / y
x %% y
x ** y
x ^ y
sqrt(x - y + 0i)
sin(x) + exp(x) - log(x)
!((1 > 2) & FALSE)
palabra = "hola mundo"; palabra
In [4]:
vector_a = c(0, 1, 5, 8)
vector_b = c(1, 8, 2, 0)
vector_c = vector_a + vector_b
vector_c
LLama la atención la forma de visualizar los resultados en R con información complementaria. Los arreglos en este caso se visualizan con la información asociada a la posición de cada valor. Tambien notamos que los arreglos de R soportan de forma nativa arreglos matematicos a diferencia de las listas de python, las cuales deben convertirse primero en objetos array
de numpy
.
Otra función de interes es como imprimir. Notamos que la visualización por defecto de arreglos con solo llamar la variable es mostrar los elementos de forma separada indicando sus posiciones en el arreglo. Notamos tambien a partir de esta visualización que el conteo de los elementos de los arreglos en R comienza en 1.
In [5]:
print(vector_c)
print(z)
Para la construcción de matrices se usa la función matrix
.
In [6]:
a = matrix(c(2, 4, 3, 1, 5, 7), nrow=2, ncol=3, byrow = TRUE)
print(a)
a # Compare visualización por invocación con visualización con print.
print(a[2,]) # Muestra fila 2
print(a[,1]) # Muestra columna 1 (se pierde la propiedad de columna)
print(a[2, 1]) # Muestra elemento de la fila 2 y columna 1
print(a[, c(1,3)]) # Muestra submatriz formada por las columnas 1 y 3
Notese que el formato de impresión directo es diferente al generado por el print
, dado a que internamente las matrices son clases formadas por vectores con una propiedad de forma.
El lenguaje R tambien permite trabajar bajo el paradigma POO. De hecho, al igual que python, encontramos que la mayor parte del soporte del lenguaje es realizado como objetos. Esto es el motivo por el cual tambien podemos notar que la impresión de los datos esta acompañada de una información adicional a la que esperamos que tenga la mayor parte de ocasiones.
In [7]:
class(vector_a)
class(x)
class(palabra)
class(TRUE)
class(1+2i)
Un ejemplo de clase asociada a los calculos estadisticos son los minimos cuadrados. El objeto lm
usa para su creación dos vectores que indican la variable dependiente y la variable independiente separadas por ~
.
In [8]:
a = c(0.1, 1.2, 3.8, 8.7, 17.5)
b = c(0.2, 0.9, 2.1, 3.0, 3.9)
cor(b, a)
c = lm(a ~ b)
c
La definición de una clase implica la existencia de métodos y/o atributos. No todas las clases definidas en R poseen atributos o métodos públicos, pero no es el caso general. Para conocer los atributos y métodos públicos podemos usar attributes
y methods
.
In [9]:
attributes(c)
methods(c)
Para consultar los valores de los atributos o ejecutar un método de la clase, ubicamos el signo $
despues del objeto y luego el nombre del atributo o clase.
In [10]:
c$model
c$coefficients
c$coefficients[1]
c$coefficients[[1]]
La función summary
muestra toda la información relacionada a los objetos, en un formato de resumen.
In [11]:
summary(c)
En el caso anterior, con la indicación realizada se busco una relación lineal. Es posible buscar otros tipos de relación por linealización o por indicación explicita del modelo. Por ejemplo, por linealización, podríamos pensar en a ~ b**2
para una relación cuadratica sin coeficientes lineales ni interceptos, o podemos pensar en un modelo polinomico como el ejemplo siguiente.
In [12]:
d = lm(a ~ poly(b, 2, raw=TRUE))
# poly crea el modelo polinomico
# variable, grado, y polinomio tradicional
summary(d)
Los gráficos se pueden construir de una manera simple y tambien sin necesidad de cargar paquetes. La instrucción plot
se encarga de esto. Existen más funciones de graficacion para incluir la forma tradicional de distinguir la incertidumbre de los datos o el trazado de tendencias, así como distintas personalizaciones del gráfico.
In [13]:
plot(b, a) # Cada llamado a plot crea un grafico nuevo
abline(c) # Grafica la recta de un modelo lineal
e = d$coefficients[[1]] + d$coefficients[[2]]*b + d$coefficients[[3]]*b**2
lines(b, e) # Contruye lineas entre los pares de puntos
R tiene soporte a la mano para la lectura de archivos con información numérica. Para archivos separados por espacios podemos usar read.table
y si es un archivo separado por comas usamos read.csv
.
In [14]:
tabla = read.table("r_datos.txt")
print(tabla)
tabla
attributes(tabla)
Otros tipos de gráficos se encuentras disponibles sin necesidad de paquetes especiales, tambien de interes estadistico, como lo son histogramas (hist
) y los gráficos de cajas y bigotes (boxplot
).
In [15]:
hist(tabla$V1, main="Distribución de V1", xlab="V1")
In [16]:
boxplot(tabla$V1)
In [17]:
mean(tabla$V1) # Media
sd(tabla$V1) # Desviación estandar
min(tabla$V1) # Mínimo
max(tabla$V1) # Máximo
No solo encontramos funciones de estadistica descriptiva, sino tambien funciones asociadas a la estadistica inferencial, como las funciones de distribución. Podemos encontrar disponibles como ejemplo, algunas distribuciones de uso bastante común como la distribución normal, chi cuadrado y binomial. Para más información sobre el uso de R con estas distribuciones consultar con help
con los argumentos Normal
, Chisquare
y Binomial
.
In [18]:
help(Normal)
In [19]:
help("Control")
In [20]:
help(source)
In [21]:
help("function")