En el ordenador del aula es necesario usar MISO y alguna de las versiones que se indican. (por ejemplo, Rstudio 1.1 + R 3.6.1)
R: Se trata de un programa y lenguaje de programación que nos permitirá hacer los cálculos y gráficas necesarias. Para ello debemos escribir el código que queremos ejecutar. Está disponible en: https://cloud.r-project.org/
Este es el aspecto de R:
RStudio: Es un interfaz de R que permite que algunos pasos de nuestros análisis puedan realizarse sin la necesidad de escribir código (en lugar de eso, haciendo click con el ratón en botones y menús desplegables). Está disponible en: https://rstudio.com/products/rstudio/download/
Este es el aspecto de Rstudio:
Podemos hacerlo de tres maneras diferentes. La primera es usando RStudio y la segunda es directamente con R. En ambos casos es necesario que conozcas la carpeta en la que están tus datos dentro de tu ordenador para poder acceder a ellos. Si en el futuro vuelves a utilizar R para analizar datos, deberás seguir uno de estos métodos. La tercera manera de cargar los datos en tu ordenador es leerlos directamente de internet. En este caso no necesitarás conocer la carpeta en la que están tus datos, pero sólo te servirá para datos que estén en internet (y que conozcas la dirección para descargarlos). Veamos cada método:
Los datos recogidos en la salida de campo de este año han sido recopilados y se encuentran accesibles en PRADO, concretamente en la carpeta Datos para las prácticas. Los datos de cada práctica se encuentran en un excel independiente, en el que puedes ver las distintas variables medidas en el campo como columnas. Cada excel tiene una o varias columnas con el fondo gris, que se corresponden con variables que hemos generado a partir de las variables medidas. Por ejemplo, en la práctica 1 se contaron tricomas para tres hojas (TH01 a TH03) y hemos calculado ahora el valor medio de los mismos (Tmedia). A continuación se muestra un pantallazo de los tres excels:
Debes descargar los tres excels a una carpeta del ordenador, recordando la ruta completa de dicha carpeta (por ejemplo C:/Users/Windows/Descargas)
R se ejecuta por defecto en una carpeta de tu ordenador y es
recomendable que el primer paso sea decirle a R que se ejecute la misma
carpeta en la que tienes tus datos. Para ello:
Navegando a través del menú podrás seleccionar la manera de leer datos desde un excel
Ahora debes elegir el archivo que quieres leer (escribiendo la ruta o eligiéndola tras darle a “explorar” (o Browse). Debes asignarle un nombre a la tabla para poder llamarla y trabajar con ella. El nombre se asigna en la caja “Name:” y debes usar Practica1, Practica2 y Practica3 para cada uno de los excel. Muy importante: ten cuidado con las mayúsculas y símbolos usados en el nombre ya que para referirte a una tabla debes hacerlo con su nombre exacto. Es decir, si llamas a “practica1” o a “Practica-1” vas a recibir un error, porque no hay nada que se llame así, si no que es “Practica1”. Es muy importante también que especifiques que la primera fila es el nombre de las columnas (First Row as Names)
Una vez leídos, podrás visualizar los datos en RStudio pinchando en la pestaña correspondiente (en el cuadrante de arriba a la izquierda)
Los datos recogidos en la salida de campo de este año han sido recopilados y se encuentran accesibles en PRADO, concretamente en la carpeta Datos para las prácticas. Los datos de cada práctica se encuentran en un excel independiente, en el que puedes ver las distintas variables medidas en el campo como columnas. Cada excel tiene una o varias columnas con el fondo gris, que se corresponden con variables que hemos generado a partir de las variables medidas. Por ejemplo, en la práctica 1 se contaron tricomas para tres hojas (TH01 a TH03) y hemos calculado ahora el valor medio de los mismos (Tmedia). A continuación se muestra un pantallazo de los tres excels:
Debes descargar los tres excels a una carpeta del ordenador, recordando la ruta completa de dicha carpeta (por ejemplo C:/Users/Windows/Descargas)
R se ejecuta por defecto en una carpeta de tu ordenador y es
recomendable que el primer paso sea decirle a R que se ejecute la misma
carpeta en la que tienes tus datos. Para ello hay que usar la función
setwd("ruta/en/tu/ordenador"). Suponiendo que la ruta en tu
ordenador es “C:/Users/Windows/Descargas”, deberás ejecutar:
setd("C:/Users/Windows/Descargas")
NOTA1: Ten en cuenta que la ruta debe estar entre comillas
NOTA2: Fíjate en la orientación de las barras (/) que es diferente de la que puedes ver en la ruta si estás usando Windos (\)
Para leer los datos de un archivo excel es necesario tener instalado y ejecutar el paquete “readxl”. Para hacerlo escribe:
install.packages("readxl")
library(readxl)
Ahora R puede leer los datos directamente desde un excel y para ello usamos la función read_excel y el nombre del excel que queremos leer. En concreto debemos escribir:
Practica1 <- read_excel("practica_1_2223.xlsx")
NOTA: Si obtienes un error como
Error: `path` does not exist: revisa que has escrito el
nombre del fichero correctamente y que el excel se encuentra en la
carpeta que has definido arriba (cuando usaste setwd())
El símbolo de la flecha (<-) hace que R guarde en memoria la tabla leída desde el excel y lo hará con el nombre que queramos asignarle. En este caso hemos generado un objeto llamado Practica1 que contiene los datos del excel. Si queremos ver los datos que hemos guardado podemos hacerlo símplemente escribiendo su nombre, lo que mostrará los valores en la consola:
Practica1
Otra opción es usar la función View(), que mostrará los datos en una ventana nueva y en forma de tabla:
View(Practica_1)
NOTA: En este caso estoy usando la ruta de los excel que me descargué en mi ordenador y que, seguramente, no coincidirá con tu ruta
Practica_1 <- read_excel("practica1_2223.xlsx")
Practica_2 <- read_excel("practica2_2223.xlsx")
Practica_3 <- read_excel("practica3_2223.xlsx")
Si los métodos anteriores te dan problemas puedes leer la tabla directamente desde internet. Este método te servirá para estas prácticas pero generalmente no será muy útil para analizar datos tuyos en el futuro:
datos<-read.csv(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/practica1_2223.csv"),sep=",",header=T)
Como se ha descrito antes, puedes ver el contenido del objeto que has generado escribiendo el nombre o usando View:
datos
View(datos)
Practica_1 <- read.csv(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/practica1_2223.csv"),sep=",",header=T)
Practica_2 <- read.csv(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/practica2_2223.csv"),sep=",",header=T)
Practica_3 <- read.csv(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/practica3_2223.csv"),sep=",",header=T)
Llegados a este punto, e independientemente del método elegido, ya
tenemos los datos listos para ser analizados. Para cada análisis debemos
usar diferentes variables de una misma tabla. Esto se puede hacer de
diferentes maneras, pero en nuesto caso puede ayudarnos usar la función
attach() sobre unos datos. Al usarla, haremos que R
reconozca las variables de esa tabla por sus nombres. Por ejemplo,
sabemos que en la Practica 1 hay una variable que se llama Tmedia. Si
intentamos obtener sus valores escribiendo su nombre, veremos un
error:
Tmedia
## [1] 0.0000000 0.6666667 0.6666667 0.3333333 0.0000000 0.0000000
## [7] 0.3333333 0.0000000 0.3333333 0.0000000 1.0000000 1.0000000
## [13] 1.0000000 0.6666667 2.3333333 1.0000000 1.6666667 1.3333333
## [19] 2.6666667 2.0000000 2.0000000 2.0000000 2.6666667 4.6666667
## [25] 4.6666667 15.0000000 5.0000000 0.0000000 0.3333333 0.3333333
## [31] 0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 1.0000000
## [37] 1.3333333 0.6666667 1.3333333 0.6666667 1.3333333 2.0000000
## [43] 2.0000000 1.0000000 2.0000000 2.6666667 2.0000000 1.6666667
## [49] 2.0000000 2.3333333 2.6666667 4.6666667 7.3333333 5.6666667
## [55] 5.6666667 1.0000000 1.0000000 1.0000000 2.0000000 1.3333333
## [61] 1.3333333 1.3333333 2.0000000 2.0000000 3.6666667 2.0000000
## [67] 2.0000000 1.6666667 2.3333333 2.6666667 3.3333333 5.3333333
## [73] 5.0000000 4.6666667 6.3333333 3.0000000 2.0000000 2.0000000
## [79] 1.3333333 3.6666667 4.3333333 4.0000000 4.3333333 4.0000000
## [85] 4.0000000 4.6666667 8.0000000 6.0000000 1.3333333 2.3333333
## [91] 1.6666667 2.6666667 3.3333333 3.3333333 2.3333333 4.3333333
## [97] 3.0000000 3.6666667 3.6666667 5.6666667 4.6666667 5.6666667
## [103] 4.0000000 12.0000000 7.0000000 3.3333333 3.0000000 3.6666667
## [109] 3.6666667 4.6666667 5.6666667 6.3333333 5.3333333 5.6666667
## [115] 6.6666667 7.3333333 13.6666667 2.6666667 10.6666667 4.3333333
## [121] 4.0000000 3.0000000 3.6666667 4.3333333 6.6666667 5.6666667
## [127] 10.6666667 5.6666667 5.6666667 5.0000000 5.3333333 5.3333333
## [133] 6.6666667 6.3333333 7.3333333 7.3333333 5.0000000 6.0000000
## [139] 6.0000000 10.6666667 7.6666667 5.6666667 5.3333333 8.0000000
## [145] 22.6666667 6.6666667 7.3333333 8.0000000 6.6666667 13.3333333
## [151] 14.0000000 13.0000000 11.3333333 16.3333333 12.3333333 0.3333333
## [157] 0.3333333 0.3333333 2.3333333 2.6666667 1.3333333 6.6666667
## [163] 0.3333333 0.6666667 5.0000000 0.6666667 0.6666667 2.0000000
## [169] 1.0000000 2.0000000 3.0000000 3.0000000 0.3333333 1.6666667
## [175] 0.6666667 2.6666667 5.6666667 2.6666667 0.3333333 0.3333333
## [181] 2.3333333 4.0000000 1.6666667 2.6666667 2.0000000 1.3333333
## [187] 1.0000000 2.6666667 3.0000000 2.6666667 2.6666667 1.0000000
## [193] 3.6666667 1.6666667 1.6666667 1.0000000 5.3333333 4.0000000
## [199] 2.3333333 1.0000000 3.3333333 1.0000000 2.0000000 2.6666667
## [205] 3.0000000 3.3333333 2.0000000 6.0000000 1.3333333 3.6666667
## [211] 4.6666667 5.3333333 6.0000000 10.6666667 3.3333333 4.3333333
## [217] 3.6666667 5.6666667 6.6666667 3.6666667 3.3333333 3.6666667
## [223] 8.6666667 5.6666667 5.3333333 3.3333333 6.0000000 4.3333333
## [229] 5.3333333 5.3333333 5.6666667 3.3333333 5.0000000 7.3333333
## [235] 7.3333333 3.3333333 5.0000000 4.0000000 8.0000000 5.0000000
## [241] 5.0000000 19.0000000 4.3333333 3.6666667 6.0000000 10.0000000
## [247] 9.3333333 5.6666667 9.6666667 10.6666667 3.6666667 8.3333333
## [253] 3.3333333 11.3333333 5.0000000 6.0000000 5.3333333 4.0000000
## [259] 12.6666667 7.0000000 9.3333333 8.6666667 5.3333333 6.6666667
## [265] 11.6666667 7.6666667 4.6666667 5.6666667 12.3333333 6.0000000
## [271] 11.6666667 3.6666667 9.6666667 13.0000000 6.0000000 14.3333333
## [277] 13.0000000 6.6666667 15.0000000 10.6666667 14.6666667 16.6666667
## [283] 9.3333333 20.0000000 13.0000000 11.3333333 1.3333333 1.0000000
## [289] 0.3333333 6.0000000 5.3333333 4.0000000 6.3333333 4.3333333
## [295] 4.3333333 3.0000000 7.0000000 7.6666667 3.0000000 4.6666667
## [301] 5.3333333 8.6666667 11.6666667 13.3333333 11.3333333 10.6666667
## [307] 7.0000000
Sin embargo, si usamos attach…
attach (Practica_1)
## The following objects are masked _by_ .GlobalEnv:
##
## EXTFruct, Hmedia, Tmedia
… podremos llamar a esa variable.
Tmedia
## [1] 0.0000000 0.6666667 0.6666667 0.3333333 0.0000000 0.0000000
## [7] 0.3333333 0.0000000 0.3333333 0.0000000 1.0000000 1.0000000
## [13] 1.0000000 0.6666667 2.3333333 1.0000000 1.6666667 1.3333333
## [19] 2.6666667 2.0000000 2.0000000 2.0000000 2.6666667 4.6666667
## [25] 4.6666667 15.0000000 5.0000000 0.0000000 0.3333333 0.3333333
## [31] 0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 1.0000000
## [37] 1.3333333 0.6666667 1.3333333 0.6666667 1.3333333 2.0000000
## [43] 2.0000000 1.0000000 2.0000000 2.6666667 2.0000000 1.6666667
## [49] 2.0000000 2.3333333 2.6666667 4.6666667 7.3333333 5.6666667
## [55] 5.6666667 1.0000000 1.0000000 1.0000000 2.0000000 1.3333333
## [61] 1.3333333 1.3333333 2.0000000 2.0000000 3.6666667 2.0000000
## [67] 2.0000000 1.6666667 2.3333333 2.6666667 3.3333333 5.3333333
## [73] 5.0000000 4.6666667 6.3333333 3.0000000 2.0000000 2.0000000
## [79] 1.3333333 3.6666667 4.3333333 4.0000000 4.3333333 4.0000000
## [85] 4.0000000 4.6666667 8.0000000 6.0000000 1.3333333 2.3333333
## [91] 1.6666667 2.6666667 3.3333333 3.3333333 2.3333333 4.3333333
## [97] 3.0000000 3.6666667 3.6666667 5.6666667 4.6666667 5.6666667
## [103] 4.0000000 12.0000000 7.0000000 3.3333333 3.0000000 3.6666667
## [109] 3.6666667 4.6666667 5.6666667 6.3333333 5.3333333 5.6666667
## [115] 6.6666667 7.3333333 13.6666667 2.6666667 10.6666667 4.3333333
## [121] 4.0000000 3.0000000 3.6666667 4.3333333 6.6666667 5.6666667
## [127] 10.6666667 5.6666667 5.6666667 5.0000000 5.3333333 5.3333333
## [133] 6.6666667 6.3333333 7.3333333 7.3333333 5.0000000 6.0000000
## [139] 6.0000000 10.6666667 7.6666667 5.6666667 5.3333333 8.0000000
## [145] 22.6666667 6.6666667 7.3333333 8.0000000 6.6666667 13.3333333
## [151] 14.0000000 13.0000000 11.3333333 16.3333333 12.3333333 0.3333333
## [157] 0.3333333 0.3333333 2.3333333 2.6666667 1.3333333 6.6666667
## [163] 0.3333333 0.6666667 5.0000000 0.6666667 0.6666667 2.0000000
## [169] 1.0000000 2.0000000 3.0000000 3.0000000 0.3333333 1.6666667
## [175] 0.6666667 2.6666667 5.6666667 2.6666667 0.3333333 0.3333333
## [181] 2.3333333 4.0000000 1.6666667 2.6666667 2.0000000 1.3333333
## [187] 1.0000000 2.6666667 3.0000000 2.6666667 2.6666667 1.0000000
## [193] 3.6666667 1.6666667 1.6666667 1.0000000 5.3333333 4.0000000
## [199] 2.3333333 1.0000000 3.3333333 1.0000000 2.0000000 2.6666667
## [205] 3.0000000 3.3333333 2.0000000 6.0000000 1.3333333 3.6666667
## [211] 4.6666667 5.3333333 6.0000000 10.6666667 3.3333333 4.3333333
## [217] 3.6666667 5.6666667 6.6666667 3.6666667 3.3333333 3.6666667
## [223] 8.6666667 5.6666667 5.3333333 3.3333333 6.0000000 4.3333333
## [229] 5.3333333 5.3333333 5.6666667 3.3333333 5.0000000 7.3333333
## [235] 7.3333333 3.3333333 5.0000000 4.0000000 8.0000000 5.0000000
## [241] 5.0000000 19.0000000 4.3333333 3.6666667 6.0000000 10.0000000
## [247] 9.3333333 5.6666667 9.6666667 10.6666667 3.6666667 8.3333333
## [253] 3.3333333 11.3333333 5.0000000 6.0000000 5.3333333 4.0000000
## [259] 12.6666667 7.0000000 9.3333333 8.6666667 5.3333333 6.6666667
## [265] 11.6666667 7.6666667 4.6666667 5.6666667 12.3333333 6.0000000
## [271] 11.6666667 3.6666667 9.6666667 13.0000000 6.0000000 14.3333333
## [277] 13.0000000 6.6666667 15.0000000 10.6666667 14.6666667 16.6666667
## [283] 9.3333333 20.0000000 13.0000000 11.3333333 1.3333333 1.0000000
## [289] 0.3333333 6.0000000 5.3333333 4.0000000 6.3333333 4.3333333
## [295] 4.3333333 3.0000000 7.0000000 7.6666667 3.0000000 4.6666667
## [301] 5.3333333 8.6666667 11.6666667 13.3333333 11.3333333 10.6666667
## [307] 7.0000000
Para evitar problemas con nombres iguales en diferentes tablas, se recomienda cerrar esta conexión cuando hayamos acabado de trabajar con la tabla. Para ello:
detach (Practica_1)
Y ya no podemos acceder nuevamente a la variable.
Tmedia
## [1] 0.0000000 0.6666667 0.6666667 0.3333333 0.0000000 0.0000000
## [7] 0.3333333 0.0000000 0.3333333 0.0000000 1.0000000 1.0000000
## [13] 1.0000000 0.6666667 2.3333333 1.0000000 1.6666667 1.3333333
## [19] 2.6666667 2.0000000 2.0000000 2.0000000 2.6666667 4.6666667
## [25] 4.6666667 15.0000000 5.0000000 0.0000000 0.3333333 0.3333333
## [31] 0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 1.0000000
## [37] 1.3333333 0.6666667 1.3333333 0.6666667 1.3333333 2.0000000
## [43] 2.0000000 1.0000000 2.0000000 2.6666667 2.0000000 1.6666667
## [49] 2.0000000 2.3333333 2.6666667 4.6666667 7.3333333 5.6666667
## [55] 5.6666667 1.0000000 1.0000000 1.0000000 2.0000000 1.3333333
## [61] 1.3333333 1.3333333 2.0000000 2.0000000 3.6666667 2.0000000
## [67] 2.0000000 1.6666667 2.3333333 2.6666667 3.3333333 5.3333333
## [73] 5.0000000 4.6666667 6.3333333 3.0000000 2.0000000 2.0000000
## [79] 1.3333333 3.6666667 4.3333333 4.0000000 4.3333333 4.0000000
## [85] 4.0000000 4.6666667 8.0000000 6.0000000 1.3333333 2.3333333
## [91] 1.6666667 2.6666667 3.3333333 3.3333333 2.3333333 4.3333333
## [97] 3.0000000 3.6666667 3.6666667 5.6666667 4.6666667 5.6666667
## [103] 4.0000000 12.0000000 7.0000000 3.3333333 3.0000000 3.6666667
## [109] 3.6666667 4.6666667 5.6666667 6.3333333 5.3333333 5.6666667
## [115] 6.6666667 7.3333333 13.6666667 2.6666667 10.6666667 4.3333333
## [121] 4.0000000 3.0000000 3.6666667 4.3333333 6.6666667 5.6666667
## [127] 10.6666667 5.6666667 5.6666667 5.0000000 5.3333333 5.3333333
## [133] 6.6666667 6.3333333 7.3333333 7.3333333 5.0000000 6.0000000
## [139] 6.0000000 10.6666667 7.6666667 5.6666667 5.3333333 8.0000000
## [145] 22.6666667 6.6666667 7.3333333 8.0000000 6.6666667 13.3333333
## [151] 14.0000000 13.0000000 11.3333333 16.3333333 12.3333333 0.3333333
## [157] 0.3333333 0.3333333 2.3333333 2.6666667 1.3333333 6.6666667
## [163] 0.3333333 0.6666667 5.0000000 0.6666667 0.6666667 2.0000000
## [169] 1.0000000 2.0000000 3.0000000 3.0000000 0.3333333 1.6666667
## [175] 0.6666667 2.6666667 5.6666667 2.6666667 0.3333333 0.3333333
## [181] 2.3333333 4.0000000 1.6666667 2.6666667 2.0000000 1.3333333
## [187] 1.0000000 2.6666667 3.0000000 2.6666667 2.6666667 1.0000000
## [193] 3.6666667 1.6666667 1.6666667 1.0000000 5.3333333 4.0000000
## [199] 2.3333333 1.0000000 3.3333333 1.0000000 2.0000000 2.6666667
## [205] 3.0000000 3.3333333 2.0000000 6.0000000 1.3333333 3.6666667
## [211] 4.6666667 5.3333333 6.0000000 10.6666667 3.3333333 4.3333333
## [217] 3.6666667 5.6666667 6.6666667 3.6666667 3.3333333 3.6666667
## [223] 8.6666667 5.6666667 5.3333333 3.3333333 6.0000000 4.3333333
## [229] 5.3333333 5.3333333 5.6666667 3.3333333 5.0000000 7.3333333
## [235] 7.3333333 3.3333333 5.0000000 4.0000000 8.0000000 5.0000000
## [241] 5.0000000 19.0000000 4.3333333 3.6666667 6.0000000 10.0000000
## [247] 9.3333333 5.6666667 9.6666667 10.6666667 3.6666667 8.3333333
## [253] 3.3333333 11.3333333 5.0000000 6.0000000 5.3333333 4.0000000
## [259] 12.6666667 7.0000000 9.3333333 8.6666667 5.3333333 6.6666667
## [265] 11.6666667 7.6666667 4.6666667 5.6666667 12.3333333 6.0000000
## [271] 11.6666667 3.6666667 9.6666667 13.0000000 6.0000000 14.3333333
## [277] 13.0000000 6.6666667 15.0000000 10.6666667 14.6666667 16.6666667
## [283] 9.3333333 20.0000000 13.0000000 11.3333333 1.3333333 1.0000000
## [289] 0.3333333 6.0000000 5.3333333 4.0000000 6.3333333 4.3333333
## [295] 4.3333333 3.0000000 7.0000000 7.6666667 3.0000000 4.6666667
## [301] 5.3333333 8.6666667 11.6666667 13.3333333 11.3333333 10.6666667
## [307] 7.0000000
El primer paso de cualquier análisis es entender qué tipo de variables tenemos entre manos y revisar que no existen errores evidentes en la tabla de datos que hemos leído. Para esta práctica proporcionamos un fichero que ya ha sido revisado, pero las siguientes líneas te ayudarán a hacer estos pasos en caso de que los necesites en el futuro:
Para ver el tipo de variables:
str(tabla)
donde tabla es el nombre de la tabla que contiene tus datos y que ya has leído previamente.
El siguiente código te permitiría identificar valores mucho más altos o bajos de lo esperado en una tabla:
apply(tabla,2,range)
Veamos un ejemplo de aplicado a nuestra tabla de datos de la práctica 2 en la que se han insertado un par de errores:
tabla<-read.csv(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/Practica_2_Plasticidad_fenotipica_ERROR.csv"))
str(tabla)
## 'data.frame': 2747 obs. of 6 variables:
## $ IND : int 1 2 3 4 5 6 7 8 9 10 ...
## $ RIEGO : chr "CON" "CON" "CON" "CON" ...
## $ ALTURA : num 54 54 49 62301 45 ...
## $ NFRUTOS : num 0.56 37 12 30 4 28 48 51 46 39 ...
## $ NABORTOS: int 0 5 2 1 0 0 0 0 0 0 ...
## $ ExtFruct: num 1 0.88 0.86 0.97 1 1 1 1 1 1 ...
apply(tabla,2,range)
## IND RIEGO ALTURA NFRUTOS NABORTOS ExtFruct
## [1,] NA "CON" " 7.00" " 0.56" " 0" "0.09"
## [2,] NA "SIN" "62301.00" "169.00" "44" "1.00"
Como se ha descrito arriba, en cada práctica hemos generados variables que nos ayuden a responder las preguntas de cada una a partir de los datos originales. Aquí describimos qué transformaciones hemos hecho a los datos y cómo se pueden hacer con R:
Leemos los datos crudos desde una carpeta en internet
Practica1cruda<-read.csv(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/DatosCrudos2223_Practica1-Adaptacion.csv"),sep=",",header=T)
Necesitamos definir las variables:
Hmedia: Es valor medio de los valores de herbivoría obtenido para distintas hojas de cada individuo y se calcula:
Hmedia<-rowMeans(Practica1cruda[,c("HH01","HH02","HH03")])
Tmedia: Es el valor medio del número de tricomas contados en distintas hojas de cada individuo y se calcula:
Tmedia<-rowMeans(Practica1cruda[,c("TH01","TH02","TH03")])
EXTFruct: Es el éxito de fructificación, que es la suma de los frutos que se han formado con éxito (Número de frutos 1 y número de frutos 2) entre el máximo de frutos que podía haber formado (frutos1+frutos2+abortos1+abortos2):
EXTFruct<-(Practica1cruda$NFRUTOS01 + Practica1cruda$NFRUTOS02) / (Practica1cruda$NFRUTOS01 + Practica1cruda$NFRUTOS02 + Practica1cruda$ABORTOS01 + Practica1cruda$ABORTOS02)
Podemos pegar ahora estas variables junto con las iniciales:
Practica1<-cbind(Practica1cruda,Hmedia,Tmedia,EXTFruct)
Si queremos guardar esta tabla:
write.table(Practica1,file="Practica1.tsv",sep="\t",row.names=F)
Leemos los datos crudos desde una carpeta en internet
Practica2cruda<-read.csv(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/DatosCrudos2223_Practica2-PlasticidadFenotipica.csv"),sep=",",header=T)
Necesitamos definir la variable:
ExtFruct Es el éxito de fructificación, que es la suma de los frutos que se han formado con éxito (Número de frutos) entre el máximo de frutos que podía haber formado (frutos + abortos):
ExtFruct <- Practica2cruda$NFRUTOS / (Practica2cruda$NFRUTOS + Practica2cruda$NABORTOS)
Juntamos estas columnas con la tabla original y guardamos la tabla resultante:
write.table(cbind(Practica2cruda,ExtFruct),file="Practica2.tsv",sep="\t",row.names=F,quote=F)
Leemos los datos crudos desde una carpeta en internet
Practica3cruda<-read.csv(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/DatosCrudos2223_Practica3-SelNatural.csv"),sep=",",header=T)
Necesitamos definir las variables:
Extfruct: Es el éxito de fructificación, que es la suma de los frutos que se han formado con éxito (Número de frutos) entre el máximo de frutos que podía haber formado (frutos + abortos):
Extfruct <- Practica3cruda$NFRUTOS/(Practica3cruda$NFRUTOS+Practica3cruda$NABORTOS)
Totalpol: Es el número total de polinizadores, sumando todos los grupos funcionales observados:
Totalpol <- rowSums(Practica3cruda[,c("AB.G","AB.P","MAR","ESC","BOM","SIR","AVI","MUS","HOR","OTROS")])
Tubomedio: Es el valor medio por individuo de las distintas medidas de longitud de tubo de corola:
Tubomedio <- rowMeans(Practica3cruda[,c("TUBO.01","TUBO.02","TUBO.03","TUBO.04","TUBO.05")])
Diamedio: Es el valor medio por individuo de las distintas medidas de diámetro de corola:
Diamedio <- rowMeans(Practica3cruda[,c("DIAMETRO.01","DIAMETRO.02","DIAMETRO.03","DIAMETRO.04","DIAMETRO.05")])
Displayfloral: Es el número de flores abiertas que un individuo muestra a los polinizadores. Se calcula:
Displayfloral <- Practica3cruda$NFLORESABIERTAS * Practica3cruda$ESCAPOS
Juntamos estas columnas con la tabla original y guardamos la tabla resultante:
write.table(cbind(Practica3cruda,Extfruct,Totalpol,Tubomedio,Diamedio,Displayfloral),file="Practica3.tsv",sep="\t",row.names=F,quote=F)
Cuando queramos saber si dos variables continuas están asociadas (o covarían, o están relacionadas linealmente, o cambian conjuntamente a la misma tasa constante) se usa el análisis de correlación. El resultado de este análisis será un valor numérico entre -1 y 1. Valores muy cercanos a 0 nos indicarán una relación muy pobre entre las dos variables y un valor muy diferente de 0 indicará una relación muy fuerte (el signo + o - indica si ambas variables están correlacionadas de manera directa (es decir, al aumentar una también lo hace la otra) o inversa (es decir, al aumentar una la otra disminuye). Además del valor numérico de la correlación, podemos calcular un valor de p que nos informa acerca de si ese valor de correlación es significativamente diferente de 0. Como sabes, normalmente se usa el umbral del 95% para asumir significación. Es decir, que si el valor de p es menor que 0.05, asumiremos que la correlación observada (sea fuerte o débil) es significativamente distinta de 0. Para hacer un análisis de correlación en R:
cor.test(variable1, variable2, method = "pearson")
donde variable1 y variable2 son los nombres de las variables de las que nos interesa cuantificar la correlación. Una buena manera de entender si las variables covarían o no es representar gráficamente, obteniendo una gráfica de dispersión. Para ello podemos usar:
plot (variable1, variable2)
y de nuevo variable1 y variable2 son los nombres de las variables que estamos estudiando.
Para ejemplificar cada análisis vamos a utilizar un set de datos que te resulte familiar. Para ello lee el archivo de notas de Biología Evolutiva directamente de internet copiando la siguiente línea. Verás que la tabla contiene información sobre el Grupo (A, B, C, D), la nota de los exámenes de los dos primeros bloques y los puntos que esas calificaciones representan en la nota final. Además, aparece el último número del DNI o pasaporte (ID) de cada alumno:
ej<-read.table(url("http://www.ugr.es/~ajesusmp/BioEvo/Practicas/EjemploNotas.csv"),header=T,sep=",")
attach(ej)
ej[1,]
## Grupo Ultimo_ID ExamenB1 PuntosB1 ExamenB2 PuntosB2
## 1 B 0 30 2.77 20 3.69
Podemos preguntarnos:
1) ¿Existe relación entre el últmo número del ID y las calificaciones del Bloque 1?
cor.test(Ultimo_ID,ExamenB1)
##
## Pearson's product-moment correlation
##
## data: Ultimo_ID and ExamenB1
## t = 1.3585, df = 168, p-value = 0.1761
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.04701016 0.25082059
## sample estimates:
## cor
## 0.1042417
plot(Ultimo_ID,ExamenB1)
2) ¿Existe relación entre las calificaciones del Bloque 1 y del 2?
cor.test(ExamenB1,ExamenB2)
##
## Pearson's product-moment correlation
##
## data: ExamenB1 and ExamenB2
## t = 5.8052, df = 168, p-value = 3.132e-08
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.2751728 0.5268574
## sample estimates:
## cor
## 0.4087574
plot(ExamenB1,ExamenB2)
Este tipo de análisis nos permite contestar a preguntas como la pregunta 1 de la practica 1 - ¿Está asociada la densidad de tricomas con el grado de herbivoría?
Hasta ahora hemos estudiado como covarían dos variables, pero a veces queremos saber si una variable (la variable independiente, normalmente representada con la letra x) predice significativamente los valores de otra variable (variable dependiente, representada como y). En esos casos debemos realizar un análisis de regresión, de la siguiente manera:
lm (y ~x)
donde y es el nombre de nuestra variable dependiente y x es el nombre de nuestra variable independiente. Esto nos devolverá la ordenada en el origen y la pendiente de la regresión. En este tipo de análisis estamos asumiendo que el valor de y puede calcularse si sabemos el de x y aplicamos la fórmula:
y= ordenada en el origen + pendiente * x.
Para ver más detalles sobre la regresión calculada hay que escribir:
summary(lm (y ~x))
lo que nos devolverá, entre otra cosas, la significación de la regresión (el p-valor) y la calidad del ajuste (R², que oscila entre 0 y 1, indicando valores cercanos a 1 una mayor calidad de la regresión. El valor es el cuadrado de la regresión calculada en el análisis anterior.).
Además, podemos representar la línea de regresión sobre la gráfica de dispersión haciendo (CUIDADO: el orden de las variables para plot es primero la x y luego la y, pero para lm es primero la y y luego x) ):
# Esto pintará la gráfica de dispersión
plot (x, y)
# Y esto añadirá la línea de regresión
abline(lm(y~x))
cor.test(ExamenB1,ExamenB2)
##
## Pearson's product-moment correlation
##
## data: ExamenB1 and ExamenB2
## t = 5.8052, df = 168, p-value = 3.132e-08
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.2751728 0.5268574
## sample estimates:
## cor
## 0.4087574
summary(lm(ExamenB2~ExamenB1))
##
## Call:
## lm(formula = ExamenB2 ~ ExamenB1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.685 -13.832 1.012 16.489 38.967
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24.29808 7.35897 3.302 0.00117 **
## ExamenB1 0.56516 0.09735 5.805 3.13e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 21.21 on 168 degrees of freedom
## Multiple R-squared: 0.1671, Adjusted R-squared: 0.1621
## F-statistic: 33.7 on 1 and 168 DF, p-value: 3.132e-08
plot(ExamenB1,ExamenB2)
abline(lm(ExamenB2~ExamenB1))
IMPORTANCIA DE LA DISCUSIÓN
CORRELATION IS NOT CAUSATION
3) Existe relación entre la puntuación obtenida para el bloque B1 y la calificación del examen B1? Dirías que existe una depende de la otra?
summary(lm(PuntosB1~ExamenB1))
##
## Call:
## lm(formula = PuntosB1 ~ ExamenB1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.0046514 -0.0030554 0.0001365 0.0021566 0.0049244
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -8.842e-04 1.027e-03 -0.861 0.391
## ExamenB1 9.232e-02 1.359e-05 6793.062 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.002961 on 168 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: 1
## F-statistic: 4.615e+07 on 1 and 168 DF, p-value: < 2.2e-16
plot(ExamenB1,PuntosB1)
abline(lm(PuntosB1~ExamenB1))
Con este tipo de análisis podemos contestar a preguntas como la número 3 de la practica 1 - ¿Depende la tasa de fructificación de la densidad de tricomas?
Si queremos comparar los valores observados en una variable que se ha medido en dos grupos diferentes debemos realizar un análisis de diferencias de medias, o de la varianza, o t de Student. En los análisis de correlación y regresión hemos comparado siempre dos variables numéricas (y contínuas) pero ahora queremos comparar la respuesta de una variable numérica dependiente ‘varNum’ con un factor o variable categorica (‘varCat’).
t.test(varNum~varCat)
NOTA: Fíjate que, como en lm() debes poner
primero la variable dependiente (y) y después la independiente
(x)
De la salida de esta función podremos obtener, entre otras cosas, el p-valor de la diferencia analizada. La hipótesis nula de este análisis es que ambas medias son iguales, con lo que un valor de p<0.05 indicará que existen diferencias significativas entre los dos grupos observados.
Para visualizar las diferencias entre los grupos estudiados podemos usar un histograma con las medias de ambos. Hay muchas maneras de representar gráficas de barras en R. Una relativamente fácil es mediante la función ‘bargraph’ del paquete ‘sciplot’. Para instalarlo:
install.packages("sciplot")
Una vez instalado en tu ordenador podrás usarlo escribiendo: (alternativamente se puede hacer pinchando sobre ‘sciplot’ en la ventana de packages en Rstudio)
library(sciplot)
A partir de ahora (y hasta que cierres la ventana de R o RStudio) podrás usar cualquier función del paquete sciplot. (Si quieres usarlo otro día, deberás escribir library(sciplot) de nuevo).
Ahora generamos la grafica:
bargraph.CI(VarCat, VarNum)
Donde VarCat es la variable categórica (que contiene los grupos que queremos comparar) y VarNum es la variable numérica de la que queremos calcular y representar las medias.
4) Hay diferencia en la calificación del examen del Bloque 1 entre dos grupos (los que quieras)?
# El test de la t de student sólo permite comparar dos grupos, por lo que si lo intentas hacer de todo junto, obtendrás un error:
t.test(ExamenB1~Grupo)
## Error in t.test.formula(ExamenB1 ~ Grupo): grouping factor must have exactly 2 levels
# Para comparar el grupo A y B copia lo siguiente. Si quieres comparar otrs grupos, cambia A y B por lo deseado:
ej2<-ej[ej[,1]=="A"|ej[,1]=="B",]
t.test(ej2$ExamenB1~ej2$Grupo)
##
## Welch Two Sample t-test
##
## data: ej2$ExamenB1 by ej2$Grupo
## t = 1.186, df = 66.931, p-value = 0.2398
## alternative hypothesis: true difference in means between group A and group B is not equal to 0
## 95 percent confidence interval:
## -3.063774 12.035569
## sample estimates:
## mean in group A mean in group B
## 77.0500 72.5641
# El gráfico podemos hacerlo con todos los grupos...
bargraph.CI(Grupo,ExamenB1)
# ... o sólo con dos:
bargraph.CI(ej2$Grupo,ej2$ExamenB1)
Con este tipo de análisis podemos responder preguntas como la pregunta 1 de la practica 2 - ¿Influye el riego sobre la altura que alcanzan las plantas? En este caso la altura de la plantas es la variable numérica (y) y la variable “RIEGO” es la categórica (“con riego” o “sin riego”)
Ahora cerramos la conexión con los nombres de las variables de la tabla ej
detach(ej)
library(readxl)
Practica_1 <- read_excel("practica1_2223.xlsx")
attach(Practica_1)
## The following objects are masked _by_ .GlobalEnv:
##
## EXTFruct, Hmedia, Tmedia
Como ya hemos acabado el análisis de la práctica 1, cerramos la conexión con la tabla:
detach(Practica_1)
library(readxl)
Practica_2 <- read_excel("practica2_2223.xlsx")
attach(Practica_2)
## The following object is masked _by_ .GlobalEnv:
##
## EXTFruct
Como ya hemos acabado el análisis de la práctica 2, cerramos la conexión con la tabla:
detach(Practica_2)
library(readxl)
Practica_3 <- read_excel("practica3_2223.xlsx")
attach(Practica_3)
## The following object is masked _by_ .GlobalEnv:
##
## EXTFruct
Como ya hemos acabado el análisis de la práctica 3, cerramos la conexión con la tabla:
detach(Practica_3)