versión de trabajo (página principal)
Manuel Perea
Departament de Metodologia, Universitat de València
Para empezar
El programa R es una potentísima aplicación que permite gran libertad para efectuar todo tipo de cálculos. R es la versión de código libre del programa comercial S-Plus (S+) y está disponible en sistemas operativos como UNIX/Linux, Macintosh o Windows. R está en constante desarrollo y la última versión puede descargarse en internet, vía http://cran.r-project.org. Además, hay muchos sitios web con tutoriales o ejemplos a los que poder acudir en caso de dudas.
El único problema potencial para el usuario “final” es que R no es particularmente “user friendly” en el sentido de que funciona por comandos en lugar de menús. Esto puede hacer la tarea más difícil al principio, pero a la vez hemos de tener en cuenta que da mucha más versatilidad y potencia al programa. Además, como veremos, es sencillo efectuar ANOVAs con R. Esta página web no presende reflejar nada novedoso, simplemente se han recogido diversos ejemplos de ANOVAs entre-sujetos, intra-sujetos y mixtos que de manera más o menos completa puede encontrarse en internet en lengua inglesa; todo ello junto a la ventaja de tener la información disponible en castellano.
En los apartados siguientes me centraré en la versión para Linux., si bien la versión para Windows es muy similar y los comandos a efectuar son los mismos, con muy pocas excepciones (v.g., el dispositivo para grabar en disco los gráficos). (Los ejemplos han sido comprobados con R en su versión Windows y la apariencia del output es esencialmente la misma; al menos si no emplean los acentos en la variables; v.g., Genero en lugar de Género)
Una vez estás conectado a un ordenador con sistema operativo Linux (en este caso, el usuario “manolo” en la máquina “localhostmanolo”), lo único que has de hacer es escribir la letra R en la consola
Una vez pulses ENTER, esto es lo que aparecerá en la pantalla
El símbolo (>) indica que el ordenador está esperando comandos (el ordenador está listo para los análisis) y ya estamos preparados para el primer ejemplo
Ahora pulsa q() para salir y verás el mensaje
Dado que no tenemos nada de interés, en nuestro caso pulsa n y ENTER.
Ejemplo 1: ANOVA entre-sujetos unifactorial
Observa el Apéndice 1. Contiene los datos de un experimento en el que los participantes recibían una entre tres posibles dosis de una droga experimental, y tras la cual se medía el grado de vigilancia en una tarea. Naturalmente es importante, antes de analizar los datos, en poner los datos en un formato que R pueda procesar. Hay otras opciones, pero (por brevedad) vamos a examinar solamente una de ellas.
Conversión de archivos de texto (ASCII) a archivos de datos en R. Debéis de crear un archivo que contenga los datos (como los del Apéndice 1) y guardarlos en formato de texto. En Linux, esto se puede hacer con programas como emacs, Kwrite, OpenOffice o cualquier otro programa al efecto. Guardas el archivo en “home” , para simplicar. (Una vez tengas más experiencia, lo mejor es guardarlos en un directorio al efecto para tus datos.) El archivo tendrá el siguiente aspecto:
Observa que no es necesario incluir una columna indicando “Observación”, dado que es redundante. (pero puedes hacerlo, si quieres.) En R, cada línea individual recoge una y solo una observación. Esto también es cierto para los diseños intra-sujetos (lo que es diferente de la mayoría de aplicaciones estadísticas, como SPSS o Systat, en las que las filas reflejan datos de diferentes sujetos).
Cuando hayas introducido los datos (puedes emplear un espacio para separar los datos dentro de una fila), guarda el archivo como ej1.txt en tu directorio “home”. Y ahora pulsa R en tu consola. Te aparecerá de nuevo:
Para convertir el archivo ASCII en una archivo de R, emplea el comando read.table como sigue
o, si se quiere,
El primer término, ej1, indica el nombre del archivo en R que estamos creando. El primer argumento de read.table es el nombre del archivo ASCII que estamos convirtiendo en formato R (en nuestro caso, ej1.txt). (Recuerda poner el archivo entre comillas.) El segundo argumento (header=T o bien header=TRUE, que es lo mismo) le dice a R que convierta la primera fila en el nombre de las columnas; esto es, la primera columna se refiere a la variable independiente Dosis, y la segunda a la variable dependiente Vigilancia.
Pensemos que se te olvidó poner el nombre de las columnas a la hora de grabar el fichero ej1.txt. No problemo. Simplemente tendrías que emplear el siguiente comando:
El segundo argumento le dice a R que añade los nombres de las columnas al archivo de datos.
Si todo va bien, cuando pulses ENTER la consola indicará simplemente > y no habrá ningún mensaje de error.
Antes de hacer el ANOVA, es importante recalcar que puedes ver el contenido de este u otros archivos almacenados (u objetos) en R en nuestra sesión. Se trata de emplear el comando objects.
En nuestro caso, obendremos lo siguiente
Si queremos ver el contenido del archivo ej1, simplemente tenemos que escribir ej1 y ENTER. Esto es lo que obtendremos.
Observa que R ha indicado una columna extra con el número de la observación, si bien no tenéis que hacer caso a dicha columna.
Ahora es tiempo ya para hacer el ANOVA. El comando es aov:
Es muy importante indicar el orden en que se dan los argumentos. El primer argumento es siempre la variable dependiente (Vigilancia), que es seguido por el símbolo (~) y después la variable independiente (o, como veremos, las variables independientes, en el caso de diseños factoriales). El argumento final para aov es el nombre del archivo R que está siendo analizado. aov.ej1 es el nombre del archivo en el que se va a quedar el análisis (en otras palabras, que le podrías poner otro nombre, pero el dado es ya muy indicativo).
Los resultados del ANOVA se pueden ver con el comando summary:
En este caso, hemos encontrado un efecto significativo de la variable Dosis (el valor de p ha sido menor de .05).
Naturalmente es necesario indicar las medias por condición. El comando que se aplica es tapply:
Como vemos, es el grupo con dosis “c” el que tiene una media menor (19.25). Los argumentos de tapply son los siguientes. El primer argumento es la columna de la variable dependiente; dado que ej1 es un “objeto” de R con varias columnas, hemos de indicar cuál es la que queremos: ej1$Vigilancia refleja el vector correspondiente a la columna “Vigilancia”. El segundo argumento es la variable independiente, a la que se le aplica el mismo proceso (ej1$Dosis refleja la columna de Dosis). El tercer argumento es el estadístico que queremos calcular, en nuestro caso, la media aritmética (“mean” en inglés).
Si lo que quisiéramos ahora es computar las desviaciones típicas por condición, el comando a hacer sería el mismo, pero poniendo “sd” (standard deviation; desviación típica) en lugar de “mean”. Aquí va:
Indudablemente, indicar las columnas empleando $columna no es muy cómodo. Una alternativa para tener los mismos resultados es convertir las columnas en objetos, y como tales son manejables en R con el comando attach
Y vamos a calcular las medias por condición de esta manera (que evidentemente son las mismas que antes),
Un aspecto importante en cualquier experimento es observar los datos en cada grupo, para lo cual podemos tener el diagrama de caja y bigotes para cada grupo. El comando que se emplea es plot
En la fórmula se indica la variable dependiente seguida (tras el signo ~) de la variable independiente.
En el gráfico se puede observar una diferencia clara entre el grupo de dosis “c” y los otros dos grupos. Naturalmente, viendo el gráfico y la existencia de un efecto significativo de Dosis en el ANOVA, lo que hemos de hacer ahora son comparaciones múltiples. (En caso de que el ANOVA no hubiera sido significativo, no debes proceder a efectuar estas pruebas.) De esta manera podemos determinar entre qué condiciones experimentales hay diferencias significativas. Para ello, emplearemos el método de Tukey.
Para ello crearemos el objeto ej1Tukey empleando la función TukeyHSD
Para ver el resultado, simplemente hemos de teclear el nombre del objeto, es decir, ej1Tukey
Las diferencias entre medias en las que el intervalo de confianza que engloba los límites inferior y superior no contienen el valor 0, son estadísticamente significativas con el método de Tukey. En nuestro caso, son las diferencias entre los grupos “b” y “c”, y entre los grupos “a” y “c”. Esto puede verse también si trazamos los intervalos de confianza gráficamente. Para ello emplearemos la función plot
Se puede apreciar que sólo el intervalo de confiaza de la diferencia entre los grupos “a” y “b” toca 0 (es decir, que la diferencia entre las dos medias no es estadísticamente significativa.
Una nota respecto a los gráficos. Para grabar los gráficos en Linux, podemos emplear la expresión postscript antes del gráfico (o gráficos). Por ejemplo, si escribimos
y luego volvemos a escribir
Habremos creado el archivo ej1Tukey.ps, que está en formato postscript. Si ya hemos hecho el gráfico que queríamos podemos emplear dev.off
Y ahora los gráficos aparecerán únicamente en la pantalla. En el caso de Windows, en lugar de postscript() hay que emplear windows()
Ahora vamos a generalizar un poco lo que tenemos, incluyendo una segunda variable independiente...es el ejemplo 2.
Ejemplo 2. ANOVA factorial entre sujetos con dos factores
El Apéndice II contiene los datos en los que se contabilizó el nivel de vigilancia de hombre y mujeres a los que se les había dado dos posibles niveles de dosis de una droga. En este caso, tenemos un diseño entre-sujetos factorial 2x2, con los factores Género (hombres,mujeres) y Dosis (a,b).
Lo primero que has de hacer es crear un archivo con los datos del Apéndice II y guardarlo en formato ASCII con el nombre ej2.txt
Para crear el fichero en formato R, sólo has de de introducir el comando siguiente:
Y ahora ya puedes hacer el ANOVA:
Observa que las dos variables independientes están separados por un asterisco *. Dicho asterisco indica a R que queremos analizar dicha interacción entre Género y Dosis. Si únicamente quisiéramos analizar los dos efectos principales, habríamos de reemplazar el asterisco con el signo de más (+).
La Tabla del ANOVA tendrá este aspecto:
Podemos ver que ni los efectos principales ni la interacción han resultado significativos en este experimento.
Vamos a ver las medias por condición. Como antes, el comando para ello es tapply:
(Recuerda que aquí podríamos haber empleado attach para evitar el uso de $columna, si bien hay que tener cuidado en no repetir el nombre de los objetos; por ejemplo, tendremos que haber borrado los objetos con el mismo nombre del Ejemplo 1.)
Como en el Ejemplo 1, el primer argumento es la columna de la variable dependiente (ej2$Vigilancia), y dado que tenemos un diseño con 2 factores y queremos las medias por condición, hemos de indicar el segundo argumento como una lista (list), en la que listamos los factores en cuestión. (Si hubiésemos tenido 3 factores, hubieramos puesto los 3 factores en la lista.) El tercer argumento es el estadístico que queremos calcular, que en nuestro caso es la media (“mean”, en inglés)
Como has podido imaginar, es posible obtener las medias marginales de Género y de Dosis. Por ejemplo, para tener las medias marginales de Género (independientemente de Dosis) has de emplear:
Y para obtener las medias marginales de Dosis, el comando es:
En diseños factoriales es de interés tener un gráfico para apreciar los efectos principales y la interacción. El comando a emplear es interaction.plot:
Y el resultado lo tenemos en el gráfico de abajo. Observar que primero ponemos la variable que queremos tener en el eje de abscisas (X), de manera que podemos intercambiar el orden de Dosis y Género; en último lugar ponemos la variable dependiente.
Naturalmente, es fácil generalizar lo que hemos visto para el caso de 3 o más factores entre.
Recuerda que para salir del programa sólo has de pulsar q()
Ejemplo 3. ANOVA intra-sujetos de un factor
Pensemos que tenemos un experimento en el que cinco sujetos han de memorizar una lista de palabras. Las palabras de la lista son de tres tipos: palabras don valencia positiva, negativa o neutra. La variable dependiente es el número de palabras recordadas en la fase de test. Los datos se presentan en el Apéndice III. Observa que tenemos un único factor (la valencia de las palabras) con tres factores (negativa, positiva y neutra). Tenemos además un factor de efectos aleatorios: Sujetos.
Para efectuar el ANOVA con estos datos, hemos de crear un archivo ej3 que contiene los datos. Observad que cada observación aparece en una fila diferente (a diferencia de los programas habituales de estadística como SPSS o Systat).
Como ya sabemos el archivo con formato R se consigue con el comando
Para efectuar el ANOVA el comando a efectuar es:
Dado que el factor Valencia está cruzado con el factor aleatorio Sujeto (esto es, cada sujeto recibe los tres tipos de palabra), hemos de especificar el término de error para Valencia, que en nuestro caso es Sujeto por Valencia. Para hacer esto, añadimos el término Error(Sujeto/Valencia) al factor Valencia.
La tabla del ANOVA tiene el siguiente aspecto:
Observa que el análisis de los factores entre-sujetos se ofrece en primer lugar (en nuestro ejemplo, no hay ningún factor entre-sujetos), que es seguro por los factores intra-sujetos. Observa que el valor de probabilidad p para Valencia se expresa en notación científica dado su valor tan bajo.
La tabla de las medias se consigue con tapply
Ejemplo 4. ANOVA factorial intra-sujetos (dos factores “intra”)
El Apéndice IV contiene los datos de un experimento en el que cinco sujetos hubieron de recordad palabras de diferente valencia (como en el Ejemplo 3, con tres niveles de Valencia). Además, el experimento constó de dos bloques, en uno de llos habían de recordar los items de manera libre, o bien con señal. Por tanto, tenemos dos factores: Valencia (3 niveles: positiva, negativa, neutra) y Tarea (2 niveles: libre, con señal). Has de introducir los datos del fichero ASCII con nombre ej4.txt en un archivo de nombre ej4 con formato R:
Y para hacer el ANOVA, escribimos
Observa que, en el ejemplo, el factor Sujeto está cruzado tanto con Tarea como con Valencia, de manera que hemos de especificar tres términos de error: uno para Tarea, otro para Valencia, y otro para la interacción entre estos dos. No obstante, R es lo suficientemente espabilado para dividir poner estos tres términos de error una vez se indica el término de error de la interacción en el comando anterior.
La tabla del ANOVA tendrá el siguiente aspecto:
Podemos apreciar que no ha habido ningún efecto significativo, si bien el efecto principal de Tarea ha rozado la significatividad estadística.
La tabla de las medias por condición la tenemos con tapply
La explicación es similar a la que ya vimos en el caso del Ejemplo 2 (ANOVA factorial entre-sujetos). Y finalmente trazar el gráfico de la interacción de los dos factores, empleamos interaction.plot
Ejemplo 5. Diseños factoriales mixtos
El Apéndice V contiene los datos de un experimento con 18 sujetos, 9 mujeres y 9 hombres. Cada sujeto recibe una de las tres posibles dosis de una droga. Todos los sujetos recibieron tres tipos de palabra (valencia positiva, negativa o neutra) empleando dos tipo de tarea de memoria (recuerdo libre, o recuerdo con señal). Por tanto, tenemos 2 factores entre-sujeto: Género (2 niveles) y Dosis (3 niveles); y 2 factores intra-sujeto: Tarea (2 niveles) y Valencia (2 niveles). Graba los datos ASCII en el archivo ej5.txt
Para pasar el archivo ASCII ej5.txt al archivo ej5 con formato R harás de escribir
Para efectuar el ANOVA escribimos
Observa que hemos de distinguir los factores entre- e intra-sujetos. Los factores entre-sujeto están dentro de la expresión Error(Sujeto/factores intra)
La tabla del ANOVA será la siguiente:
Y si ahora queremos tener las medias por condición, empleamos tapply
O bien podemos pedir, por ejemplo, las medias de la interacción Dosis*Valencia con tapply
Igualmente podríamos trazar la interacción entre, de nuevo, Dosis por Valencia, con interaction.plot
Recuerda que para salir del programa sólo has de pulsar q()
Finalmente, cabe indicar que R puede emplearse para muchísimos otros aspectos del análisis. En otros sitios web podrás encontrar excelentes ejemplos.
Apéndices
Apéndice I. Datos para el ejemplo 1
Observación Dosis Vigilancia
1 a 30
2 a 38
3 a 35
4 a 41
5 a 27
6 a 24
7 b 32
8 b 26
9 b 31
10 b 29
11 b 27
12 b 35
13 b 21
14 b 25
15 c 17
16 c 21
17 c 20
18 c 19
Apéndice II. Datos para el ejemplo 2
Observación Género Dosis Vigilancia
1 m a 8
2 m a 12
3 m a 13
4 m a 12
5 m b 6
6 m b 7
7 m b 23
8 m b 14
9 h a 15
10 h a 12
11 h a 22
12 h a 14
13 h b 15
14 h b 12
15 h b 18
16 h b 22
Apéndice III. Datos para el ejemplo 3
Observacion Sujeto Valencia Recuerdo
1 Pedro Neg 32
2 Pedro Neu 15
3 Pedro Pos 45
4 María Neg 30
5 María Neu 13
6 María Pos 40
7 Elena Neg 26
8 Elena Neu 12
9 Elena Pos 42
10 Vanessa Neg 22
11 Vanessa Neu 10
12 Vanessa Pos 38
13 Luis Neg 29
14 Luis Neu 8
15 Luis Pos 35
Apéndice IV. Datos para el ejemplo 4
Observación Sujeto Tarea Valencia Recuerdo
1 Pedro Libre Neg 8
2 Pedro Libre Neu 9
3 Pedro Libre Pos 5
4 Pedro Señal Neg 7
5 Pedro Señal Neu 9
6 Pedro Señal Pos 10
7 Victor Libre Neg 12
8 Victor Libre Neu 13
9 Victor Libre Pos 14
10 Victor Señal Neg 16
11 Victor Señal Neu 13
12 Victor Señal Pos 14
13 Maria Libre Neg 13
14 Maria Libre Neu 13
15 Maria Libre Pos 12
16 Maria Señal Neg 15
17 Maria Señal Neu 16
18 Maria Señal Pos 14
19 Amparo Libre Neg 12
20 Amparo Libre Neu 14
21 Amparo Libre Pos 15
22 Amparo Señal Neg 17
23 Amparo Señal Neu 18
24 Amparo Señal Pos 20
25 Ana Libre Neg 6
26 Ana Libre Neu 7
27 Ana Libre Pos 9
28 Ana Señal Neg 4
29 Ana Señal Neu 9
30 Ana Señal Pos 10
Apéndice V. Datos para el ejemplo 5
Obs Sujeto Género Dosis Tarea Valencia Recuerdo
1 A M A L Neg 8
2 A M A L Neu 9
3 A M A L Pos 5
4 A M A S Neg 7
5 A M A S Neu 9
6 A M A S Pos 10
7 B M A L Neg 12
8 B M A L Neu 13
9 B M A L Pos 14
10 B M A S Neg 16
11 B M A S Neu 13
12 B M A S Pos 14
13 C M A L Neg 13
14 C M A L Neu 13
15 C M A L Pos 12
16 C M A S Neg 15
17 C M A S Neu 16
18 C M A S Pos 14
19 D M B L Neg 12
20 D M B L Neu 14
21 D M B L Pos 15
22 D M B S Neg 17
23 D M B S Neu 18
24 D M B S Pos 20
25 E M B L Neg 6
26 E M B L Neu 7
27 E M B L Pos 9
28 E M B S Neg 4
29 E M B S Neu 9
30 E M B S Pos 10
31 L M B L Neg 7
32 L M B L Neu 5
33 L M B L Pos 9
34 L M B S Neg 9
35 L M B S Neu 8
36 L M B S Pos 7
37 G M C L Neg 23
38 G M C L Neu 22
39 G M C L Pos 23
40 G M C S Neg 25
41 G M C S Neu 23
42 G M C S Pos 22
43 H M C L Neg 14
44 H M C L Neu 14
45 H M C L Pos 13
46 H M C S Neg 15
47 H M C S Neu 17
48 H M C S Pos 17
49 I M C L Neg 15
50 I M C L Neu 16
51 I M C L Pos 16
52 I M C S Neg 14
53 I M C S Neu 17
54 I M C S Pos 18
55 J H A L Neg 12
56 J H A L Neu 11
57 J H A L Pos 13
58 J H A S Neg 15
59 J H A S Neu 14
60 J H A S Pos 15
61 K H A L Neg 22
62 K H A L Neu 20
63 K H A L Pos 23
64 K H A S Neg 25
65 K H A S Neu 22
66 K H A S Pos 21
67 L H A L Neg 14
68 L H A L Neu 15
69 L H A L Pos 13
70 L H A S Neg 12
71 L H A S Neu 16
72 L H A S Pos 15
73 M H B L Neg 15
74 M H B L Neu 14
75 M H B L Pos 16
76 M H B S Neg 15
77 M H B S Neu 18
78 M H B S Pos 21
79 N H B L Neg 12
80 N H B L Neu 10
81 N H B L Pos 14
82 N H B S Neg 15
83 N H B S Neu 14
84 N H B S Pos 17
85 O H B L Neg 18
86 O H B L Neu 17
87 O H B L Pos 19
88 O H B S Neg 22
89 O H B S Neu 22
90 O H B S Pos 21
91 P H C L Neg 22
92 P H C L Neu 22
93 P H C L Pos 24
94 P H C S Neg 23
95 P H C S Neu 25
96 P H C S Pos 25
97 Q H C L Neg 18
98 Q H C L Neu 17
99 Q H C L Pos 18
100 Q H C S Neg 17
101 Q H C S Neu 19
102 Q H C S Pos 19
103 R H C L Neg 19
104 R H C L Neu 17
105 R H C L Pos 19
106 R H C S Neg 22
107 R H C S Neu 21
108 R H C S Pos 20