Fundamentos del lenguaje R
Hay una enorme gama de cosas que R puede hacer, y una de las partes más difíciles de aprender R es encontrar su camino. Asimismo, no hay un orden obvio en el que diferentes personas quieran aprender los diferentes componentes del lenguaje R. Le sugiero que lea rápidamente las siguientes viñetas, que representan el orden en el que he decidido presentar el material introductorio, y si tiene una experiencia relativa en computación estadística, es posible que quiera pasar directamente a la sección correspondiente. Recomiendo encarecidamente que los principiantes trabajen con el material en el orden presentado, porque las secciones sucesivas se basan en los conocimientos adquiridos en las secciones anteriores. Este capítulo se divide en las siguientes secciones:
El prompt de pantalla > es una invitación a poner R a trabajar. La convención en este libro es que el material que debe escribir en la línea de comandos después de la indicación en pantalla se muestra en rojo en fuente Courier New. Simplemente pulse la tecla Return para ver la respuesta. Puede utilizar la línea de comandos como una calculadora, así:
log(42/7.3)
## [1] 1.749795
Cada línea puede tener un máximo de 8192 caracteres, pero si quiere ver una instrucción larga o una expresión complicada en la pantalla, puede continuarla en una o más líneas simplemente terminando la línea en un lugar donde la línea esté obviamente incompleta (por ejemplo, con una coma final, un operador, o con más paréntesis a la izquierda que a la derecha, lo que implica que seguirán más paréntesis a la derecha). Cuando se espera la continuación, el mensaje cambia de> a+, como sigue:
5+6+3+6+4+2+4+8+3+2+7
## [1] 50
Tenga en cuenta que el indicador de continuación no realiza la suma aritmética. Si ha cometido un error y quiere deshacerse de la indicación y volver a la indicación>, pulse la tecla Esc y utilice la flecha hacia arriba para editar la última línea (incompleta). La salida de Ris se muestra en azul y con el tipo de letra Courier New, que utiliza un espaciado absoluto en lugar de proporcional, para que las columnas de números queden bien alineadas en la página o en la pantalla.Se pueden colocar dos o más expresiones en una misma línea siempre que estén separadas por puntos y comas:
2+3; 5*7; 3-7
## [1] 5
## [1] 35
## [1] -4
Para números muy grandes o muy pequeños, R utiliza el siguiente esquema (llamado exponentes):
1.2e3 significa 1200 porque e3 significa "mover el punto decimal 3 lugares a la derecha";
1.2e-2 significa 0.012 porque e-2 significa "mover el punto decimal 2 lugares a la izquierda";
3.9+4.5i es un número complejo con partes reales (3.9) e imaginarias (4.5), e i es la raíz cuadrada de -1
Los números complejos consisten en una parte real y una parte imaginaria, que se identifica con minúsculas como ésta:
z <- 3.5-8i
Las funciones trigonométricas, logarítmicas, exponenciales, de raíz cuadrada e hiperbólicas elementales están implementadas para valores complejos. Las siguientes son las funciones especiales de R que se pueden utilizar con números complejos. Determina la parte real:
Re(z)
## [1] 3.5
Determinar la parte imaginaria:
Im(z)
## [1] -8
Calcula el módulo (la distancia deza 0 en el plano complejo por Pitágoras; six es la parte real ey es la parte imaginaria, entonces el módulo es√x2+y2):
Mod(z)
## [1] 8.732125
Calcula el argumento (Arg(x+ yi)= atan(y/x)):
Arg(z)
## [1] -1.158386
Resuelve el complejo conjugado (cambia el signo de la parte imaginaria):
Conj(z)
## [1] 3.5+8i
La pertenencia y la coerción se tratan de la forma habitual (p. 30):
is.complex(z)
## [1] TRUE
as.complex(3,8)
## [1] 3+0i
Se pueden realizar fácilmente varios tipos de redondeo (redondear hacia arriba, redondear hacia abajo, redondear al entero más cercano). La función ‘mayor entero menos que’ es floor:
floor(5.7)
## [1] 5
La función ‘siguiente entero’ esceiling:
ceiling(5.7)
## [1] 6
Puedes redondear al entero más cercano añadiendo 0,5 al número y utilizandofloor. Hay una función incorporada para esto, pero podemos escribir una propia para introducir la noción de escritura de funciones. Llámala redondeada, y defínela como una función como ésta:
rounded <- function(x) floor(x+0.5)
Ahora podemos utilizar la nueva función:
rounded(5.7)
## [1] 6
rounded(5.4)
## [1] 5
Lo difícil es decidir cómo quieres redondear los números negativos, porque el concepto de arriba y abajo es más sutil (recuerda que -5 es un número mayor que -6). Hay que pensar, en cambio, en si se quiere redondear hacia el cero o lejos del cero. Para los números negativos, redondear hacia arriba significa redondear hacia el cero, así que no te sorprendas si el valor de la parte positiva es diferente:
ceiling(-5.7)
## [1] -5
Con floor, los valores negativos se redondean desde el cero:
floor(-5.7)
## [1] -6
Simplemente puedes quitar la parte decimal del número utilizando la funcióntrunc, que devuelve los enteros formados al truncar los valores hacia el cero:
trunc(5.7)
## [1] 5
trunc(-5.7)
## [1] -5
Existe una función de R llamadaround que se puede utilizar especificando 0 decimales en el segundo argumento:
round(5.7,0)
## [1] 6
round(5.5,0)
## [1] 6
round(5.4,0)
## [1] 5
round(-5.7,0)
## [1] -6
El número de decimales no es el mismo que el número de cifras significativas. Puedes controlar el número de cifras significativas de un número utilizando la funciónignif. Tomemos un número grande como 12 345 678 (aproximadamente 2,35 millones). Esto es lo que ocurre cuando pedimos 4, 5 o 6 dígitos significativos:
signif(12345678,4)
## [1] 12350000
signif(12345678,5)
## [1] 12346000
signif(12345678,6)
## [1] 12345700
y así sucesivamente. Habría que explicar por qué se quiere hacer esto.
La pantalla de R es una calculadora totalmente funcional. Puede sumar y restar usando los símbolos obvios+y-, mientras que la división se logra con una barra diagonal/y la multiplicación se hace usando un asterisco*como éste:
7+3-5*2
## [1] 0
Observa en este ejemplo que la multiplicación (5×2) se realiza antes que las sumas y las restas. Las potencias (como el cuadrado o la raíz cúbica) utilizan el símbolo de la caritaˆ y se realizan antes de la multiplicación o la división, como puedes ver en este ejemplo:
3^2 / 2
## [1] 4.5
Todas las funciones matemáticas que pueda desear están aquí (véase la tabla 2.1). La funciónelog da logaritmos a la base e (e=2,718 282), para lo cual la función antilog esexp:
log(10)
## [1] 2.302585
exp(1)
## [1] 2.718282
Si estás a la antigua, y quieres logaritmos en base 10, entonces hay una función separada, log10:
log10(6)
## [1] 0.7781513
Es posible realizar logs a otras bases proporcionando a la funciónlog un segundo argumento que es la base de los logs que se desea tomar. Supongamos que se desea un registro en base 3 de 9:
log(9,3)
## [1] 2
Las funciones trigonométricas en R miden ángulos en radianes. Un círculo mide 2π radianes, y esto es 360◦, por lo que un ángulo recto (90◦)esπ/2 radianes. R conoce el valor deπaspi:
pi
## [1] 3.141593
sin(pi/2)
## [1] 1
cos(pi/2)
## [1] 6.123234e-17
Observa que el coseno de un ángulo recto no sale exactamente cero, aunque el seno salga exactamente 1. Ele-017 significa “por 10-17”. Aunque se trata de un número muy pequeño, está claro que no es exactamente cero (por lo que hay que tener cuidado al comprobar la igualdad exacta de los números reales; véase la página 23).
| Funciòn | Sentido |
|---|---|
| Log (x) | Logaritmo en base de x |
| exp (x) | Antilogaritmo de round x(e^x) |
| Log (x,n) | Logaritmo en base n de x |
| Log10 (x) | Logaritmo en base 10 de x |
| sqrt (x) | Raíz cuadrada de x |
| factorial (x) | x!=x×(x−1)×(x−2)×···×3×2 |
| choose (n,x) | Coeficientes binomiales n!/(x!(n-x)!) |
| gamma (x) | F(x), para x real (x-1)!, para entero x |
| lgamma (x) | Logaritmo natural de F(x) |
| floor (x) | Mayor entero menor que x |
| ceiling (x) | Menor entero mayor que x |
| trunc (x) | Entero mas cercano entre x y cero, p.ej. trunc (1.5) =1, tronco(-1,5)=-1; trunc es como suelo para valores positivos y como techo para valores negativos |
| round (x, digits=0) | Redondea un valor de x a un número entero |
| signif (x, digits=6) | Darle a x 6 dígitos en notación científica |
| runif (n) | Genera números aleatrios entre 0 y 1 a partir de una distribución ubiforme |
| cos (x) | Coseno de x en radianes |
| sin (x) | Seno de x en radianes |
| tan (x) | Tangente de x en radianes |
| acos (x), asin(x), atan(x) | Transformaciones trigonométricas inversas de números reales o complejos |
| acosh(x), asinh(x), atanh(x) | Transformaciones trigonométricas hiperbólicas inversas de números reales o complejos |
| abs(x) | El valor absoluto de x, ignorando el signo menos si lo hay |
Los cocientes y restos enteros se obtienen utilizando la notación%/%(porcentaje, división, porcentaje) y%%(porcentaje, porcentaje) respectivamente. Supongamos que queremos conocer la parte entera de una división: por ejemplo, cuántos 13 están ahí en 119:
119 %/% 13
## [1] 9
Supongamos ahora que queremos saber el resto (lo que sobra al dividir 119 entre 13): en matemáticas se conoce como módulo:
119 %% 13
## [1] 2
El módulo es muy útil para comprobar si los números son pares o impares: los números impares tienen el valor 1 del módulo 2 y los números pares tienen el valor 0 del módulo 2:
9%%2
## [1] 1
18%%2
## [1] 0
Del mismo modo, usa módulo para probar si un número es un múltiplo exacto de algún otro número. Por ejemplo, para averiguar si 15 421 es un múltiplo de 7 (que lo es), pregunte:
15421 %% 7 == 0
## [1] TRUE
Fíjate en el uso de “dobles iguales” para comprobar la igualdad (esto se explica en detalle en la p. 26).
Aquí hay tres cosas importantes que debe recordar al seleccionar los nombres de sus variables en R:
-Los nombres de las variables en R distinguen entre mayúsculas y minúsculas, soyis no es lo mismo que Y.
-Los nombres de las variables no deben comenzar con números (p. ej., 1x) ni con símbolos (p. ej., %x)
-Variable names should not contain blank spaces (useback.paynotback pay).
En cuanto al equilibrio entre la vida laboral y la personal, haz que los nombres de las variables sean lo más cortos posible, para que no pases la mayor parte de tu tiempo escribiendo y el resto corrigiendo errores ortográficos en tus ridículamente largos nombres de variables.
Los objetos obtienen valores en R por asignación (‘xgetsa value’). Esto se consigue mediante la flechagets<-que es un símbolo compuesto formado por ‘menos que’ y ‘menos’ sin espacio entre ellos. Así, para crear la constante ascalarxcon valor 5 escribimos:
x <-5
y nox=5. Observa que existe una ambigüedad potencial si te equivocas en el espaciado. Compara nuestrox<-5,‘xgets 5’, conx<-5 donde hay un espacio entre el símbolo ‘menos que’ y ‘menos’. En R, esto es en realidad una pregunta, preguntando “¿esxmenos que menos 5?” y, dependiendo del valor actual dex, se evaluaría a la respuesta ya sea TRUE o FALSE.
R uses the following operator tokens:
= < <= == != relacional (mayor que, mayor que o igual, menor que, menor que o igual, igual, no igual)
fórmulas del modelo (‘se modela en función de’)
<- -> asignación (obtiene)
crear una secuencia
Varios de estos operadores tienen un significado diferente dentro de las fórmulas del modelo. Así, * indica los efectos principales más la interacción (en lugar de la multiplicación), : indica la interacción entre dos variables (en lugar de generar una secuencia) y ˆ significa todas las interacciones hasta la potencia indicada (en lugar de elevar a la potencia).
Los vectores enteros existen para poder pasar datos al código C o Fortran que los espera, y para poder representar datos de números enteros pequeños de forma exacta y compacta. El rango de los enteros es de-2 000 000 000 a+2 000 000 000 (-210ˆ9a+210ˆ9, que R podría representar como-2e+09a2e+09).Tenga cuidado. No intente cambiar la clase de un vector utilizando la funcióninteger. Aquí tenemos un vector numérico de números enteros que queremos convertir en un vector de enteros:
x <- c(5,3,7,8)
is.integer(x)
## [1] FALSE
is.numeric(x)
## [1] TRUE
La aplicación de la función de enteros reemplaza todos sus números con ceros; definitivamente no es lo que pretendía.
x <- is.integer (x)
[1]00000
Haga primero el objeto numérico, luego convierta el objeto a entero usando la funciónas.integer de la siguiente manera:
x <- c(5,3,7,8)
x <- as.integer(x)
is.integer(x)
## [1] TRUE
La función de enteros funciona como astrunc cuando se aplica a números reales, y elimina la parte imaginaria cuando se aplica a números complejos:
as.integer(5.7)
## [1] 5
as.integer(-5.7)
## [1] -5
as.integer(5.7 -3i)
## Warning: imaginary parts discarded in coercion
## [1] 5
Los factores son variables categóricas que tienen un número fijo de niveles. Un ejemplo sencillo de un factor podría ser una variable llamada género con dos niveles: “mujer” y “hombre”. Si tuviera tres mujeres y dos hombres, podría crear el factor así:
gender <- factor(c("female", "male", "female", "male", "female"))
class(gender)
## [1] "factor"
mode(gender)
## [1] "numeric"
Lo más frecuente es crear un marco de datos leyendo los datos de un archivo con el programa read.table. Al hacerlo, todas las variables que contengan una o más cadenas de caracteres se convertirán automáticamente en factores:
data <- read.table("/cloud/project/daphnia.txt",header = T)
attach(data)
head(data)
## Growth.rate Water Detergent Daphnia
## 1 2.919086 Tyne BrandA Clone1
## 2 2.492904 Tyne BrandA Clone1
## 3 3.021804 Tyne BrandA Clone1
## 4 2.350874 Tyne BrandA Clone2
## 5 3.148174 Tyne BrandA Clone2
## 6 4.423853 Tyne BrandA Clone2
Este marco de datos contiene una variable de respuesta continua (Tasa de crecimiento) y tres variables explicativas categóricas (Agua, Detergente y Daphnia), todas ellas factores. En la modelización estadística, los factores se asocian al análisis de la varianza (todas las variables explicativas son categóricas) y al análisis de la covarianza (algunas de las variables explicativas son categóricas y otras continuas).
Existen algunas funciones importantes para tratar los factores. A menudo querrá comprobar que una variable es un factor (especialmente si los niveles del factor son números en lugar de caracteres):
is.factor(Water)
## [1] FALSE
Para descubrir los nombres de los niveles de los factores, utilizamos la función de niveles:
levels(Detergent)
## NULL
Para descubrir el número de niveles de un factor, utilizamos la función niveles:
nlevels(Detergent)
## [1] 0
El mismo resultado se obtiene aplicando la función longitud a los niveles de un factor:
length(levels(Detergent))
## [1] 0
Por defecto, los niveles de los factores se tratan en orden alfabético. Si desea cambiar esto (como podría, por ejemplo, al ordenar las barras de un gráfico de barras), esto es sencillo: simplemente escriba los niveles de los factores en el orden en que desea que se utilicen y proporcione este vector como segundo argumento de la función factor.Supongamos que tenemos un experimento con tres niveles de factores en una variable llamada tratamiento, y queremos que aparezcan en este orden: ‘nada’, ‘dosis única’ y ‘dosis doble’. Tendremos que anular la tendencia natural de R a ordenarlos “doble”, “nada”, “simple”:
NOTA: A PARTIR DE AQUÌ NO PUDIMOS CONTINUAR PORQUE NO ADJUNTO EL ARCHIVO “TRIAL”