Autor: Álvaro Alonso Fernández
Departamento de Ciencias de la Vida
Unidad Docente de Ecología
Universidad de Alcalá (España)

Mi Web de R

Mi Web

Veremos algunos pasos básicos para adentrarse en el manejo de R. Si se quiere aprender de verdad hay que dedicar mucho tiempo por vuestra parte


Puedes reproducir este contenido, sin modificarlo, citando al autor y para fines docentes no lucrativos

1 Introducción

En este seminario veremos unas breves notas para empezar a manejar R. Para poder utilizar R se requiere de mucha práctica y dedicar horas autónomas. Entre otros temas aprenderemos a fijar nuestro directorio de trabajo, a leer nuestros datos, a transformar variables en factores, a añadir nuevas variables, a crear algún gráfico sencillo, etc. Son muchas cosas las que se pueden hacer en R, poco a poco se van aprendiendo, saberlo todo es muy muy complicado, por no decir imposible. Si le dedicas tiempo a los aspectos que más se utilizan en el Grado (gráficos, análisis estadísiticos sencillos, etc.) mucho mejor. Pero todo depende de ti, si quieres aprender algo necesitas dedicarle tiempo y sacrificio, en 2 horas simplemente es imposible…..

2 Nuestros datos

Vamos a crear un fichero Excel que contenga las siguientes variables (en la primera fila en negrita, nombre cortos, sin símbolos y sin espacios):individuo,altura,peso,edad,sex,ciudad.

Guardaremos el fichero como fichero Excel, como fichero CSV delimitado por comas y como fichero de texto (TXT). Les daremos un nombre corto y sencillo, el mismo para los tres, su extensión los diferenciará.

Necesitamos el programa Excel. Los datos de cada variable los podemos generar en el curso, simplemente con la información de cada uno de nosotros generaremos el fichero con el que trabajaremos a lo largo del seminario. En los ejemplos que pongo más abajo no utilizó esos datos, simplemente son un apoyo para luego aplicarlos a vuestros datos.

3 ¿Cómo conseguir que R lea nuestros datos?

Hay varias formas de afrontar esto. Podemos indicar directamente a R en qué lugar se encuentran nuestros datos utilizando file.choose (). Al ejecutar esta orden (tal como os la he puesto) se abre un explorador de archivos en el que buscaremos nuestro archivo TXT y le daremos a aceptar.

En la salida de resultados (ventana de abajo a la izquierda en color azul) veremos entre comillas la dirección y el nombre del fichero que hemos señalado en el paso anterior. Ahora copiamos esa dirección entera y creamos un objeto con los datos de la siguiente forma:

nuestradireccion<-"COPIAR DIRECCIÓN COMPLETA DE LA RUTA Y DEL FICHERO"

Ahora en nuestradireccion se encuentran nuestras variables con nuestras observaciones. Este es un método relativamente rápido de leer nuestra información. Para comprobarlo ejecutamos nuestradireccion.

El siguiente paso es leer los datos contenidos en nuestradireccion de la siguiente manera:

nuestrosdatos<-read.table(nuestradireccion, header=TRUE)

Si ejecutamos nuestrodatostendremos que ver las variables y los valores de las observaciones. En este caso nuestrodatos es un dataframe que contiene varias variables con sus correspondientes observaciones.

Puedes ver con más calma esto que acabamos de hacer en el siguiente videotutorial (no se te olvide subscribirte al canal y darle al like…, y si le das a la campanita, la próxima vez que suba un vídeotutorial de R lo podrás ver nada más salir…):

Ahora vamos a hacer algo parecido pero utilizando otra aproximación y en este caso utilizando el fichero CSV delimitado por comas y fijando el directorio de trabajo. Vamos con ello:

Para fijar un directorio de trabajo lo hacemos mediante el comando setwd y para saber cuál es el directorio de trabajo en el que estamos actualmente lo hacemos por medio del comando getwd:

setwd(dir = "G:/R/MARKDOWN/BasicR/")#Aquí ponemos la dirección en la que se encuentran nuestros datos en el disco duro
getwd ()
## [1] "G:/R/MARKDOWN/BasicR"

Ahora en esa dirección se encuentra nuestro fichero CSV, toca poder leerlo, para ello:

setwd(dir = "G:/R/MARKDOWN/BasicR/")#Aquí ponemos la dirección en la que se encuentran nuestros datos en el disco duro
mis.datos<-read.table(file="prueba.csv")
mis.datos
##                    V1
## 1  time;Dose;activity
## 2             24;0;24
## 3           24;1;25.4
## 4             24;2;56
## 5             24;3;25
## 6             24;4;24
## 7             24;5;89
## 8             24;6;78
## 9             24;7;89
## 10            24;8;99
## 11            48;0;55
## 12            48;1;89
## 13            48;2;80
## 14            48;3;99
## 15           48;4;101
## 16           48;5;102
## 17           48;6;100
## 18           48;7;115
## 19           48;8;110
## 20            72;0;24
## 21            72;1;89
## 22           72;2;100
## 23           72;3;102
## 24           72;4;101
## 25           72;5;104
## 26           72;6;105
## 27           72;7;120
## 28           72;8;115

Fijaros que nuestro dataframe mis.datos no se parece mucho a lo que hemos creado en Excel. El problema es que hay que darle más información a R para que lea los datos tal como nosotros queremos. Lo solucionamos del siguiente modo:

setwd(dir = "G:/R/MARKDOWN/BasicR/")#Aquí ponemos la dirección en la que se encuentran nuestros datos en el disco duro
mis.datos2 <- read.table(file="prueba.csv", sep = ";", dec=".", header=TRUE)
mis.datos2
##    time Dose activity
## 1    24    0     24.0
## 2    24    1     25.4
## 3    24    2     56.0
## 4    24    3     25.0
## 5    24    4     24.0
## 6    24    5     89.0
## 7    24    6     78.0
## 8    24    7     89.0
## 9    24    8     99.0
## 10   48    0     55.0
## 11   48    1     89.0
## 12   48    2     80.0
## 13   48    3     99.0
## 14   48    4    101.0
## 15   48    5    102.0
## 16   48    6    100.0
## 17   48    7    115.0
## 18   48    8    110.0
## 19   72    0     24.0
## 20   72    1     89.0
## 21   72    2    100.0
## 22   72    3    102.0
## 23   72    4    101.0
## 24   72    5    104.0
## 25   72    6    105.0
## 26   72    7    120.0
## 27   72    8    115.0

Básicamente tenemos que decirle que con ; se separan los valores, que nuestro símbolo de decimal es el . y que los encabezados representan variables (ojo puede que en algún ordenador el decimal sea la coma).

En casa tranquilamente te puedes ver este videotutorial para saber cómo importar ficheros Excel, es relativamente sencillo. De paso aprendes a instalar paquetes en R y a ejecutarlos. Esto último es importante para determinadas cosas que hagamos con R:

4 ¿Cómo son nuestras observaciones? ¿y nuestras variables?

Yo lo hago con mis datos, pero vosotros lo tenéis que hacer con vuestro fichero generado en el seminario. Empezamos:

setwd(dir = "G:/R/MARKDOWN/BasicR/")#Aquí ponemos la dirección en la que se encuentran nuestros datos en el disco duro
mis.datos3<-read.table(file="prueba.csv", sep = ";", dec=".", header=TRUE)
mis.datos3
##    time Dose activity
## 1    24    0     24.0
## 2    24    1     25.4
## 3    24    2     56.0
## 4    24    3     25.0
## 5    24    4     24.0
## 6    24    5     89.0
## 7    24    6     78.0
## 8    24    7     89.0
## 9    24    8     99.0
## 10   48    0     55.0
## 11   48    1     89.0
## 12   48    2     80.0
## 13   48    3     99.0
## 14   48    4    101.0
## 15   48    5    102.0
## 16   48    6    100.0
## 17   48    7    115.0
## 18   48    8    110.0
## 19   72    0     24.0
## 20   72    1     89.0
## 21   72    2    100.0
## 22   72    3    102.0
## 23   72    4    101.0
## 24   72    5    104.0
## 25   72    6    105.0
## 26   72    7    120.0
## 27   72    8    115.0

mis.datos3es un dataframe que contiene mis variables y las correspondientes observaciones de las mismas.

Ahora vamos a ver la estructura de nuestros datos ¿Qué variables contiene? ¿cómo son esas variables? ¿cualitativas? ¿cuantitativas? ¿son un factor? etc.

Mostremos el nombre las variables:

colnames(mis.datos3)
## [1] "time"     "Dose"     "activity"

Ahora la naturaleza de cada una de esas variables y el número de observaciones:

str(mis.datos3)
## 'data.frame':    27 obs. of  3 variables:
##  $ time    : int  24 24 24 24 24 24 24 24 24 48 ...
##  $ Dose    : int  0 1 2 3 4 5 6 7 8 0 ...
##  $ activity: num  24 25.4 56 25 24 89 78 89 99 55 ...
¿Qué tal?¿ya lo vas pillando?

5 ¿Cómo pueden ser nuestras variables en R?

Tipos de datos en R
Tipo Definición
Numeric números decimales y enteros
Integer números sin decimales
Character texto
Factor datos categóricos. Un factor
Logical verdadero o falso

6 ¿Cómo podemos cambiar la naturaleza de una variable?

En ocasiones nuestras variables no son como nosotros necesitamos. Veamos como se cambia una variable de caracter númerico a factor.

ahorafactor<-factor(enmisdatos$time)
levels(time)

Con la orden anterior se crea un vector (una lista de datos) que se llama ahorafactor que contiene la variables time contenida en enmisdatos y que no era tomada por R como un factor. Ahora si quiero hacer un análisis estadístico en los que necesite un factor debo utilizar ahorafactor en lugar del time original de mis datos.

Puedo hacer algo parecido modificiando enmisadatos el time, de la siguiente manera (esto es más directo, pero modifica el dataframe con el que estamos trabajando):

enmisdatos$time<-as.factor(enmisdatos$time)

Con lo anterior la variable time se transforma ahora en un factor. Recuerda que para comprobar si se ha hecho bien habría que ver cómo es la naturaleza de las variables de mis datos ¿sabes cómo se hace eso?

7 ¿Cómo introduzco una nueva variable en mis datos originales?

Imagina que necesitas incluir una nueva variable. Si no sabes hacerlo en R deberías ir directamente a Excel, cambiarlo y repetir todo el proceso que estes haciendo en R. Una forma de solucionar esto es incluir una nueva variable directamente en mi dataframe o datos originales con los que estoy trabajando en R. Veamos cómo se hace.

Imaginaros que tengo un dataframe que se llama enmisdatos con dos variables que tienen 9 observaciones. Quiero introducir una nueva variable que sea un factor con tres niveles (A, B y C). Ese factor lo llamaré zona. Para ello puedo hacer lo siguiente:

enmisdatos$zona <- c("A", "A", "A", "B", "B", "B", "C", "c", "C")

Ahora mi dataframe enmisdatos tiene una nueva variable que se llama zona con 9 observaciones. Al ser letras lo más seguro es que R lo tome como un factor, en este caso con tres niveles.

Utilizemos str para ver si lo ha hecho bien:

str(enmisdatos)

8 ¿Cómo crear una nueva variable calculada a partir de variables ya existentes?

Por ejemplo, vamos a multiplicar el peso por la altura, crearemos una nueva variable llamada peso_altura. Aquí os pongo un ejmeplo que servirá de ayuda:

setwd(dir = "G:/R/MARKDOWN/BasicR/")
mis.nuevosdatos <- read.table(file="prueba.csv", sep = ";", dec=".", header=TRUE)
str(mis.nuevosdatos)
## 'data.frame':    27 obs. of  3 variables:
##  $ time    : int  24 24 24 24 24 24 24 24 24 48 ...
##  $ Dose    : int  0 1 2 3 4 5 6 7 8 0 ...
##  $ activity: num  24 25.4 56 25 24 89 78 89 99 55 ...
#Con todo lo anterior cargo mi dataframe

#Ahora incluyo la nueva variable calculada
mis.nuevosdatos$nueva<-mis.nuevosdatos$time*mis.nuevosdatos$Dose

#Veamos si aparece
str(mis.nuevosdatos)
## 'data.frame':    27 obs. of  4 variables:
##  $ time    : int  24 24 24 24 24 24 24 24 24 48 ...
##  $ Dose    : int  0 1 2 3 4 5 6 7 8 0 ...
##  $ activity: num  24 25.4 56 25 24 89 78 89 99 55 ...
##  $ nueva   : int  0 24 48 72 96 120 144 168 192 0 ...

Se pueden hacer muchos cálculos diferentes. Por ejemplo:

mis.nuevosdatos$suma<-mis.nuevosdatos$time+mis.nuevosdatos$Dose

#Veamos si aparece
str(mis.nuevosdatos)
## 'data.frame':    27 obs. of  5 variables:
##  $ time    : int  24 24 24 24 24 24 24 24 24 48 ...
##  $ Dose    : int  0 1 2 3 4 5 6 7 8 0 ...
##  $ activity: num  24 25.4 56 25 24 89 78 89 99 55 ...
##  $ nueva   : int  0 24 48 72 96 120 144 168 192 0 ...
##  $ suma    : int  24 25 26 27 28 29 30 31 32 48 ...

9 Quiero cambiar el nombre de mis variables ¿cómo lo hago?

Con la orden colnames podemos renombrar los nombres de las variables de nuestro dataframe. En este ejemplo las voy a poner todas en español y en minúsculas evitando los acentos. De la siguiente manera:

colnames(mis.datos2) <- c('tiempo', 'dosis', 'actividad', 'letra','numero','calculada','condicionada')

En este caso el dataframe tiene 7 variables, los nuevos nombres aparecen en el vector que he creado (el de la c con los nombres entre comillas).

10 Representaciones gráficas sencillas

10.1 BoxPlot

La interpretación de un BoxPlot no es muy compleja. La línea de dentro de la caja representa la mediana, la caja representa en la parte inferior el cuartil 1 y el cuartil 3, es decir el 50% de los valores de la variable se encuentran dentro de la caja, y las barras representan el valor máximo y mínimo sin los outliers, que son los puntos negros.

Vamos a representar la altura de los chicos y de las chicas. En este caso utilizaremos un Boxplot. Aquí la variable cuantitativa contínua (altura) se representará en función de la variable categórica sexo (un factor con dos niveles). Aseguraros que vuestra variable sex es realmente un factor.

Aquí os pongo un ejemplo con otros datos. Fijaros bien en los diferentes aspectos que aparecen en el script:

#Cargo mis datos:
setwd(dir = "G:/R/MARKDOWN-ggplot2/boxplot")
datos<-read.table("boxplot.csv", sep = ";", header = TRUE, dec = ".")
datos
##    Treatment Var1 Var2
## 1          1  0.9 0.20
## 2          1  2.3 0.30
## 3          1  3.5 0.40
## 4          1  4.5 0.50
## 5          1  6.9 0.20
## 6          1  8.7 0.40
## 7          1  5.4 0.40
## 8          1  3.9 1.00
## 9          1  6.3 0.90
## 10         1  8.1 0.80
## 11         2  0.0 0.90
## 12         2  0.0 0.80
## 13         2  4.0 0.90
## 14         2  5.0 1.20
## 15         2 12.9 1.30
## 16         2  8.0 1.30
## 17         2  9.0 1.20
## 18         2  8.0 1.40
## 19         2  0.0 2.00
## 20         2  9.0 2.00
## 21         3  9.0 3.20
## 22         3  8.0 3.40
## 23         3  7.8 4.50
## 24         3  8.9 5.60
## 25         3 12.0 6.50
## 26         3  2.0 5.40
## 27         3 12.0 4.50
## 28         3 11.0 6.40
## 29         3 14.0 6.70
## 30         3  3.0 6.90
## 31         4 45.0 9.00
## 32         4 54.0 9.80
## 33         4 46.0 9.80
## 34         4 56.0 9.80
## 35         4 76.0 9.90
## 36         4 54.0 9.00
## 37         4 54.0 7.00
## 38         4 34.0 8.00
## 39         4 45.0 9.00
## 40         4 44.0 6.00
## 41         5 22.0 6.80
## 42         5 43.0 9.00
## 43         5 36.0 9.00
## 44         5 37.0 9.90
## 45         5 30.0 9.89
## 46         5 33.0 9.90
## 47         5 32.0 6.90
## 48         5 34.0 9.90
## 49         5 69.0 9.99
## 50         5 72.0 9.80

Ahora representaré la Var1 en función del Treatment:

#Transformo en factor la variable Treatment (comprobar si en vuestro caso es o no necesario):
datos$Treatment<-factor(datos$Treatment)#transformamos una variable númerica en un factor categórico

Lo represento de forma sencilla con R base:

boxplot(Var1~Treatment, data = datos)

Ahora sobre esta figura se puede ir completando y mejorando, incluyendo nombre de los ejes, colores para cada nivel del tratamiento, etc.

Vamos a ponerle nombres a los ejes:

boxplot(Var1~Treatment, data = datos, xlab="Tratamientos aplicados", ylab="Unidades utilizadas")

Vamos a cambiar los nombres de los niveles del factor:

#creamos un objeto con los nombres que vamos a utilizar en ligar de los números que aparecen:
nombres<-c("primero","segundo","tercero","cuarto","quinto")

boxplot(Var1~Treatment, data = datos, xlab="Tratamientos aplicados", ylab="Unidades utilizadas", names=nombres)

Para terminar esta parte le vamos a dar un color diferente a cada nivel del factor:

boxplot(Var1~Treatment, data = datos, xlab="Tratamientos aplicados", ylab="Unidades utilizadas", names=nombres, col = c("blue","red","green","white","darkgreen"))

Algo un poco más complicado. Representamos una variable dependiente en función de dos factores.

nuestradireccion<-"G:\\R\\MARKDOWN-Clases\\CursoR\\datos.csv"
nuestrosdatos<-read.table(nuestradireccion, header=TRUE, sep = ";", dec=".")
nuestrosdatos
##    altura peso edad sexo      ciudad
## 1    1.67   60   22    1    Alicante
## 2    1.87   95   23    0    Valencia
## 3    1.89   99   25    0      Madrid
## 4    1.69   68   26    0      Madrid
## 5    1.88   75   29    0 Guadalajara
## 6    1.98   99   28    0     Vitoria
## 7    1.67   79   31    0      Madrid
## 8    1.79   84   29    1    Alicante
## 9    1.88   88   24    0      Madrid
## 10   1.75   80   26    1 Guadalajara
## 11   1.67   60   22    1    Alicante
## 12   1.87   95   23    0    Alicante
## 13   1.89   99   25    0      Madrid
## 14   1.69   68   26    1      Madrid
## 15   1.88   75   29    0 Guadalajara
## 16   1.98   99   28    0     Vitoria
## 17   1.67   79   31    0      Madrid
## 18   1.79   84   29    1    Alicante
## 19   1.88   88   24    0      Madrid
## 20   1.75   80   26    1 Guadalajara
## 21   1.76   60   22    1    Alicante
## 22   1.78   95   23    0    Valencia
## 23   1.98   99   25    0      Madrid
## 24   1.96   68   26    1      Madrid
## 25   1.88   75   29    0 Guadalajara
## 26   1.89   99   28    1     Vitoria
## 27   1.76   79   31    0      Madrid
## 28   1.97   80   39    1    Alicante
## 29   1.88   88   24    0      Madrid
## 30   1.65   80   26    1 Guadalajara
## 31   1.76   65   22    1    Alicante
## 32   1.78   85   32    0    Valencia
## 33   1.98  100   25    0      Madrid
## 34   1.96   89   26    1      Madrid
## 35   1.88   75   28    0 Guadalajara
## 36   1.95   99   28    0     Vitoria
## 37   1.75   75   31    0      Madrid
## 38   1.79   80   29    0    Alicante
## 39   1.89   89   25    0      Madrid
## 40   1.59   55   26    1 Guadalajara
str (nuestrosdatos)
## 'data.frame':    40 obs. of  5 variables:
##  $ altura: num  1.67 1.87 1.89 1.69 1.88 1.98 1.67 1.79 1.88 1.75 ...
##  $ peso  : int  60 95 99 68 75 99 79 84 88 80 ...
##  $ edad  : int  22 23 25 26 29 28 31 29 24 26 ...
##  $ sexo  : int  1 0 0 0 0 0 0 1 0 1 ...
##  $ ciudad: chr  "Alicante" "Valencia" "Madrid" "Madrid" ...
ahorafactor<-factor(nuestrosdatos$ciudad)
boxplot(altura~sexo*ciudad, data=nuestrosdatos,par(cex.axis=0.5))

10.2 Gráfico de Dispersión (Scatterplot)

Muy adecuado para representar la relación entre dos variable cuantitativas. En nuestro caso podemos representar la relación entre el peso y la altura.

Yo voy a hacerlo para la Var1 y Var2 de mi ejemplo:

plot(datos$Var1, datos$Var2, main="Gráfico de Dispersión",
   xlab="Var1", ylab="Var2", pch=2, col="blue")

Con pch indicamos el tipo de símbolo que queremos, estos son los que hay:

Podemos agregar una línea de tendencia con abline. En este caso el orden de las variables importa:

plot(datos$Var1, datos$Var2, main="Gráfico de Dispersión",
   xlab="Var1", ylab="Var2", pch=2, col="blue")
abline(lm(Var2 ~ Var1, data = datos),col="red")

10.3 Histograma

Un gráfico sencillo, que muestra frecuencias para un rango de categorías. Se puede elegir alguna de vuestras variables e intentad la representación de un histograma. Seguid los códigos del siguiente ejemplo:

hist(datos$Var1, col = "darkgreen", main="Ejemplo de histograma")

Podemos cambiar los intervalos en los que se cuentan las frecuencias de la variable, para eso utilizamos breaks. Puedes probar con varios valores con tus datos:

par(mfrow=c(2,2))
hist(datos$Var1, col = "green", breaks = 10, main="con 10", xlab="Intervalos")
hist(datos$Var1, col = "green", breaks = 30, main="con 30", xlab="Intervalos")
hist(datos$Var1, col = "green", breaks = 60, main="con 60", xlab="Intervalos")
hist(datos$Var1, col = "green", breaks = 100, main="con 100", xlab="Intervalos")

11 Análisis Estadísticos

11.1 t Student

¿Son más altas las mujeres que los hombres?

Primero representa gráficamente la altura de los hombres y de las mujeres por medio de un Boxplot. ¿Qué pinta tienen los datos? ¿Pueden ser esas diferencias debidas al azar o es que el género influye en la altura de la población? En nuestro caso el factor género tiene dos niveles. Para responder a esta pregunta podemos utilizar una t de Student. Básicamente este test compara si la media de dos poblaciones con distribución normal son iguales o no. Por ello requiere de la normalidad de los datos antes de aplicar el test. En nuestro caso nos centraremos en cómo hacer el test sin comprobar previamente este punto.

¿Cómo lo hacemos?

Se puede hacer de dos formas: 1) Una es con una variable factor con dos niveles, la cual nos va a indicar para la variable dependiente que queremos comparar qué valores corresponden a cada categoría (en nuestro caso sería esta opción, ya que tenemos una variable sex y otra altura) 2) Cada conjunto de valores a comparar se encuentra en una columna (es decir, tendríamos una columna con la altura de las chicas y otra con la altura de los chicos)(no vamos a ver esta opción, pero la forma de ejecutarlo sería muy parecida pero en lugar de ~ usaríamos la , separando las dos variables a comparar)

setwd(dir = "G:/R/MARKDOWN-Clases/CursoR")
datosttest<-read.table("ttest.csv", sep = ";", header = TRUE, dec = ".")
datosttest
##    altura tipo
## 1      10    A
## 2      13    A
## 3      15    A
## 4      14    A
## 5      19    A
## 6      25    A
## 7      26    A
## 8      28    A
## 9      24    A
## 10     24    A
## 11     35    B
## 12     26    B
## 13     29    B
## 14     18    B
## 15     19    B
## 16     21    B
## 17     21    B
## 18     22    B
## 19     35    B
## 20     36    B
str (datosttest)
## 'data.frame':    20 obs. of  2 variables:
##  $ altura: int  10 13 15 14 19 25 26 28 24 24 ...
##  $ tipo  : chr  "A" "A" "A" "A" ...

Fijaros que tipo no es un factor, hay que cambiar su naturaleza:

ahoraesfactor<-factor(datosttest$tipo)
levels(ahoraesfactor)
## [1] "A" "B"

El objeto ahoraesfactor contiene nuestro factor con dos niveles. Este lo usaremos para indicarle a R en nuestra variable altura quién es chico y quién es chica. Vamos a hacer el t.test:

t.test(datosttest$altura ~ ahoraesfactor)
## 
##  Welch Two Sample t-test
## 
## data:  datosttest$altura by ahoraesfactor
## t = -2.1239, df = 17.821, p-value = 0.04794
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -12.73528851  -0.06471149
## sample estimates:
## mean in group A mean in group B 
##            19.8            26.2

¿Sabrías interpretar el resultado? ¿Corresponde a lo que muestra el BoxPlot de la altura en función del género? ¿Son las chicas más altas que los chicos? ¿Se debe al azar?

11.2 U-Mann Whitney

Si nuestros datos son no normales, el equivalente no paramétrico a la t de student es la U de Mann Whitney (=Wilcox.test), para hacerla tenemos que separar nuestros grupos en dos columnas (altura de las chicas es una variable y la altura de los chicos es otra variable). Esto lo podemos hacer de forma más sencilla seleccionando aquellos valores que cumplan una condición determinada. En mi ejemplo A y B.

mujer<-datosttest[datosttest$tipo == 'A',]
hombre<-datosttest[datosttest$tipo == 'B',]
wilcox.test(mujer$altura,hombre$altura, correct=FALSE, exact=FALSE, paired=FALSE)
## 
##  Wilcoxon rank sum test
## 
## data:  mujer$altura and hombre$altura
## W = 28, p-value = 0.09568
## alternative hypothesis: true location shift is not equal to 0

11.3 ANOVA

Similar a la t de student, pero en este caso comparamos una variable dependiente entra tres o más niveles de un factor. Tal vez en vuestra base de datos existan más de dos ciudades, ¿tal vez se pueda comparar la altura de los estudiantes entre tres o más ciudades? Recuerda que necesitamos una variable factor (ciudad) y la variable dependiente (altura).

Veamos cómo hacerlo:

setwd(dir = "G:/R/MARKDOWN-Clases/CursoR")
datosanova<-read.table("anova.csv", sep = ";", header = TRUE, dec = ".")
datosanova
##    altura tipo
## 1      10    A
## 2      13    A
## 3      15    A
## 4      14    A
## 5      19    A
## 6      25    A
## 7      26    A
## 8      28    A
## 9      24    A
## 10     24    A
## 11     35    B
## 12     26    B
## 13     29    B
## 14     18    B
## 15     19    B
## 16     21    B
## 17     21    B
## 18     22    B
## 19     35    B
## 20     36    B
## 21    121    C
## 22    100    C
## 23     99    C
## 24     98    C
## 25     56    C
## 26     68    C
## 27     85    C
## 28     80    C
## 29     65    C
## 30     64    C
str (datosanova)
## 'data.frame':    30 obs. of  2 variables:
##  $ altura: int  10 13 15 14 19 25 26 28 24 24 ...
##  $ tipo  : chr  "A" "A" "A" "A" ...
ahorafactor<-factor(datosanova$tipo)
levels(ahorafactor)
## [1] "A" "B" "C"

De nuevo este test requiere normalidad de los datos.

ahorafactor<-factor(datosanova$tipo)
levels(ahorafactor)
## [1] "A" "B" "C"
modelo <- lm(datosanova$altura~ahorafactor)
anovaModelo <- anova(modelo)
anovaModelo
## Analysis of Variance Table
## 
## Response: datosanova$altura
##             Df  Sum Sq Mean Sq F value    Pr(>F)    
## ahorafactor  2 24687.2 12343.6  71.219 1.705e-11 ***
## Residuals   27  4679.6   173.3                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Si representamos la altura en función de la ciudad podremos interpretar mejor nuestros resultados (utiliza tus datos para ver que sucede):

boxplot(datosanova$altura~ahorafactor, xlab="Tipo", ylab="altura", col = c("blue","red","green"))

11.4 Kruskal-Wallis

Si en la situación anterior nuestros datos son no normales entonces optamos por este análisis.

kruskal.test(altura ~ ahorafactor, data = datosanova)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  altura by ahorafactor
## Kruskal-Wallis chi-squared = 20.627, df = 2, p-value = 3.319e-05

11.5 Testar normalidad

Se puede hacer de tres formas diferentes. En casa con calma lo puedes hacer:

Normalidad

12 Información en la Web de utilidad para empezar en R

Puedes hacer muchos análisis diferentes. Aquí en mi web tienes vídeotutoriales, scripts, etc. para aprender muchos aspectos diferentes con R:

Web R Álvaro Alonso

Para empezar desde lo muy básico:

Primeros pasos en R - Javier Álvarez Liébana

R para principiantes - Emmanuel Paradis

Vídeotutoriales de todo tipo:

Docencia Universitaria en Ciencias-Varios Profesores UAH-Ecología y Matemáticas

Vídeotutoriales con R y Excel en mi canal de Youtube:

Youtube

ANOVA y KRUSKAL-WALLIS:

ANOVA y KRUSKAL-WALLIS

t de Student pareada y no pareada:

t de Student

Testar la normalidad:

Normalidad

13 CRÉDITOS


Álvaro Alonso Fernández

Departamento de Ciencias de la Vida

Unidad Docente de Ecología

Universidad de Alcalá (España)

La disponibilidad de información para el uso de R en internet es muy elevada. Si se quiere aprender lo básico de forma autónoma es simplemente una cuestión de dedicarle tiempo, ganas y esfuerzo. Que nadie pretenda saber R con una par de clases….