Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Decimos que es un lenguaje de programación porque nos permite dar instrucciones, usando código,
a nuestros equipos de cómputo para que realicen tareas específicas.
La manera de instalar R cambia dependiendo del sistema operativo. El sitio oficial de CRAN, en el
que encontrarás más información sobre este repositorio es el siguiente:
https://cran.r-project.org/
Consola de R: Lo primero que nos encontramos al ejecutar R es una pantalla que nos muestra la
versión de este lenguaje que estamos ejecutando y un prompt:
>_
Esta es la consola de R y corresponde al entorno computacional de este lenguaje. Es aquí donde nuestro
código es interpretado. Podemos escribir código directamente en la consola y R nos dará el resultado
de lo pidamos allí mismo.
El entorno R ofrece ayuda al usuario mediante el menú Ayuda en la barra de la ventana R Console o
en otras ventanas específicas. También se puede buscar ayuda mediante comandos:
?help
help(package="readxl")
help("pie")
help("exp")
?summary
?mean
Por último, también podemos cambiar de directorio con la siguiente ruta de la barra de menú:
R permite realizar operaciones como si se tratara de una calculadora. Las operaciones que se escriben
en la consola, en R se dice que se ejecutan. Cuando hablamos de ejecutar, llamar o correr nos referimos
a pedir que R realice algo, en otras palabras, estamos dando una instrucción o una entrada. Cuando
decimos que R nos devuelve algo, es que ha realizado algo que le hemos pedido, es decir, nos está
dando una salida. Por ejemplo, si escribimos lo siguiente en la consola y le damos a Enter, estamos
pidiendo que se ejecute esta operación: > 1 + 1
Y nos será devuelto su resultado: [1] 2
Operadores:
Aritméticos Comparativos Lógicos
+ Suma = igualdad & Y lógico
- Resta != Diferente de ! No lógico
* Multiplicación < Menor que | O lógico
/ División > Mayor que
^ Potencia <= Menor o igual
>= Mayor o igual
Funciones:
Raíz cuadrada de x sqrt(x)
Exponencial de x exp(x)
Logaritmo neperiano log(x)
Nº de elementos de un vector x length(x)
Suma los elementos del vector x sum(x)
Seno de x sin(x)
Coseno de x cos(x)
Tangente de x tan(x)
5+3 # suma
5-3 # resta
5*3 # producto
5/3 # cociente
5^3 # potencia
sqrt(5) # raíz cuadrada
exp(5) # el número "e" elevado a (función exponencial)
log(5) # logaritmo neperiano
log10(5) # logartimo en base 10
pi # el número "pi" está definido
sin(pi/2) # la función seno (ángulo en radianes)
Si el resultado tiene muchos decimales y queremos ajustarlo a un número concreto, por ejemplo 3:
round(sqrt(5),3)
R es capaz de manejar una variedad de tipos de datos, que se almacenan en diferentes estructuras. La
asignación se puede realizar mediante = o <-. Algunas estructuras son las siguientes:
ciudad = "Ceuta"
class(ciudad)
[1] "character"
x = "4.1"
class(x)
[1] "character"
2*sqrt(x)+7
Error in sqrt(x) : non-numeric argument to mathematical function
Creamos vectores usando la función c() (combinar). Llamamos esta función y le damos como
argumento los elementos que deseamos combinar en un vector, separados por comas.
v1 <- c(1, 2, 3, 5, 8, 13); v1 # Vector numérico
[1] 1 2 3 5 8 13
v2 = 1:10 # Secuencia de valores
[1] 1 2 3 4 5 6 7 8 9 10
Para resolver tests de Chi-cuadrado necesitaremos introducir los datos en matrices que crearemos a
partir de un vector de datos indicando el número de filas, el de columnas o ambos.
matrix(1:12, nrow = 3, ncol = 4)
install.packages("readxl")
library(readxl)
osteo <- read_excel(path = "osteo.xlsx", sheet = 1)
osteo
El archivo de datos que utilizaremos en las prácticas para ilustrar con ejemplos las técnicas estadísticas
analizadas en los apuntes de teoría contiene los datos correspondientes a un estudio acerca de la
densidad mineral ósea en pacientes diabéticos insulin-dependientes. En la tabla siguiente se detallan
todas las variables: especificando el nombre reducido y la descripción de cada una de ellas.
install.packages("car")
library(car)
Nueva variable que vale 1 cuando una variable es menor que una cantidad:
osteo$joven <- with(osteo, as.numeric(osteo$edad<40)); osteo$joven
pie(x, labels = names(x), clockwise = FALSE, init.angle = if(clockwise) 90 else 0, col = NULL,
main = NULL)
barplot(x, horiz = FALSE, height, col = NULL, width space, names.arg, beside, main = NULL,
sub = NULL, xlab = NULL, ylab = NULL)
donde
x es un vector con las frecuencias de las observaciones. Igualmente, puede ser una tabla de frecuencia
(de las obtenidas con table o prop.table).
labels es un vector de cadenas de caracteres que indican los nombres de cada una de las categorías que
aparecen en el gráfico de sectores.
clockwise es un argumento lógico que indica si los sectores se dibujan en sentido horario (clockwise
= TRUE) o en sentido antihorario (clockwise = FALSE, que es la opción por defecto).
init.angle es un valor numérico que indica el ángulo (en grados) en el que se sitúa el primer sector.
Por defecto, el primer sector empieza a dibujarse a los 90 grados (- a las 12 en punto -, cuando
clockwise es igual a TRUE) o a los 0 grados (- a las 3 en punto -, cuando clockwise es igual a FALSE).
horiz es un argumento lógico que indica si las barras del gráfico de barras se dibujan de forma vertical
(horiz = FALSE, que es la opción por defecto) u horizontal (horiz = TRUE).
col es un vector en el que se indican los colores de las barras o los sectores del gráfico.
main y sub son cadenas de caracteres en la que se especifican el título y el subtítulo del gráfico.
xlab e ylab son cadenas de caracteres en las que se especifican los nombres de los ejes X e Y.
Variables cuantitativas: Los gráficos que se suelen emplear con más frecuencia son el
histograma, el diagrama de tallos y hojas y el diagrama de caja y bigotes. En R, se utilizan las
órdenes hist, stem y boxplot para la obtención de histogramas, de diagramas de tallos y hojas
y de diagramas de caja y bigotes, respectivamente. Éstas son las principales opciones de estas
funciones:
hist(x, breaks = “Sturges”, freq=TRUE, right = TRUE, col = NULL, main = paste(“Histograma
de” , xname))
breaks indica la forma en la que se calcularán los intervalos en el histograma. Las opciones disponibles
para este parámetro son “Sturges” (que es la opción por defecto) “Scott” y “FD” “Freedman-Diaconis“.
Para más información sobre estos métodos, así como la fórmula que emplea cada uno de ellos para
determinar el número de intervalos, se puede consultar el siguiente enlace (en inglés):
http://www.mas.ncl.ac.uk/~nlf8/teaching/mas1343/notes/chap4-5.pdf
freq si es TRUE determina que el intervalo se represente con las frecuencias absolutas.
Range es un valor numérico que determina la extensión de los bigotes de la caja. Para un valor positivo
de range, los bigotes se extienden hasta el último dato que no supere 1.5 veces la longitud de la caja
(el rango intercuartílico). Para un valor de 0, los bigotes se extienden hasta el dato más lejano.
right es un argumento lógico que indica si los intervalos son cerrados por la izquierda y abiertos por
la derecha (en cuyo caso, right = TRUE, que es la opción por defecto) o viceversa (right = FALSE).
Las opciones col y paste funcionan igual que en los gráficos de barras y sectores.
- Suponemos que los datos que aporta el problema son las modalidades y las
correspondientes frecuencias absolutas
Ejercicio 1 En una muestra de 500 alumnos de la UGR se determinó que 150 tenían el grupo sanguíneo
A, 75, el B, 25 AB y 250 el 0. Obtén la tabla de frecuencias y representa la variable utilizando un
diagrama de barras y otro de sectores.
Tabla de frecuencias:
Grupo fi hi pi
A 150 0.30 30 %
B 75 0.15 15 %
AB 25 0.05 5%
0 250 0.50 50 %
500 1.00 100 %
Tablas de frecuencias
Absolutas: table(x)
Relativas: table(x)/length(x)
Porcentajes: table(x)/length(x) * 100
Gráficas:
Ejercicio 2 Calcula la tabla de frecuencias absolutas y relativas para la variable sexo (del archivo
osteo), y haz un diagrama de barras y otro de sectores, cambiando los colores y añadiendo títulos para
practicar.
Seleccionamos el directorio de trabajo Practicas R (carpeta con los archivos de las prácticas
disponibles en PRADO 2) y a continuación cargamos el archivo de datos utilizando el archivo Excel
library(readxl)
osteo <- read_excel(file.choose())
O bien cargando el archivo osteo.RData con la ruta Archivo → Cargar área de trabajo…
barplot(height=fi,col=c("cornflowerblue","pink"),ylim=c(0,50),main="Sexo",
ylab ="Frecuencia absoluta")
barplot(height=hi,col=c("cornflowerblue","pink"),ylim=c(0,0.6),main="Sexo",
ylab ="Frecuencia relativa")
barplot(height=pi,col=c("cornflowerblue","pink"),ylim=c(0,60),main="Sexo",
ylab ="Porcentaje")
Tabla de frecuencias:
Sexo fi hi pi
Hombre 45 0.479 47.9 %
Mujer 49 0.521 52.1 %
94 1.000 100.0 %
x <- osteo$alcohol
# etiquetas <- c("No consume", "Moderado", "Excesivo")
fi <- table(x); fi
n <- sum(fi); n
hi <- round(table(x)/length(x),3); hi
pi <- round(hi*100,1); pi
Tabla de frecuencias:
Consumo alcohol fi hi pi
No consume 14 0.149 14.9 %
Moderado 79 0.840 84.0 %
Excesivo 1 0.011 1.1 %
94 1.000 100.0%
- Suponemos que los datos que aporta el problema son los valores de la variable y las
correspondientes frecuencias absolutas.
Tabla de frecuencias:
xi fi hi pi Pi
0 8 0.16 16 % 16 %
1 12 0.24 24 % 40 %
2 10 0.20 20 % 60 %
3 6 0.12 12 % 72 %
4 4 0.08 8 % 80 %
5 4 0.08 8 % 88 %
6 4 0.08 8 % 96 %
7 0 0.00 0 % 96 %
8 2 0.04 4 % 100%
50 1.00 100 %
El número medio de dientes cariados es 2.52 con una variabilidad de 2.1404 dientes. El 50% de los
niños de 12 años tiene 2 dientes cariados o menos y el otro 50% tiene 2 dientes cariados o más.
Ejercicio 5 En 500 estudiantes de la UGR se anotó el número de hermanos, obteniéndose que 72, 155,
97, 81, 30, 27, 20 y 18 alumnos tenían 0, 1, 2, 3, 4, 5, 6 y 7 hermanos, respectivamente, en esas
condiciones.
a) Calcula la tabla de frecuencias.
b) Representa gráficamente la variable.
c) Calcula la mediana, la media y la desviación típica.
Tabla de frecuencias:
xi fi hi pi Pi
0 72 0.144 14.4 % 14.4 %
1 155 0.310 31.0 % 45.4 %
2 197 0.194 19.4 % 64.8 %
3 81 0.162 16.2 % 81.0 %
4 30 0.060 6.0 % 87.0 %
5 27 0.054 5.4 % 92.4 %
6 20 0.040 4.0 % 96.4 %
7 18 0.036 3.6 % 100.0 %
500 1.000 100 %
El número medio de hermanos es 2.2 con una variabilidad de 1.81 hermanos. El 50% de los estudiantes
tienen 2 hermanos o menos y el otro 50%, 2 hermanos o más.
Tablas de frecuencias
Primero hay que “cortar” la recta en intervalos, y luego se pide la tabla de frecuencias de los intervalos:
table(cut(x, breaks)) donde breaks es el número de intervalos, o el vector con los extremos
sucesivos
Gráficas:
Estadísticos:
Media: mean(x)
Mediana: median(x)
Mínimo: min(x)
Máximo: max(x)
Cuantil de orden pp: quantile(x, prob=pp)
Recorrido: hay que calcularlo con su definición (max(x)-min(x)).
Varianza: var(x)
Desviación típica: sd(x)
Recorrido intercuartílico: IQR(x)
46, 29, 35, 61, 54, 37, 53, 57, 57, 51, 43, 67, 66, 31, 53, 51, 48, 59, 55, 47, 76, 49, 59, 50, 65, 41 y 60
x=c(46,29,35,61,54,37,53,57,57,51,43,67,66,31,53,51,48,59,55,47,76,49,59,50,65,41
,60)
m = mean(x); m
sort(x)
med = median(x); med
c3 = quantile(x, prob=0.75); c3
d9 = quantile(x, prob=0.9); d9
R = max(x)-min(x); R
var = var(x); var
dt = sd(x); dt
cv = sd(x)/abs(mean(x))*100; cv
RI = IQR(x); RI
hist(x, breaks=6)
boxplot(x)
La concentración media es de 51.85 mEq/l con una variabilidad de 11.1828 mEq/l. El 50% de los
estudiantes tiene una concentración sodio de 53 mEq/l o menos y el otro 50% de dicho valor o más. El
75% de los estudiantes tienen una concentración de sodio de 59 mEq/l o menos y para el 90% de los
estudiantes es de 65.4 mEq/l o menos. El rango es de 47 mg/dl (por lo que la desviación típica puede
considerarse pequeña y la media es representativa de la muestra). El coeficiente de variación es 21.57%
y el rango intercuartílico es 12.5 mEq/l.
Ejercicio 7 Se determinó 12 veces el contenido en glucosa en sangre (en mg/dl) de una misma muestra
utilizando dos métodos A y B, de determinación rápida de la misma (los resultados se han obtenido
por redondeo al entero más cercano):
Método A 140 141 142 127 138 136 142 126 148 139 151 136
Método B 130 146 132 138 145 148 147 135 137 137 134 138
a) Calcular la media, la mediana, el primer cuartil y el decil 8.
b) Calcular todas las medidas de dispersión. ¿Qué método es preferible?
Realiza un informe con esta información.
x1 = c(140,141,142,127,138,136,142,126,148,139,151,136)
x2 = c(130,146,132,138,145,148,147,135,137,137,134,138)
m1 = mean(x1); m1
m2 = mean(x2); m2
med1 = median(x1); med1
med2 = median(x2); med2
c1x1 = quantile(x1, prob=0.25); c1x1
c1x2 = quantile(x2, prob=0.25); c1x2
d8x1 = quantile(x1, prob=0.8); d8x1
d8x2 = quantile(x2, prob=0.8); d8x2
R1 = max(x1)-min(x1); R1
R2 = max(x2)-min(x2); R2
var1 = var(x1); var1
var2 = var(x2); var2
dt1 = sd(x1); dt1
dt2 = sd(x2); dt2
cv1 = sd(x1)/abs(mean(x1))*100; cv1
cv2 = sd(x2)/abs(mean(x2))*100; cv2
RI1 = IQR(x1); RI1
RI2 = IQR(x2); RI2
El nivel medio de glucosa por el método A 138.8 mg/dl con una variabilidad de 7.26 mg/dl (varianza
de 52.7) y por el método B el promedio fue de 138.9 mg/dl con una variabilidad de 6.11 mg/dl (varianza
de 37.36). Con el método A el 50% de las mediciones fueron de 139.5 mg/dl o menos y el otro 50%
de 139.5 mg/dl o más, mientras que en por el método B el nivel mediano se situó en 137.5 mg/dl. El
25% de las mediciones con el método A fueron de 136 mg/dl o inferiores y, por el método B, fueron
de 134.75 mg/dl o menos. El 80% de las mediciones con el método A fueron de 142 mg/dl o inferiores
y, por el método B, fueron de 145 mg/dl o menos.
Los rangos fueron de 25 mg/dl en el caso del método A y 18 mg/dl para el método B. Los rangos
intercuartílicos fueron 6 y 10.5 mg/dl, respectivamente.
Los coeficientes de variación fueron 5.2% y 4.4%, respectivamente, por lo que ambos métodos son
muy parecidos, el método B sería un poco mejor.
Ejercicio 8 Calcula todas las medidas descriptivas para la variable peso (del archivo osteo) y
representa gráficamente la variable.
x = osteo$peso
table(x) # ¡no lo hace bien!
min(x)
max(x)
table(cut(x,breaks=5*(8:20))) # la tabla de frecuencias con intervalos
table(cut(x,breaks=5*(8:20)))/length(x)
table(cut(x,breaks=5*(8:20)))/length(x)*100
R = max(x)-min(x); R
quantile(x)
p65 = quantile(x,probs = 0.65); p65
m = mean(x); m
dt = sd(x); dt
cv = sd(x)/abs(mean(x))*100; cv
med = median(x); med
RI = IQR(x); RI
Ejercicio 9 Obtenga una nueva base de datos que llamará osteo1 eliminando los pacientes:
Como verificación, compruebe que la edad media de la nueva base de datos es: 30.3707865168539
Considere la variable valor tipificado de la densidad de masa ósea en L24 en los pacientes para los
cuales la Ingesta de calcio es Suficiente y calcule varias medidas estadísticas.
q = c(45, 58, 69, 76, 90) # vector con los números de pacientes de hay que quitar
osteo1 = osteo[-q,] # nueva base de datos osteo1
R = max(x)-min(x); R
m = mean(x); m
dt = sd(x); dt
cv = sd(x)/abs(mean(x))*100; cv
p65 = quantile(x,probs = 0.65); p65
med = median(x); med
RI = IQR(x); RI
R = 0.63
m = 0.8131395
dt = 0.1410904
cv = 17.35131
p65 = 0.8725
med = 0.825
RI = 0.1875