Sei sulla pagina 1di 121

ELEMENTOS DE R

Extractado por lvaro Lema de: Crawley, M. 2007. THE R BOOK. Imperial College London , UK John Wiley & Sons Ltd,
942 p.

R es un lenguaje de alto nivel y un ambiente especializado, por objetos, para anlisis de datos y
construccin de grficos, antecedido por dos lenguajes anteriores: el S de Becker, Chambers y
Wilks y el de esquemas de Sussman. El nombre se debe a sus autores originales: Ross Ihaka y
Robert Gentleman del Dpto de Estadstica de la Universidad de Auckland, Nueva Zelandia. Hoy lo
dirige un gran grupo con colaboradores en todo el mundo.

Para hacer algunos de los ejemplos busque como construir un dataframe en caso de necesidad, en
este mismo documento. Adems, muchos de los archivos usados los encuentra en la siguiente
direccin de internet Index of /~cs0her/Statistics/therbook

Instalacin de R

Se va al sitio llamado CRAN (Archivos en red): http://cran.r-project.org/ o en Google buscar


CRAN. ( Download and Install R), seguramente usted posee Windows y siga las instrucciones para
instalar el paquete bsico dndole run.

Corrida de R.

Solo basta un click en el icono R. Si tiene una versin antigua desinstlela primero.

citation().

Ac se le informa como citarlo al incluirlo en documentos.

prompt o apuntador: >

> le informa que el programa est listo a recibir sus comandos.

Ayudas: Help.

Tiene una tecla para ello, o va a CRAN en Google. Pero si conoce el nombre de la funcin
simplemente escrbala seguida de de interrogacin, por ejemplo: ?read.table o, si nicamente
conoce el tema en que necesita ayuda, por ejemplo data input, utilice la funcin: help.search con
la duda entre comillas:

help.search("data input") luego de lo cual aparecern las funciones asociadas a ello, y de nuevo
procede de la forma anterior.

find y apropos

Estas son dos funciones muy tiles: find le dice en que paquete est algo, por ejemplo:

1
> find("aov") le dice que este tema o funcin se halla en el [1] "package:stats"

apropos: devuelve un vector de caracteres con los nombres de todos los objetos donde est su
duda o tema, por ejemplo:

> apropos("aov")

[1] ".__C__aov" ".__C__maov" "aov"

[4] "eff.aovlist" "model.frame.aovlist" "summary.aov"

[7] "summary.aovlist" "terms.aovlist" "TukeyHSD.aov"

Ayuda en lnea:

Simplemente vaya al sitio http://cran.r-project.org/.

Ejemplos de funciones trabajadas con R.

Para ello nicamente escriba example(function) con la funcin entre parntesis. Por ejemplo:

example(aov) y se le desplegaran algunos.

Demostraciones (Demos) de algunas funciones de R.

Existen demos para ver como se procede en algunos casos, por ejemplo vea que se le muestra con

demo(graphics)

Libreras en R

En R existen algunas libreras como:

MASS: Asociada con un libro de Venables and Ripley: Modern Applied Statistics using S-
PLUS
mgcv: Modelos aditivos generalizados
nlme: Modelos de efectos mezclados lineales y no lineales
survival: Anlisis de supervivencia; etc.

Para usarlas en una sesin, simplemente escriba despus de library, entre parntesis, el nombre
deseado, por ejemplo:
library(mgcv).

Contenido de una librera.

Para saber que contiene cada una, Escriba:


2
> library(help=mgcv)
Le entrega la informacin vinculada con mgcv. La lista completa de contenidos se obtiene usando
objects con search(), para lo cual debe abrir primero la library. Ejemplo:

> library(mgcv)
Sale en pantalla la informacin: This is mgcv 1.7-2. For overview type 'help("mgcv-package")'.
> objects(grep("mgcv",search()))
[1] "anova.gam"
[2] "bam"
[3] "bam.update"
..
[102] "vcov.gam"
[103] "vis.gam"

seguido de lo cual usted puede indagar por alguna funcin. Ejemplo


bam
y aparece informacin sobre ella.

Instalacin de paquetes y libreras.

Muchos de los paquetes no estn instalados en el bsico. Para instalarlos se corre el programa y
en la lnea base de comandos se busca la funcin: install.packages y as bajar las libreras que
requiera, acudiendo al sitio espejo ms cercano, por caso, Bogot. Ejemplo:

install.packages("tree")

Lnea de comandos versus manuscritos previos .

Para escribir comandos en varias lneas es deseable un editor de texto como el Word, por ejemplo,
mediante copia y pega (copy y paste), incluso por encima del propio editor de R.

S prefiere este ltimo, lo encuentra en archivo: abrir script, escriba ah sus comandos y llvelo
al programa de nuevo con CTRL+R. Si quiere gravar su nuevo script use Ctrl+S en un archivo que
deber nombrar, para abrirlo de nuevo cuando quiera.

Editor de Datos.

Se acude a la barra de mens principales: Edit/Data, que abre una ventana para que escriba el
nombre buscado, con la condicin que est activo en la sesin corriente.

Lo anterior se puede hacer directamente desde la lnea de comandos, usando la funcin fix Por
ejemplo

library(MASS)
3
attach(bacteria)

fix(bacteria)

y le muestra el archivo de datos.

Desaparicin de Grficos.

Para congelar grficos que deben aparecer secuencialmente se usa:


par(ask=TRUE)

Cada grafico permanecer hasta que se hunda la tecla de entrada (enter).

Otros elementos

Para saber que se ha hecho en una sesin, por ejemplo las variables creadas en ella, escriba en la
lnea de comandos:

objects():

Para ver las libreras y archivos de datos (libraries y dataframes) enlazados, use:

search().

Aseo (Tidying Up).

Al finalizar la sesin conviene remover (rm) algunos nombres de variables creadas en ella y
desprender algunos de los archivos de datos (dataframes) previamente enlazados con la funcin
attach. De esta manera se evitan variables con los mismos nombres pero significados diferentes
en trabajos posteriores. Por ejemplo si haba creado unas variables x, y, z, desaparecen del
entorno con

rm(x,y,z).

Si quiere desenlazar un dataframe llamado worms, entonces escriba.

detach(worms)

Elementos esenciales del lenguaje R.


Este lenguaje es poderossimo y sirve a mltiples disciplinas aunque nuestro inters ahora es la
estadstica.

Apuntador o puntero.

4
El apuntador de R en la pantalla es > que lo autoriza a trabajar en l. Algunas veces en el
documento se prescinde de l por obvio. Por ejemplo:

> log(112/47.3)+3/4-5*2

[1] -8.388011

Cada lnea soporta hasta 128 caracteres, pero puede continuar sus comandos en la siguiente lnea
para lo cual el apuntador pasa a +, volviendo al prompt > al hundir la tecla de entrada. Ejemplo

> 65+3+6+4+2+4+8+123-13+

+ -23+32/5

[1] 185.4

Se ve que el signo + usado al final de la primera lnea no es el operador aritmtico.

Se puede colocar en una sola lnea dos o ms expresiones entre punto y coma, pero se asumen
como lneas diferentes, ejemplo:

> 12+123; 15*27; 53-477

[1] 135

[1] 405

[1] -424

Funciones incorporadas al lenguaje.

La tabla 2.1 del libro de Crowley muestra las funciones incorporadas al lenguaje

Funcin Significado
log(x) log en base e de x
exp(x) antilog de x
log(x,n) log en base n de x
log10(x) log en base 10 de x
sqrt(x) raz cuadrada de x
factorial(x) x!
choose(n,x) coeficientes binomiales n!/(x! (nx)!)
gamma(x) (x), para real, x(x1)!, para enteros x
lgamma(x) log natural de (x)
floor(x) mayor entero <x
ceiling(x) menor entero >x
trunc(x) entero ms cercano a x entre x y 0 trunc(1.5) =1, trunc(-1.5)=1 trunc es
parecido a floor para valores positivos y a ceiling para valores negativos
5
round(x, digits=0) redondea el valor de x a un entero
signif(x, digits=6) da x con 6 dgitos en notacin cientfica
runif(n) genera n numero entre 0 y1 en una distribucin uniforme
cos(x) coseno de x en radianes
sin(x) seno de x en radianes
tan(x) tangente de x en radianes
acos(x), asin(x), atan(x) transformaciones trigonomtricas inversas de nmeros real o complejos
acosh(x), asinh(x), atanh(x) transformaciones inversas hiperblicas trigonomtricas de nmeros
reales o complejos
abs(x) valor absoluto de x, ignorando signo menos si existe

Ejemplos: para encontrar el logaritmo natural de 10, se escribe

log(10)

[1] 2.302585

exp(1)

[1] 2.718282

El logaritmo de 6 en base 10

log10(6)

[1] 0.7781513

Logaritmo en la base 3 de 9:

log(9,3)

[1] 2

Las funciones trigonomtricas se usan con ngulos medidos en radianes. Recuerde que 360
equivale a 2 radianes:

pi

[1] 3.141593

sin(pi/2)

[1] 1

Nmeros con Exponentes. Notacin cientfica.

Para los nmeros grandes o muy pequeos R usa:


6
1.2e3 = 1200. e3 sugiere mover el punto decimal 3 lugares a la derecha.

1.2e-2 = 0.012. e-2 significa mover el punto decimal 2 lugares a la izquierda

3.9+4.5i es un nmero complejo con parte real = 3.9 y una imaginaria = 4.5). i -1

Mdulo de un nmero y cocientes enteros.

Cocientes enteros se obtienen con la notacin %/%. Los y residuos con %%.

Por ejemplo la parte entera de la divisin de 1234 entre 19

> 1234 %/% 19

[1] 64

El resto o residuo acude a la funcin Mdulo (lo que sobra al dividir dos nmeros):

> 1234 %% 19

[1] 18

El modulo sirve para averiguar si un numero es impar o no, los impares modulo 2, dan 1, los pares
tienen un modulo 2 = 0. Ejemplo:

> 53 %% 2

[1] 1

> 54 %% 2

[1] 0

Similarmente puede usar esta funcin modulo para verificar si un numero es mltiplo de otro. Por
ejemplo averiguar si 21435 es mltiplo de 13:

> 21435 %% 13 == 0

[1] FALSE

Redondeos.

Existen varias formas de redondeo de cifras (Por lo bajo, por lo alto, al entero ms prximo. Por
ejemplo, el Mayor entero menor que 15.6 se obtiene con la funcin floor:

> floor(15.6)
[1] 15

7
El entero ms prximo a 15.6 se obtiene con la funcin: ceiling. Ejemplo

> ceiling(15.6)
[1] 16
Se puede redondear al entero ms prximo sumando 0.5 al nmero y utilizar la funcin floor. Se
puede adems escribir una funcin para ello que quede incorporada en la sesin y que permite ir
adquiriendo idea de la escritura de ello. Por ejemplo arbitrariamente elegimos el nombre de
redondeo para la funcin, entonces escribimos

redondeo<-function(x) floor(x+0.5)

Ahora se acude a esta funcin as:

> redondeo(15.7)
[1] 16

> redondeo(15.4)
[1] 15

Infinito y elementos no numricos (Not a Number (NaN))

Algunos clculos pueden dar como resultado infinito (Inf) o infinito (-Inf). Por ejemplo:

> 5/0
[1] Inf

> -4/0
[1] Inf

Los clculos que los involucran pueden ser evaluados, ejemplo:

> exp(-Inf)
[1] 0

> (0:4)^Inf
[1] 0 1 Inf Inf Inf

Pero otros clculos, pueden llevar a resultados no numricos, representados en en R por NaN
(not a number). Ejemplos:

> 0/0
[1] NaN

> Inf-Inf;Inf/Inf
[1] NaN
[1] NaN

Elementos no evaluables (en R: NA).

Es preciso distinguir entre NaN y NA (identifica tambin elementos faltantes en R).

8
La siguiente funcin: is.nan sirve para verificar si algn elemento es numrico o no al regresar
respuestas lgicas TRUE o FALSE. La funcin is.nan es adecuada para verificar si algo es o no NaN.
R puede forzar (coercing) resultados NaN a elementos tipo lgico o entero para verificar si un
nmero es finito o no: Ejemplo:

is.finite(10)
[1] TRUE

is.infinite(10)
[1] FALSE

is.infinite(Inf)
[1] TRUE

> a<-c(1,2)

> is.finite(a)
[1] TRUE TRUE

> is.nan(a)
[1] FALSE FALSE

Asignacin. Flecha asignadora: gets arrow <-

Un objeto obtiene valores en R por medio de asignaciones (x gets (obtiene) a value), por medio
de la flecha asignadora llamada en lenguaje R: gets arrow <- , un smbolo compuesto de menor
que y el signo menos sin espacio entre ellos. Ejemplo si queremos que y quede valiendo 5,
escribimos

y<-5

Nota importante: Si deja un espacio entre el signo menor que y el signo menos obtiene la
respuesta si y es menor que -5:

> y< -5
[1] FALSE

Valores faltantes o perdidos NA.

Pueden afectar muchos procesos o aun invalidarlos. Algunas funciones simplemente no operan
cuando hay valores faltantes en los datos, por ejemplo la media (mean) es un ejemplo clsico de
ello: Para hacer el clculo se debe remover el NA, por medio de l argumento na.rm=TRUE.
Ejemplo

> x<-c(1:13,NA)

>x
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 NA

> mean(x)
[1] NA

9
> mean(x,na.rm=T)
[1] 7

Localizacin de NA en vectores

Para verificar la localizacin de faltantes dentro de un vector, use la funcin is.na(x). Para ello se
construyen ndices dentro del vector y luego se usa la funcin seq: ejemplo:

ejsim<-c(1:4,NA,NA,7:10)

> ejsim
[1] 1 2 3 4 NA NA 7 8 9 10

> seq(along=ejsim)[is.na(ejsim)]
[1] 5 6

Le dice que los elementos 5 y 6 del vector eran NA. Pero, en una forma ms simple se puede lograr
lo mismo con which, en la siguiente forma:

> which(is.na(ejsim))
[1] 5 6

Si los elementos faltantes, son cero (0) o asimilables a l, en vez de ser NA autnticos, se pueden
editar como ceros (0), usando la funcin is.na o tambin ifelse para generar subscritos en el
vector as:

> ejsim[is.na(ejsim)]<- 0

> ejsim
[1] 1 2 3 4 0 0 7 8 9 10

> ifelse(is.na(ejsim),0,ejsim)

[1] 1 2 3 4 0 0 7 8 9 10

Operadores

R utiliza las siguientes seales como operadores:


+ - * / %% ^: aritmticos
> >= < <= == != : relacionales
!&|: lgicos
~: frmula para modelar
<- ->: asignaciones
$: lista indexada (operador elemento nombre)
: crear una secuencia.

Pero algunos de estos adquieren otras funciones dentro de la formulacin de un modelo, Por
ejemplo:

* indica efectos principales + interacciones,

10
: indica la interaccin entre dos variables, ejemplo A:B y,
significa todas las interacciones hasta su ms alto orden.

Creacin de Vectores.

Los vectores son variables con uno o ms valores del mismo tipo: lgicos, enteros, reales,
complejos, sarta o de caracteres o vectores fila. Un vector con un solo valor es conocido como
un escalar, pero en R a estos se les considera un vector de longitud 1. Tambin existen de
longitud 0, muy tiles en la escritura de funciones.

y<-4.3
> length(y)
[1] 1

> z<-y[-1]
> length(z)
[1] 0

Los vectores pueden crearse de varias formas. Por ejemplo como secuencia de nmeros: Dos
lmites con dos puntos entre ellos (:):

> y <- 8:15


>y
[1] 8 9 10 11 12 13 14 15
Puede escribirlos directamente en la lnea de comandos, por medio de la funcin de
concatenacin c, ejemplo:

> y <- c(8,9,10, 11, 12, 13, 14, 15)


>y
[1] 8 9 10 11 12 13 14 15

Puede tambin escribir los nmeros de a uno por medio de la funcin scan(), que se pone en
modo espera para que usted introduzca los datos y termina con el ltimo enter:
5: > y <- scan()
1: 8
2: 9
3: 10
4: 11
5: 12
6: 13
7: 14
8: 15
9:
Read 8 items.

Atributos del vector

Uno de los ms importantes es su longitud (length): numero de valores contenidos en el vector.


Cuando los vectores se crean por clculos de otros vectores, el nuevo vector creado queda con la
mayor longitud y las variables ms cortas recicladas. Ejemplo:
A<-1:12

11
> B<-c(2,3,4)
> A*B
[1] 2 6 12 8 15 24 14 24 36 20 33 48

Otro ejemplo:

> A<-1:11
> B<-c(2,3,5)
> A*B
[1] 2 6 15 8 15 30 14 24 45 20 33
Mensajes de aviso perdidos
In A * B :
longitud de objeto mayor no es mltiplo de la longitud de uno menor

Elementos con nombres o etiquetas (labels) dentro de Vectores.

A veces conviene poner etiquetas (labels) a los valores de un vector. Por ejemplo sea un vector
llamado conteo del numero de 0, 1, 2, etc. ocurrencias: Ejemplo, 23 ceros, 11 unos, 6 dos, etc.

> conteo<-c(23,11,6,4,6,2,1,0,2)

> conteo
[1] 23 11 6 4 6 2 1 0 2

Sera deseable nominar, funcin names(vector), cada uno de los valores del vector conteo, con
nmeros del 0 al 8, tantos como los del vector.
> names(conteo)<-0:8

As queda el vector conteo:

> conteo
0 1 2 3 4 5 6 7 8
23 11 6 4 6 2 1 0 2

Si se ha creado una tabla (table) como la anterior y desea remover esos nombres, use la funcin:
as.vector como en este caso:

> as.vector(conteo)
[1] 23 11 6 4 6 2 1 0 2

Funciones sobre vectores

Una de las fortalezas de R es su habilidad para evaluar funciones sobre vectores completos,
evitando los loops (circuitos o bucles de programacin). Algunas de estas se muestran la Tabla 2
de Crowley:

Tabla 2.2. Funciones para vectores usadas en R.


Operacin Significado
max(x) mximo valor en x
min(x) mnimo valor en x
sum(x) total de todos los valores en x
12
mean(x) promedio aritmtico de los valores en x
median(x) valor de la mediana en x
range(x) vector con el min(x) y el max(x)
var(x) varianza muestral de x
cor(x,y) correlacin entre los vectores x y, y
sort(x) versin ordenada de los valores de x
rank(x) vector de los rangos de los valores en x
order(x) un vector de enteros con la permutacin para ordenar x en forma ascendente
quantile(x) vector que contiene: el mnimo; el bajo, mediano y cuartil superior, y el mximo
de x
cumsum(x) vector que contiene la suma de los elementos de un vector hasta un valor x
cumprod(x) vector que contiene el producto de los elementos de un vector hasta un valor x
cummax(x) vector de nmeros no-decrecientes con la mxima acumulativa de un vector hasta
un valor x
cummin(x) vector de nmeros no-decrecientes con la mnima acumulativa de un vector hasta
un valor x
pmax(x,y,z) vector, de longitud iqual a la mayor de x, y o z, que contiene el mximo de x, y o z
para la isima posicin en cada uno
pmin(x,y,z) vector, de longitud igual a la mayor de x, y o z, que contiene el mnimo de x, y o z
para la iesima posicin en cada uno
colMeans(x) medias de las columnas en un dataframe o matriz x
colSums(x) total de las columnas en un dataframe o matriz x
rowMeans(x) medias de las filas en un dataframe o matriz x
rowSums(x) total de las filas en un dataframe o matriz x

Resumen de Informacin de Vectores por Grupos.

Una de las funciones a dominar en R es tapply. La t se deja para tabla y la idea es aplicar una
funcin para producir una tabla con los valores en el vector, basado ello en una o ms variables de
agrupamiento, como los niveles de un factor

Por ejemplo. Sea una base de datos ubicada en c:\\estadistica, llamada daphnia.txt, con
encabezados (header=T). Esto se introduce al R as:

> data<-read.table("c:\\estadistica\\daphnia.txt",header=T)
> attach(data)
> names(data)
[1] "Growth.rate" "Water" "Detergent" "Daphnia"

> data
Growth.rate Water Detergent Daphnia
1 2.919086 Tyne BrandA Clone1
2 2.492904 Tyne BrandA Clone1
3 3.021804 Tyne BrandA Clone1
4 2.350874 Tyne BrandA Clone2
.
68 6.405130 Wear BrandD Clone2
69 5.990973 Wear BrandD Clone2
70 2.553241 Wear BrandD Clone3
13
71 2.592766 Wear BrandD Clone3
72 1.761603 Wear BrandD Clone3

La variable respuesta o dependiente es Growth.rate y las otras 3 son factores. Suponga que
deseamos el crecimiento medio por cada detergente (Detergent). Escribimos:
tapply(y,Factor,mean), para el caso:

> tapply(Growth.rate,Detergent,mean)

BrandA BrandB BrandC BrandD


3.884832 4.010044 3.954512 3.558231

Una tabla con 4 entradas, una por cada nivel del factor llamado Detergent.

Para producir una tabla 2-dimensional debe ponerse cada una de las variables de agrupamiento
dentro de una lista entre parntesis redondos; list(Factor1,Factor2). Por ejemplo calcular la
mediana de la rata de crecimiento (growth rate) por tipo de water y clones (daphnia clone)

>tapply(Growth.rate,list(Water,Daphnia),median)
Clone1 Clone2 Clone3
Tyne 2.87 3.91 4.62
Wear 2.59 5.53 4.30

La primera variable en la lista crea las filas de la table y la segunda las columnas.

Subscritos e ndices.

Hasta ahora se ha aplicado funciones solo a vectores completos, pero a veces es necesario hacerlo
solo con algunos de los elementos del vector. La seleccin de estos elementos se basa en
subscritos (o ndices)

Los subscrito tienen parntesis cuadrados [2], mientras las funciones los tienen redondos (2).
Los subscritos en vectores, matrices, arreglos y dataframes tienen un conjunto de parntesis
cuadrados [6], [3,4] o [2,3,2,1] mientras que en listas los tienen dobles [[2]] o [[i,j]]. Cuando
existen dos subscritos para un objeto como sucede con matrices o dataframes, el primero se
refiere al nmero de la fila (Las filas se definen o denominan como margen 1 (margin no. 1) y, el
segundo suscrito se refiere al nmero de columna (Las columnas se definen como margin no. 2).

Hay una convencin importante y ponderosa por la cual cuando un suscrito aparece como un
blanco, se asume que significa Todo de... (Todo de filastodo de columnas). As:
[,7] significa todas las filas de la columna 7 de un objeto.
[3,] significa todas las columnas de la fila 3 de un objeto.

Trabajo con Vectores y Subscritos lgicos.

Sea x un vector con 16 valores, del 0 al 15: Hay diferentes formas de abordarlo en mltiples
circunstancias. Por ejemplo, sumar todos sus elementos:

> x<-0:15
> sum(x)
[1] 120
14
Pero podramos desear contar los elementos que cumplan algn criterio lgico. Por ejemplo
conocer cuantos valores son <7

> sum(x<7)
[1] 7

Aunque se usa la misma funcin sum, el contexto es diferente. Ac aparece la llamada coercin o
forzado, por medio de lo cual una decisin lgica verdadera = TRUE ha sido forzada a adoptar el
valor numrico 1 y una lgica falsa (FALSE) se fuerza a ser el valor numrico 0. Hasta ac todo bien,
pero entonces cmo operar con solo algunos elementos del vector, por ejemplo sumar algunos
de los elementos de x? Ac aparece el concepto de suscritos lgicos. Note que cuando contamos
el nmero de casos, ello se hizo aplicado al vector entero, usando sum(x<7). Entonces para
encontrar la suma de todos los valores de x que son <7, se deber escribir:

> sum(x[x<7])
[1] 21

Apelando a la lgica esto sucede en la siguiente forma: La condicin lgica x<5 es o verdadera o
falsa. Entonces, recorre el vector complete y evala cada uno de sus valores:

> x<7
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE

El forzado har que FALSE = 0 y TRUE = 1, con lo cual el vector de subscritos [x<7] es de 7 1s
seguido de 9 ceros:

> 1*(x<7)
[1] 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0

Enseguida imaginmonos multiplicando los valores de x por los valores del vector lgico

> x*(x<7)
[1] 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 0

As cuando se aplica la funcin sum, esta da la respuesta esperada: la suma de los valores de los
nmeros: 0+1+2+3+4+5+6=21.

> sum(x*(x<7))
[1] 21

Otro caso, supongamos que deseamos sumar los 4 mayores valores de un vector y. Ello requiere
dos pasos: primero ordenar los valores del vector en forma descendente, segundo sumar los
valores de los cuatro primeros elementos. Sea un y cualquiera:

> y<-c(8,12,3,15,23,1,5,9,16,13,7,11,2)
15
>y
[1] 8 12 3 15 23 1 5 9 16 13 7 11 2

Se debe aplicar la funcin sort, pero esta acta ascendentemente:

> sort(y)
[1] 1 2 3 5 7 8 9 11 12 13 15 16 23

Para cambiar esto se usa la funcin reversa (rev):

> rev(sort(y))
[1] 23 16 15 13 12 11 9 8 7 5 3 2 1

La respuesta ser 23+16+15+13, pero como hacerlo? Con algunos suscritos especficos es posible
descubrir los contenidos de un vector. Ac vemos que 15 es el tercer elemento del vector ltimo
ordenado. Para conocer esto simplemente basta con buscar el suscrito [3]

> rev(sort(y))[3]
[1] 15

As mismo se puede obtener un rango de suscritos, una serie generada usando el operador dos
puntos (:). S deseamos los suscritos 1 a 4, escribimos:

> rev(sort(y))[1:4]
[1] 23 16 15 13

La respuesta ser:

> sum(rev(sort(y))[1:4])
[1] 67

Debe notarse que al vector y no lo hemos cambiado en ninguna forma ni hemos creado nuevos
vectores consumidores de espacio durante las etapas intermedias.

Direcciones dentro de los Vectores

Hay dos funciones importantes para ello. La funcin which, fcil de comprender. Recuerde que y
luce como:

>y
[1] 8 12 3 15 23 1 5 9 16 13 7 11 2

Supngase que deseamos conocer cuales elementos de y contienen valores mayores que 8.
Escribimos:

> which(y>8)
[1] 2 4 5 8 9 10 12
16
Aparece una lista de suscritos de los nmeros que cumplen la condicin. Ntese que no se usan
subscritos dentro de la tal funcin which. Esta funcin solo se aplica al arreglo completo. Para ver
los valores de y mayores que 8, escribimos:

> y[y>8]
[1] 12 15 23 9 16 13 11
Note adems que, este es un vector ms corto que el mismo y, pues los valores menores a 8 se
dejaron de lado.

> length(y)
[1] 13
Para verlo, saber cuntos elementos son mayores de 8 escribimos:

> length(y[y>8])
[1] 7

Elementos dentro de una secuencia de nmeros.

Para extraer cada n-esimo elemento de una secuencia de nmeros se usa la funcin seq como un
ndice. Por ejemplo, extraer cada 30simo nmero empezando en el 5 elemento de una
distribucin normal (xv): con 200 datos, aleatoriamente formada con media 50 y varianza 16,
escribimos:

> xv<-rnorm(200,50,16)

> xv[seq(5,length(xv),30) ]
[1] 75.03469 51.08786 77.16078 38.95603 30.26444 23.04058 57.94013

podemos ver que: > xv[5] es 75.03469 y xv[35= 51.08786, etc.

Encontrar Valores cercanos a un valor especificado dado.

Esto se puede hacer acudiendo a la funcin which. Ejemplo, encontrar el valor ms cercano a 35
en el vector xv. Escribimos:

> which(abs(xv-35)==min(abs(xv-35)))
[1] 112

> xv[112]
[1] 34.91071

Por medio de una funcin escrita para ello (vmascer) podemos hacer lo anterior, para el valor
ms cercano a un valor dado (vd) as:

vmascer<-function(xv, vd){
xv[which(abs(xv-vd)==min(abs(xv-vd)))] }

Ejemplo, para el valor ms cercano a 35 en el vector llamado xv, entonces


> vmascer(xv,35)
[1] 34.91071
17
Recorte de Vectores Usando Subscritos Negativos.

Acordmonos que los subscritos individuales van entre parnesis cuadrados. Ejemplo, sea el
vector y anteriormente formado. Cual ser el 5 valor.

> y[5]
[1] 23

Una alternativa til acude a subscritos negativos para eliminar trminos de un vector. Ejemplo,
crear un nuevo vector z a partir del y, que carezca del primer elemento. Entonces se logra como:

> z <- y[-1]


>z
[1] 12 3 15 23 1 5 9 16 13 7 11 2

Otro ejemplo: Supngase que deseamos la media recortada del vector y (una que ignora el mayor
valor y el menor, en nuestro caso 1 y 23). Se construye en dos pasos:
- Primero, ordenamos el vector y y, removemos el primer termino con y[-1] y el ultimo con
z[-length(z)]. Como ya habamos construido z para y[-1], solo falta:

z<- z[-length(z)]
>z
[1] 12 3 15 23 1 5 9 16 13 7 11

Lo anterior se hace ms fcilmente por medio de un vector de concatenacin con ambos extremos
como este: -c(1,length(x)) y usamos la funcin incorporada en R para el clculo de la media, as:

> med.rec <- function (x) mean(sort(x)[-c(1,length(x))])

> med.rec(y)
[1] 9.181818

Otro ejemplo. Supongamos que deseamos recortar los mltiplos de 5 en una secuencia de
nmeros del 1 al 30. Primero generamos los nmeros del 1 al 30 y luego contamos cuntos de
estos nmeros son mltiplos de 5:

>vec<-1:30

> (multiples<-floor(30/5))
[1] 6

En seguida creamos un vector llamado, por ejemplo, subscritos

subscritos<-5*(1:multiples)

subscritos
[1] 5 10 15 20 25 30

Por ltimo acudimos a subscritos negativos para eliminar los mltiplos de 5 del vector original:

18
> vec[-subscritos]
[1] 1 2 3 4 6 7 8 9 11 12 13 14 16 17 18 19 21 22 23 24 26 27 28 29

Alternativamente se pudo usar modulo cinco: %%5 para construir el resultado en una sola lnea:

> vec[-(1:30*(1:30%%5==0))]
[1] 1 2 3 4 6 7 8 9 11 12 13 14 16 17 18 19 21 22 23 24 26 27 28 29

Repeticiones. Funcin rep

Pueden generarse repeticiones de nmeros o caracteres, por medio de la funcin rep. El objeto
que es nombrado en el primer argumento, es repetido un nmero dado de veces como se
especifica en el segundo argumento. Por ejemplo repetir 7 ochos u 8, 7 veces:

> rep(8,7)
[1] 8 8 8 8 8 8 8

Lo mismo puede hacer con secuencias, mirando el contexto:

> rep(2:5, 3)
[1] 2 3 4 5 2 3 4 5 2 3 4 5

Ac se va repetir cada numero de la secuencia 3 veces

> rep(2:5, each = 3)


[1] 2 2 2 3 3 3 4 4 4 5 5 5

> rep(2:5, each = 2, times = 3)


[1] 2 2 3 3 4 4 5 5 2 2 3 3 4 4 5 5 2 2 3 3 4 4 5 5

> rep(2:5,2:5)
[1] 2 2 3 3 3 4 4 4 4 5 5 5 5 5

Generador de niveles para Factores.

Se acude a la funcin gl (generate levels). Resulta til cuando se quiere codificar grandes
vectores: La sintaxis para ello requiere de 3 argumentos como:

gl(hasta n niveles, con repeticiones de a r, a todo el vector (total length))

Por ejemplo deseamos un factor con cuatro niveles, repetido 3 veces por una vez, o sea (total
length=12):

> gl(4,3,12)
[1] 1 1 1 2 2 2 3 3 3 4 4 4

19
Levels: 1 2 3 4
Si queremos que este patrn se repita dos veces, etc. entonces se modifica la length:

> gl(4,3,24)
[1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4
Levels: 1 2 3 4

Cuando el ltimo argumento no es mltiplo de la longitud del patrn a repetir el vector aparece
truncado

> gl(4,3,19)
[1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3
Levels: 1 2 3 4

Si se desean letras en vez de nmeros para los niveles use la funcin labels en la siguiente forma,
acudiendo a una lista entre parntesis:

> gl(3,2,24,labels=c("A","B","C"))
[1] A A B B C C A A B B C C A A B B C C A A B B C C
Levels: A B C

Nombres de las Variables


Los nombres son sensible al uso de maysculas y minsculas as: x no es lo mismo que X.
No deben empezar con nmeros o smbolos.
No pueden contener espacios blancos, en vez de ello use un punto, ejemplo back.pay en vez de
(back pay).

Ordenamiento secuencial (Sorting), Clasificacin (Ranking) y Orden (order).

Estos 3 conceptos importantsimos y todos relacionados con uno de ellos (order) resultan difciles
de comprender en primera instancia. Mejor abordarlo con un ejemplo:

> houses<-read.table("c:\\estadistica\\houses.txt",header=T)
> attach(houses)
> names(houses)
[1] "Location" "Price"

> houses
Location Price
1 Ascot 325
2 Sunninghill 201
3 Bracknell 157
4 Camberley 162
5 Bagshot 164
6 Staines 101
7 Windsor 211
8 Maidenhead 188

20
9 Reading 95
10 Winkfield 117
11 Warfield 188
12 Newbury 121

Apliquemos las 3 funciones al vector llamado Price y construyamos una tabla con ellos
ranks<-rank(Price)
sorted<-sort(Price)
ordered<-order(Price)

> view<-data.frame(Price,ranks,sorted,ordered)

> view
Price ranks sorted ordered
1 325 12.0 95 9
2 201 10.0 101 6
3 157 5.0 117 10
4 162 6.0 121 12
5 164 7.0 157 3
6 101 2.0 162 4
7 211 11.0 164 5
8 188 8.5 188 8
9 95 1.0 188 11
10 117 3.0 201 2
11 188 8.5 211 7
12 121 4.0 325 1

Rango (Rank)

Los precios no quedan en una secuencia particular, por hecho de que los rangos son enteros o
promedios asignados de acuerdo con los valores de menor a mayor: 1 es asignado al ms bajo
dato y el rango 12 al ms alto. Aparecen entonces 11 valores ms pequeos que 325 en el vector
Price. Cuando se repiten precios se calculan los rangos como el promedio de los valores que
tendran si no fueran iguales, ejemplo hay 2 188s en Price por lo cual sus rangos seran 8 y 9, por lo
cual mejor se les asigna un rango de (8+9)/2=8.5.

Clasificacin (Sort).

Este es el ms evidente, contiene los valores del vector Price ordenados en forma ascendente. Ya
se sabe reversar esto por medio de algo as: y<-rev(sort(x)). Pero se debe notar que es una
clasificacin potencialmente daina, si no se pone cuidado, porque no va aparejada con los valores
del vector como aparece en el data.frame. Adems no existe una funcin unsort.

Orden (Order).

Es la ms importante de las 3, pero la ms difcil de comprender. La funcin orden (order)


devuelve un vector de enteros que contiene la permutacin que ordenar las entradas en orden
ascendente. Debe reflexionarse sobre ello. El valor menor de Price es 95. Si mira el dataframe y se
21
pregunta usted mismo cual es el suscrito en el vector original ver que es el numero 9. Este es el
primer valor en ordered, ordered[1]. Donde se localiza el prximo ms pequeo valor (101) en
Price? Est en la posicin 6, como aparece en ordered[2]. El tercer ms pequeo valor (117) est
en la posicin 10, y as lo muestra ordered[3]. Etc. Entonces ordered se refiere al vector original.

Esta funcin es particularmente til para ordenar ascendentemente o no los dataframes. El uso de
order con subscritos es una opcin ms segura que usar sort, ya que con esta funcin los valores
de la variable respuesta y los de las variables explicatorias podran no aparejarse con resultados
peligrosos. Lo mejor de esta funcin (order) es que podemos usar order(Price) como un subscrito
por localidad (Location) para obtener la lista de price-ranked de localidad, as:
Location[order(Price)].

> Location[order(Price)]
[1] Reading Staines Winkfield Newbury Bracknell Camberley
[7] Bagshot Maidenhead Warfield Sunninghill Windsor Ascot
12 Levels: Ascot Bagshot Bracknell Camberley Maidenhead Newbury ... Winkfield

Cuando se ve algo como lo anterior se aprecia porque es llamada esta funcin order. Si usted
desea reversar esta orden, lo puede hacer usando la funcin reverse como ac:

> Location[rev(order(Price))]
[1] Ascot Windsor Sunninghill Warfield Maidenhead Bagshot
[7] Camberley Bracknell Newbury Winkfield Staines Reading
12 Levels: Ascot Bagshot Bracknell Camberley Maidenhead Newbury ... Winkfield

La Funcin: sample.

Esta funcin mezcla o baraja el contenido de un vector dentro de una secuencia aleatoria
mientras mantiene todos los valores numricos intactos. Muy til para aleatorizacin en diseos
experimentales, simulacin etc. Miremos de nuevo el vector original y:

> y<-c(8,12,3,15,23,1,5,9,16,13,7,11,2)
>y
[1] 8 12 3 15 23 1 5 9 16 13 7 11 2
Veamos dos muestras de y:

> sample(y)
[1] 12 11 15 2 13 16 9 5 8 1 7 3 23

> sample(y)
[1] 5 8 16 2 11 15 7 1 13 3 9 12 23

El orden de los valores cambia cada que la funcin sample es invocada, pero se mantienen los
mismos nmeros. Esto es llamado Muestreo sin reemplazamiento. Usted puede especificar el
tamao de la muestra como un segundo argumento opcional:

> sample(y,7)
[1] 8 1 9 11 16 13 3

> sample(y,7)
[1] 11 13 1 23 12 7 8
22
La opcin replace=T permite Muestreo con reemplazamiento, el cual es base de procesos como
bootstrapping. El vector producido por la funcin sample with replace=T es de la misma longitud
que la del vector muestreado, pero algunos valores son dejados de lado aleatoriamente mientras
otros aparecen de nuevo dos o ms veces, enseguida se ve el 16, 15 y el 9 dos veces, pero no
aparece el 23 por ejemplo:

> sample(y,replace=T)
[1] 16 9 15 15 7 16 12 2 9 11 3 8 1

> sample(y,replace=T)
[1] 1 15 12 16 3 15 3 23 23 11 8 1 1

Opciones ms avanzadas en la funcin sample permiten especificar diferentes probabilidades con


las cuales cada elemento vaya a ser muestreado: (prob=). Por ejemplo si deseamos tomar 4
nmeros al azar de una secuencia de 1 a 10 sin reemplazamiento cuando la probabilidad de
seleccin (p) para los nmeros de la mitad es 5 veces mayor que para los primeros o ltimos
nmeros y adems deseamos repetir esto 4 veces, escribimos:

p <- c(1, 2, 3, 4, 5, 5, 4, 3, 2, 1)

> x<-1:10

> sapply(1:5,function(i) sample(x,4,prob=p))


[,1] [,2] [,3] [,4] [,5]
[1,] 5 7 9 3 2
[2,] 3 2 4 7 9
[3,] 7 5 2 4 4
[4,] 6 1 3 9 3

En este caso los 4 nmeros aleatorios en la primera tirada fueron 5, 3, 7,5 (columna 1).

Matrices.

Existen varias formas de crear una matriz. Se puede hacer directamente con la funcin matrix,
algo como lo siguiente, en donde por defecto los nmeros entran en forma columnar:

> X<-matrix(c(1,0,0,0,1,0,0,0,1),nrow=3)

>X
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1

Las funciones (class): clase y atributos (attributes) de X indican que tiene 3 filas (rows) y 3
columnas (columns) (estos son sus atributos dimensionales (dim attributes):

> class(X)
[1] "matrix"

> attributes(X)
23
$dim
[1] 3 3

Se puede tambin construir la matriz por filas, lo cual se indica con byrow=T:

> vector<-c(4, 3, 2,1,1,2,3,4,4,3,2,1)


> V<-matrix(vector,byrow=T,nrow=3)
>V
[,1] [,2] [,3] [,4]
[1,] 4 3 2 1
[2,] 1 2 3 4
[3,] 4 3 2 1

Otra forma de convertir un vector a una matriz es proporcionando un vector objeto con dos
dimensiones: filas y columnas (rows and columns) usando una funcin dim como esta:

> dim(vector)<-c(3,4)
> vector
[,1] [,2] [,3] [,4]
[1,] 4 1 3 3
[2,] 3 1 4 2
[3,] 2 2 4 1

pero, se necesita ser cuidadosos pues los datos los habamos introducido por filas en la matriz
anterior con la orden byrow=T y ac entran como si hubieran sido columnas. La matriz que
desebamos entonces sera la transpuesta (transpose, t) de esta matriz:

> vector<-t(vector)

> vector
[,1] [,2] [,3] [,4]
[1,] 4 1 3 3
[2,] 3 1 4 2
[3,] 2 2 4 1

Denominar las filas y columnas de una matriz

Por defecto las matrices tienen nmeros que designan sus filas y columnas. Por ejemplo creemos
una matriz de 20 nmeros aleatorios con una distribucin de Poisson con media=2 y 4 filas, con lo
cual por defecto tendr 5 columnas:

> X<-matrix(rpois(20,2),nrow=4)
>X
[,1] [,2] [,3] [,4] [,5]
[1,] 3 3 0 2 3
[2,] 2 0 1 2 5

24
[3,] 5 2 3 1 3
[4,] 1 0 3 1 2

Supngase que las filas se refieren a 4 tratamientos diferentes y deseamos ponerles etiquetas
(labels) as: trat.1, trat.2 etc. Para ello emplearemos la funcin rownames. Esto se puede logar de
varias formas, por ejemplo con pegar (paste), pero ac nos aprovecharemos de una funcin: prefix
como opcin:

> rownames(X)<-rownames(X,do.NULL=FALSE,prefix="Trat.")
>X
[,1] [,2] [,3] [,4] [,5]
Trat.1 3 3 0 2 3
Trat.2 2 0 1 2 5
Trat.3 5 2 3 1 3
Trat.4 1 0 3 1 2

Para las columnas deseamos generar un vector de diferentes nombres: por ejemplo especies
involucradas con los tratamientos especificando la funcin colnames(X):

> esp.names<-c("guayabo", "naranjo", "mango", "mandarina", "limon")

> colnames(X)<-esp.names
>X
guayabo naranjo mango mandarina limon
Trat.1 3 3 0 2 3
Trat.2 2 0 1 2 5
Trat.3 5 2 3 1 3
Trat.4 1 0 3 1 2
Se puede como alternativa usar la funcin dimnames para nombrar filas y/o columnas de una
matriz. Por ejemplo, ac solo se dar nombre a las especies como esp.1, esp.2, etc. El
argumento para dimnames debe ser una lista (filas primero, columnas segundo, como se
acostumbra) con los elementos de la lista de la longitud correcta (4 y 5 en este caso particular):

> dimnames(X)<-list(NULL,paste("esp.",1:5,sep=""))
>X
esp.1 esp.2 esp.3 esp.4 esp.5
[1,] 3 3 0 2 3
[2,] 2 0 1 2 5
[3,] 5 2 3 1 3
[4,] 1 0 3 1 2

Clculos sobre filas y/o columnas de una matriz.

Ac deben usarse subscritos para seleccionar las partes de la matriz, con un blanco (blank) que
significa todo de las filas (all of the rows) o de las columnas. Por ejemplo media de la columna
5, que como se ve calcula sobre todas filas de la columna 5 (blanco seguido de coma.

25
> mean(X[,5])
[1] 3.25

Si queremos la varianza para la fila 3, calculada sobre todas las columnas de ella, escribimos

> var(X[3,])
[1] 2.2

Existen algunas funciones especiales para calcular resmenes estadsticos en las matrices:

> rowSums(X)
[1] 11 10 14 7
> colSums(X)
esp.1 esp.2 esp.3 esp.4 esp.5
11 5 7 6 13

> colMeans(X)
esp.1 esp.2 esp.3 esp.4 esp.5
2.75 1.25 1.75 1.50 3.25
Recuerde que las columnas son margin no. 2 (las filas son margin no. 1), pero requiere poner el
nmero de tal margin:

> apply(X,2,mean)
esp.1 esp.2 esp.3 esp.4 esp.5
2.75 1.25 1.75 1.50 3.25

> apply(X,1,mean)
[1] 2.2 2.0 2.8 1.4

Puede sumarse grupos de filas dentro de columnas con la eficiente funcin rowsum (singular y
minsculas en contraste a la ya usada rowSums) Por ejemplo, para el caso deseamos agrupar
juntas la fila 1 y la 4 (como grupo A) y, la fila 2 y la 3 (grupo B). Entonces se construye un vector de
agrupamiento que sea de longitud (length) igual al nmero de filas (rows):

> group=c("A","B","B","A")

> rowsum(X, group)


esp.1 esp.2 esp.3 esp.4 esp.5
A 4 3 3 3 5
B 7 2 4 3 8

Suponga que deseemos barajar o mezclar aleatoriamente los elementos de cada columna o fila de
una matriz independientemente. Aplicamos la funcin sample a cada columna (margin no. 2) o
margin no 1, como ac:

> apply(X,2,sample)

26
esp.1 esp.2 esp.3 esp.4 esp.5
[1,] 5 3 3 2 3
[2,] 3 0 1 1 2
[3,] 2 0 3 2 5
[4,] 1 2 0 1 3

> apply(X,1,sample)
[,1] [,2] [,3] [,4]
[1,] 3 1 2 2
[2,] 3 5 1 3
[3,] 0 2 5 1
[4,] 3 2 3 0
[5,] 2 0 3 1

Adicionar filas (rows) y columnas (columns) a una matriz.

Puede adicionarse una fila al final para mostrar estadsticos de las columnas, o una columna a la
derecha. Por ejemplo, medias de las columnas y varianzas de las filas de la matriz X:

> X<-matrix(rpois(20,2),nrow=4)
>X
[,1] [,2] [,3] [,4] [,5]
[1,] 3 3 2 4 2
[2,] 0 2 1 2 4
[3,] 1 3 5 1 1
[4,] 2 1 0 1 0

> X<-rbind(X,apply(X,2,mean))
> X<-cbind(X,apply(X,1,var))
>X
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3.0 3.00 2 4 2.00 0.70000
[2,] 0.0 2.00 1 2 4.00 2.20000
[3,] 1.0 3.00 5 1 1.00 3.20000
[4,] 2.0 1.00 0 1 0.00 0.70000
[5,] 1.5 2.25 2 2 1.75 0.08125
Se nota que el nmero de cifras decimales vara consistentemente con el contenido las columnas
como un todo. Por defecto R coloca el mnimo nmero posible.

Se desea tambin etiquetar la quinta fila y la sexta columna como media y varianza
respectivamente con ls funciones colnames y rownames:

> colnames(X)<-c(1:5,"variance")
> rownames(X)<-c(1:4,"mean")
>X
1 2 3 4 5 variance

27
1 3.0 3.00 2 4 2.00 0.70000
2 0.0 2.00 1 2 4.00 2.20000
3 1.0 3.00 5 1 1.00 3.20000
4 2.0 1.00 0 1 0.00 0.70000
mean 1.5 2.25 2 2 1.75 0.08125

Funcin Arrojar resultados: sweep.

Esta funcin se usa para arrojar o producir arreglos como resmenes breves de vectores, matrices,
arreglos o dataframes. Por ejemplo expresar una matriz en trminos de los alejamientos de cada
valor de la media de cada columna.

Para ello sea una base de datos llamada sweepdat sin encabezamientos en la localizacin actual

> matridata<-read.table("c:\\estadistica\\sweepdat.txt")

> matridata
V1 V2 V3 V4
1 3 12 0.4 125
2 5 12 0.7 166
3 7 15 0.8 174
4 7 14 0.7 128
5 5 18 0.3 136
6 9 13 0.2 155
7 7 15 0.5 115
8 2 13 0.5 169
9 1 10 0.1 182
10 0 11 0.2 166

Lo primero requerido es crear un vector con los parmetros que se desee extraer de la matriz. En
este caso las medias de cada columna. Cuando despus del apuntador se coloca todo entre
parntesis, aparece inmediatamente el resultado.

> (cols<-apply(matridata,2,mean))
V1 V2 V3 V4
4.60 13.30 0.44 151.60

Ahora resulta posible expresar todos los datos de matridata como alejamientos de las medias de
cada columna usando la funcin sweep, cuyo segundo argumento 2, se refiere a margin=2, o sea
que lo extrado ser aplicado a las columnas.

> sweep(matridata,2,cols)
V1 V2 V3 V4
1 -1.6 -1.3 -0.04 -26.6
2 0.4 -1.3 0.26 14.4
3 2.4 1.7 0.36 22.4

28
4 2.4 0.7 0.26 -23.6
5 0.4 4.7 -0.14 -15.6
6 4.4 -0.3 -0.24 3.4
7 2.4 1.7 0.06 -36.6
8 -2.6 -0.3 0.06 17.4
9 -3.6 -3.3 -0.34 30.4
10 -4.6 -2.3 -0.24 14.4

Producto punto de dos matrices:

La funcin para ello entre las matrices A y B por ejemplo es A%*%B Ejemplo, sean A y B:

A<-matrix(c(1,2,3,4,5,6,7,8,9,1,2,2,3,5,6,7,8,9,1,7,1),nrow=3)
>A
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1 4 7 1 3 7 1
[2,] 2 5 8 2 5 8 7
[3,] 3 6 9 2 6 9 1
> B<-matrix(c(6,7,8,9,1,2,2,3,5,6,7,8,9,1),nrow=7)
>B
[,1] [,2]
[1,] 6 3
[2,] 7 5
[3,] 8 6
[4,] 9 7
[5,] 1 8
[6,] 2 9
[7,] 2 1

> A%*%B
[,1] [,2]
[1,] 118 160
[2,] 164 212
[3,] 176 237

Inversa de una matriz kxk:

Para ello la funcin ginv(matriz) en R se encuentra en la library(MASS). Por ejemplo:


A<-matrix(c(2,3,1,7,11,0,13,17,19),nrow=3)
>A
[,1] [,2] [,3]
[1,] 2 7 13
[2,] 3 11 17
[3,] 1 0 19
> library(MASS)
> ginv(A)

29
[,1] [,2] [,3]
[1,] -41.8 26.6 4.8
[2,] 8.0 -5.0 -1.0
[3,] 2.2 -1.4 -0.2

Arreglos (Arrays):

Un arreglo (array) es un objeto numrico que puede llegar a tener atributos dimensionales.
Ejemplo hagamos un vector llamado arreglo con los nmeros 1 a 25.

> arreglo<-1:25

> arreglo
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25:
> is.matrix(arreglo)
[1] FALSE

> dim(arreglo)
NULL
Entonces no es una matriz y carece de atributos dimensionales (NULL). Pero se le pueden dar
dimensiones como en el caso siguiente, (5x5):

> dim(arreglo)<-c(5,5)
> is.matrix(arreglo)
[1] TRUE

> dim(arreglo)
[1] 5 5

Si miramos de Nuevo, veremos que arreglo qued como una tabla bidimensional, pero no es un
objeto tabla:

> arreglo
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25

> is.table(array)
[1] FALSE

Se aprecia que los valores entran secuencialmente como columnas, por defecto as lo presenta R.
Luego, un vector es un arreglo unidimensional (uno-dimensional) que carece de atributos dim.

30
Una matriz es un arreglo dos-dimensional. Arreglos de 3 o ms dimensiones carecen de nombres
especiales en R; se llamaran entonces tres-dimensionales, etc.

La prctica constante debe llevarnos a dominar el uso de subscritos, para dominar muchas
herramientas poderosas en R para el trabajo con dataframes, vectores, matrices, arreglos y listas.
Por ejemplo sea un arreglo tres-dimensional con las primeras 24 letras minsculas del alfabeto,
excluidas la ll y la , que va ser dimensionado en tres matrices cada una de 4x2:

> A<-letters[1:24]
>A
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x"

> dim(A)<-c(4,2,3)
>A
,,1

[,1] [,2]
[1,] "a" "e"
[2,] "b" "f"
[3,] "c" "g"
[4,] "d" "h"

,,2

[,1] [,2]
[1,] "i" "m"
[2,] "j" "n"
[3,] "k" "o"
[4,] "l" "p"

,,3

[,1] [,2]
[1,] "q" "u"
[2,] "r" "v"
[3,] "s" "w"
[4,] "t" "x"

Vamos a seleccionar todas las letras hasta la p. Entonces sern todas las filas y todas las columnas
de las tablas 1 y 2, por lo cual los subscritos apropiados sern [,,1:2], o sea todo de filas y todo de
columnas de las tablas 1 a 2:

> A[,,1:2]
,,1

31
[,1] [,2]
[1,] "a" "e"
[2,] "b" "f"
[3,] "c" "g"
[4,] "d" "h"

,,2

[,1] [,2]
[1,] "i" "m"
[2,] "j" "n"
[3,] "k" "o"
[4,] "l" "p"

Supongamos que deseamos solo las letras de la q a la x, o sea todo de filas y columnas de la tercer
tabla por lo cual los subscritos apropiados sern [, ,3]:

> A[,,3]
[,1] [,2]
[1,] "q" "u"
[2,] "r" "v"
[3,] "s" "w"
[4,] "t" "x"

Ahora deseamos solamente las letras c, g, k, o, s, w. Estas son las terceras filas de todas las 3
tablas, por lo cual los subscritos apropiados sern [3,,]: filas 3 de todo ,,:
A[3,,]
[,1] [,2] [,3]
[1,] "c" "k" "s"
[2,] "g" "o" "w"
Debe notarse que si borramos la primera dimensin completa, (solo hay justamente una fila en
A[3,,]) por lo cual se altera la forma de la matriz resultante (2filas x 3 columnas, para el caso). Esta
es una particularidad de R, que puede evitarse con la funcin drop = F para retener todas las tres
dimensiones:

> A[3,,,drop=F]
,,1

[,1] [,2]
[1,] "c" "g"

,,2

[,1] [,2]
[1,] "k" "o"

32
,,3

[,1] [,2]
[1,] "s" "w"

Por ltimo, suponga que solo deseamos todas las filas de la segunda columna de la tabla1, A[,2,1],
la primera columna de la tabla 2, A[,1,2], y la segunda columna de la tabla, A[,2,3]. Entonces en
cada caso deseamos todas las filas, por lo cual el primer subscrito ser blanco ((blank), pero
deseamos diferentes nmeros de columnas (cs) en las diferentes tablas (ts) como sigue:

> cs<-c(2,1,2)

> ts<-c(1,2,3)

> sapply (1:3, function(i) A[,cs[i],ts[i]])


[,1] [,2] [,3]
[1,] "e" "i" "u"
[2,] "f" "j" "v"
[3,] "g" "k" "w"
[4,] "h" "l" "x"

Funcin apareadora: (match function).

Esta funcin responde a la pregunta Donde aparecen los valores del segundo vector en el
primero?. Es ms fcil comprenderla con un ejemplo:

> primero<-c(5,8,3,5,3,6,4,4,2,8,8,8,4,4,6)
> segundo<-c(8,6,4,2)

> match(primero,segundo)
[1] NA 1 NA NA NA 2 3 3 4 1 1 1 3 3 2

> match(segundo,primero)
[1] 2 6 7 9

Lo primero a notar es que la funcin match produce un vector de subscritos (index values) y que
estos estn dentro del segundo vector. La longitud (length) del vector producido por la funcin es
la del primer vector (15 en el primer caso). Si los elementos del primer vector no ocurren nunca
en los del segundo, entonces aparece un vector solo con NA.

> tercero<-c(0,9,1,10)
> match(primero,tercero)
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

Cuando se usara esto? Supngase que se administrar una droga A a todos los pacientes del
primer vector que sean identificados en el segundo, y otra droga B al resto (o sea, a los

33
identificados por NA en la salida de match encima ya que no aparecen en el segundo). Entonces
creamos un vector llamado droga con dos elementos A y B y seleccionar la droga apropiada con
base en s o no se aparean (primero con segundo), o sea se da NA:

> droga<-c("A","B")
> droga[1+is.na(match(primero,segundo))]
[1] "B" "A" "B" "B" "B" "A" "A" "A" "A" "A" "A" "A" "A" "A" "A"

Escritura de funciones en R.

Las funciones en R son objetos que ejecutan operaciones con base en los argumentos que les son
proporcionados a ellos, para retornar uno o ms valores. La sintaxis para escribir una funcin es:

Funcin f(x) (lista de argumentos) cuerpo.

El primer componente de la declaracin de la funcin es la palabra clave (function) que le indica a


R que se va a crear una funcin. Una lista de argumentos, es una lista, separada por comas, de
argumentos formales, que pueden ser un smbolo (algo como nombres de variables ej: x o y), una
declaracin (por ejemplo forma de algn smbolo = expresin (ej pch=16) o un argumento formal
como (triple punto). El cuerpo puede ser cualquier expresin vlida de R o conjunto de
expresiones de R. Generalmente, el cuerpo es un grupo de expresiones contenidas entre llaves { },
(en algunas sencillas se pueden omitir las {}) con cada expresin en lneas separadas. Las funciones
son tpicamente asignadas a smbolos, aunque no tiene que ser as. Esto solo se entiende
enfrentado algunos ejemplos:

Media Aritmtica de una muestra simple.

Ya conoce el clculo de ella como la suma de unos nmeros (y) dividida por el tamao de la
muestra (n). La funcin R para n es length(y) y para la suma es sum(y), de manera que una funcin
(que llamaremos media.arit) para calcular la media aritmtica se construye as:

media.arit<-function(x) sum(x)/length(x).

Sea:
y<-c(3,3,4,5,5)

> media.arit(y)
[1] 4
Claro que R tienen algo mas sinttico para ella: mean(y):
> mean(y)
[1] 4

Mediana de una muestra simple.

La mediana (o percentil 50) de un vector de n impar ordenado de nmeros es el valor medio de los
valores ordenados de los nmeros, entonces primero deben ordenarse (sort) y luego que extraiga
de la lista el de la mitad [el elemento de la mitad] entre [ ]:

34
> sort(y)[ceiling(length(y)/2)]
[1] 4

Pero la mediana depende de si los valores parecen en nmero par o impar. Entonces debe
construirse una funcin en la cual se usa la funcin mdulo. Se construye la funcin median:

> median<-function(x) {
+ odd.even<-length(x)%%2
+ if (odd.even == 0) (sort(x)[length(x)/2]+sort(x)[1+ length(x)/2])/2
+ else sort(x)[ceiling(length(x)/2)]
+}

> median(y)
[1] 4

Note que si la declaracin if es verdadera (o sea, cuando tenemos un numero par de nmeros)
entonces la expresin inmediatamente continua evaluando el (el cdigo para calcular la mediana
con nmeros pares de nmeros). Pero si la declaracin es falsa (o sea si tenemos nmero impar de
valores y odd.even == 1) entonces la expresin sigue su propia funcin evaluada, (el cdigo para
calcular la mediana con nmero impar de nmeros). Hagmoslo con un nmero impar de nmeros
retirando de y el primer elemento o sea con vector y[-1],(usando los suscritos negativos):

> median(y)
[1] 4
> median(y[-1])
[1] 4.5

El R dispone de su propia funcin incorporada llamada como ac, median.

Media Geomtrica.

Ya sabemos que es para procesos que cambian multiplicativamente ms que aditivamente. Una
forma de calcularla aparte de la convencional involucra logaritmos encontrando el antilog (exp)
del promedio de los logaritmos (log) de los datos. Ejemplo: el numero de insectos en 5 plantas fue
encontrado como: 10, 1, 1000, 1, 10.

> insects<-c(1,10,1000,10,1)

> exp(mean(log(insects)))
[1] 10

Entonces una funcin para calcular la media geomtrica del vector insects (x) sera:

> megeom<-function (x) exp(mean(log(x)))


> megeom(insects)
[1] 10

35
Media Harmonica.

Conocemos como media harmonica al reciproco del promedio de los recprocos. Una funcin R
para calcularla, ejemplo anterior de la hormiga, que recorre un cuadrado a velocidades de
(1,2,4,1)m/s sera:
> media.har<-function (x) 1/mean(1/x)
> media.har(c(1,2,4,1))
[1] 1.454545

Varianza (Var(x) o s2).

Es quizs el ms importante de los parmetros para anlisis estadsticos. Mientras mayor resulte
este valor mayor ser la incertidumbre en el clculo de los parmetros estimados de unos datos y
menor nuestra habilidad para distinguir entre las hiptesis planteadas. Se obtiene como la suma
de desviaciones con respecto a la media al cuadrado sobre grados de libertad.

Grados de libertad (g.l o d.f.)

En ingles degrees of freedom (d.f.) Se puede definir como g.l.= nk, o sea tamao de muestra
menos nmero de parmetros, k, estimados de los datos. Para la varianza dado que se necesita la
2
media para calcularla tiene n1 g.l. La raz cuadrada de s es la desviacin estndar s.d. Sea un
vector y:

> y<-c(9,13,8, 7,5,12,12,9,15,6,11,9,7,12,11)

> varianza<-function(x) sum((x-mean(x))^2)/(length(x)-1)

> varianza(y)
[1] 8.066667
Pero R tiene su funcin: var incorporada para ella:

> var(y)
[1] 8.066667

Uso de la Varianza.

Se usa para dos aspectos importantes: para establecer intervalos (lmites) de confianza para un
parmetro con el uso del error estndar de medias, para lo cual no hay funcin incorporada para R
y, para verificar hiptesis. Construyamos la funcin para el clculo del error estndar:

> se<-function(x) sqrt(var(x)/length(x))

> se(y)
[1] 0.7333333

Podemos usar la funcin se para investigar cmo cambia el error estndar de la media con el
tamao muestral. Para ello generaremos un vector de datos del cual saquemos progresivamente

36
grandes muestras, usando circuitos (loops) para tomar muestras de tamaos 2, 3, 4 etc. hasta 30,
a cada una de las cuales les calculemos el se muestral: sem.

> xv<-rnorm(30)
> sem<-numeric(30)
> sem[1]<-NA
> for(i in 2:30) sem[i]<-se(xv[1:i])
> plot(1:30,sem,ylim=c(0,0.8),
+ ylab="Error estandar de la media",xlab="Tamao muestral n",pch=16)
> lines(2:30,1/sqrt(2:30))
0.8
0.6
Error estandar de la media

0.4
0.2
0.0

0 5 10 15 20 25 30

Tamao muestral n

Se aprecia en este ejemplo que el n despus de 15 decrece poco, pero que antes de ello hacia
izquierda se incrementa rpidamente. La curva suavizada se calcula fcilmente pues los valores en
xv provienen de una normal de z con media 0 y desviacin estndar 1, por lo cual el promedio de
la curva sera 1/raz(n), lo cual se agrega con la funcin lines ya mostrada:

Errores en grficos de barras.

Aunque R no dispone una funcin para estos, algunos paquetes usan la funcin arrows para
lograrlo. Ac se da una funcin simple, con 3 argumentos: la altura de las barras: bars (yv), las
longitudes (encima y abajo) de los errores de las barras (z) y las etiquetas (labels) para las barras
en el eje x (nn):

error.bars<-function(yv,z,nn){
xv<-
barplot(yv,ylim=c(0,(max(yv)+max(z))),names=nn,ylab=deparse(substitute(yv)
))
g=(max(xv)-min(xv))/50
for (i in 1:length(xv)) {
lines(c(xv[i],xv[i]),c(yv[i]+z[i],yv[i]-z[i]))
lines(c(xv[i]-g,xv[i]+g),c(yv[i]+z[i], yv[i]+z[i]))
lines(c(xv[i]-g,xv[i]+g),c(yv[i]-z[i], yv[i]-z[i]))
}}

37
Se verificar con los siguientes datos de un archivo llamado competition, de competencia de
plantas ante diversos tratamientos de raleo:

comp<-read.table("c:\\estadistica\\competition.txt",header=T)
attach(comp)
names(comp)
[1] "biomass" "clipping"
se<-rep(28.75,5)
labels<-as.character(levels(clipping))
ybar<-as.vector(tapply(biomass,clipping,mean))
error.bars(ybar,se,labels) 600
500
400
ybar

300
200
100
0

control n25 n50 r10 r5

Circuitos o bucles (loops) y repeticiones.

En R se usan circuitos, bucles o loops, clsicos similares a los de Fortran, aunque cambia un poco la
sintaxis. La idea permanece, se requiere que un ndice, i, tome una secuencia de valores y que una
o ms lneas de comandos sean ejecutadas tantas veces como sean diferentes los valores i. Ac, se
muestra un bucle ejecutado 4 veces con valores de i desde 1 hasta 4, para los cubos de cada valor:

> for (i in 1:4) print(i^3)


[1] 1
[1] 8
[1] 27
[1] 64

Para lneas mltiples de cdigos, debe usarse llaves redondeadas (curly brackets {}) para encerrar
el material sobre el cual actuar el circuito. Debe notarse que la tecla Enter (retorno duro) al final
de cada lnea de comandos es una parte esencial de la estructura (Usted puede reemplazar el
retorno duro por punto y coma (;) si se desea pero por claridad es mejor cada comando en una
lnea separada): Por ejemplo:

j<-k<-0
38
for (i in 1:4) {
j<-j+1
k<-k+i*j
print(i+j+k)
}
[1] 3
[1] 9
[1] 20
[1] 38

Ahora usaremos una funcin for loop para escribir el factorial x (x!):
x!=x*(x1)*(x2)*(3).21

fac1<-function(x) {
f <- 1
if (x<2) return (1)
for (i in 2:x) {
f <- f*i}
f}

> fac1(8)
[1] 40320

Miremos los factoriales de 1 a 8

> sapply(0:8,fac1)
[1] 1 1 2 6 24 120 720 5040 40320

Existen otras dos funciones para bucles en R: repeat y while. Se demuestra su uso con propsito
de ilustracin, pues existen funciones mejores que esta para encontrar factoriales. Primero
veamos la funcin while: La clave acerca de los bucles en while es que la variable lgica que
controla su operacion es altereda dentro del bucle.

fac2<-function(x) {
f <- 1
t <- x
while(t>1) {
f <- f*t
t <- t-1 }
return(f) }

Para usar while, se requiere actualizar una variable indicadora (t, para el caso) y cambiar sus
valores dentro de cada iteracin (t<-t-1 Ac se emplear para nmeros de 0 a 8.

> fac2(8)
[1] 40320

39
Uso de la funcin repeat:

fac3<-function(x) {
f <- 1
t <- x
repeat {
if (t<2) break
f <- f*t
t <- t-1 }
return(f) }

Ya que la funcin repeat no contiene limite explicito, nos debemos cuidar de programar bucles
infinitos por medio de algn comando lgico que conduzca a la ruptura del circuito.
En lo posible al programar en R es bueno evitar los loops o bucles

Test o prueba para razn de Varianzas.

Vimos como verificar si dos varianzas difieren mediante una prueba F. la respectiva funcin que
escribiremos al respecto mostrara el valor de p asociado con la comparacin de la mayor y de la
menor de las dos varianzas

> ra.de.var<-function(x,y) { (
+ v1<-var(x)
+ v2<-var(y)
+ if (var(x) > var(y)) {
+ rv<-var(x)/var(y)
+ df1<-length(x)-1
+ df2<-length(y)-1}
+ else { rv<-var(y)/var(x)
+ df1<-length(y)-1
+ df2<-length(x)-1}
+ -2*(1-pf(rv,df1,df2)) }

Sean dos vectores normales con 25 datos cada uno, igual media, pero varianzas 2 y 4
respectivamente

> a<-rnorm(25,15,2)
> b<-rnorm(25,15,4)

> ra.de.var(a,b)
[1] 0.0001995782

Enseguida podemos comparar nuestro p obtenido con el p-value dado por la funcin incorporada
ya en R para la funcin similar llamada var.test.

40
> var.test(a,b)

F test to compare two variances

data: a and b
F = 0.1999, num df = 24, denom df = 24, p-value = 0.0001996
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
0.08810787 0.45372200
sample estimates:
ratio of variances
0.1999412

Funcin switch (conmutar, interrumpir).

Cuando se desea que una funcin haga diversas cosas, en circunstancias diversas, se acude a la
funcin switch. Por ejemplo se mostrar cmo se escribe una funcin que calcule cada una de las
4 medidas de tendencia central: medias aritmtica, geomtrica, harmnica y la mediana. La
variable nominal o carcter llamada medida (measure) podr tomar uno de los valores de las
mencionadas medias o mediana, especificando el nmero de switch (p.e: 1 para medias, 4 para la
mediana).

mt.central<-function(y, medida) {
switch(medida,
Mean = mean(y),
Geometric = exp(mean(log(y))),
Harmonic = 1/mean(1/y),
Median = median(y),
stop("Medida no incluida")) }

> mt.central(rnorm(100,10,2),"Harmonic")
[1] 9.62077

mt.central(rnorm(100,10,2),"Median")
[1] 10.07519

> mt.central(rnorm(100,10,2),4)
[1] 10.84499

Alcance, campo de accin, extensin (Scope).

Las reglas de alcance (scoping rules) son usadas para encontrar el valor de los smbolos usados, los
cuales pueden ser limitados o acotados o no (bound o unbound). Todos los argumentos formales
para una funcin propician smbolos limitados (bound symbols) en el cuerpo de la funcin.
Cualesquier otros smbolos en el cuerpo de la funcin son bien sea variables o variables sin

41
acotamiento. Una variable local es aquella que es definida dentro de la funcin, tpicamente
localizadas en la parte izquierda de la asignacin.

Cuando R detecta durante su proceso de evaluacin si un smbolo es no acotado, intenta


encontrar un valor para el: el ambiente de la funcin es investigado primero, luego es cercado
limitado y as continua hasta que acabe la evaluacin del ambiente global. El valor de primer
apareamiento ser el usado por R.

Argumentos opcionales.

Se mostrar una funcin llamada charplot que es una grafica de dispersin (scatterplot) de x y y,
usando crculos rojos slidos. Como smbolos de la grfica: hay dos argumentos esenciales (x y y) y
dos opcionales (pc y co) para controlar la seleccin del smbolo a graficar (pc) y su color, los
argumentos opcionales dan sus valore por defecto usando = en la lista de argumentos. Para
ejecutar la funcin solo necesita proveer los vectores de x y y,:

charplot<-function(x,y,pc=16,co="red"){
plot(y~x,pch=pc,col=co)}

charplot(1:10,1:10) le dar crculos rojos.


10
8
6
y

4
2

2 4 6 8 10

Puede acudir a distintos smbolos adicionando un tercer argumento.

charplot(1:10,1:10,17)
10
8
6
y

4
2

2 4 6 8 10

42
Si se desea cambiar nicamente el color (el cuarto argumento) se debe especificar el nombre de la
variable ya que los argumentos opcionales no tienen que ser presentados secuencialmente (solo
cuando se especifica el nombre de lo contario si). Si queremos color verde y crculos slidos, debe
escribir:

charplot(1:10,1:10,co="green")

10
8
6
y

4
2

2 4 6 8 10

Retorno de Valores de una Funcin.

Si se desea que una funcin retorne slo un valor nico (ej. media o un mximo), simplemente se
deja la ltima lnea de la funcin sin asignar o sea sin <- (gets arrow) en ella. Por ejemplo sea una
funcin para retornar el valor de la mediana de la funcin incorporada en R de los mximos
paralelos de un vector funcin pmax de dos vectores dados como argumentos:

parmax<-function (a,b) {
c<-pmax(a,b)
median(c) }

x<-c(1,9,2,8,3,7)
y<-c(9,2,8,3,7,2)

parmax<-function (a,b) {
c<-pmax(a,b)
median(c) }
parmax(x,y)
[1] 8

Si se desea retornar dos o ms variables de una funcin, debera usar return con una lista que
contenga las variables a ser retornadas. Supngase que deseamos la mediana de ambos, los
paralelos mximos y mnimos de dos vectores x y y, escribiramos:

med.par<-function (a,b) {
c<-pmax(a,b)
d<-pmin(a,b)
answer<-list(median(c),median(d))
names(answer)[[1]]<-"mediana de paralelos maximos"
43
names(answer)[[2]]<-" mediana de paralelos mnimos "
return(answer) }

> med.par(x,y)
$`mediana de paralelos maximos`
[1] 8

$` mediana de paralelos mnimos `


[1] 2

Funciones Annimas.

Estas generan un vector de valores pero sin asignarle nombre, por ejemplo:

(function(x,y){ z <- 2*x^2 + y^2; x+y+z })(0:7, 1)


[1] 2 5 12 23 38 57 80 107

La funcin primero usa los valores aportados por x y y para calcular z, luego de lo cual retorna el
valor de x+y+z evaluado para 8 valores of x (de 0 a 7) and un valor of y (1). Estas funciones
annimas se usan frecuentemente con apply, sapply and lapply.

Manejo flexible de los argumentos para las funciones.

Por la laxitud de la evaluacin (lazy evaluation) practicada por R, resulta simple trabajar con
argumentos faltantes en invocacin de funciones, dando al usuario la oportunidad de especificar
el mnimo absoluto numero de argumentos, dejando de lado los que son por defecto si se
deseaUn ejemplo simple toma una funcin plotx2 que deseamos se produzca cuando le
proveamos bien sea uno o dos argumentos. En el caso de solo un-argumento (nicamente un
entero x>1 proporcionado), deseamos graficar (plot) z2 contra z for z=1 para x in pasos de a 1. En
el segundo caso, cuando y es suplido, deseamos graficar y contra z para z=1 hasta x.

plotx2 <- function (x, y=z^2) {


z<-1:x
plot(z,y,type="l") }

par(mfrow=c(1,2))
plotx2(12)
plotx2(12,1:12)

44
12
140
120

10
100

8
80
y

6
60
40

4
20

2
0

2 4 6 8 10 2 4 6 8 10

z z
Ac se especific que el tipo de grfica deseada era una lnea (type="l" usando minscula, no L o
1) pues por defecto se produce una grfica de dispersin con crculos abiertos como smbolo de la
grfica, symbol (type="p"). Si desea que su grafica sea de puntos con lneas que los unan entonces
debe usar type="b" (para ambos lneas and puntos). Otros tipos de graficos (plot) podran incluir
lneas verticales desde el eje x hasta el valor de la variable respuesta y (type="h"), creando un
efecto similar a una carta de barras o un histograma y, type="s" para producir una linea dibujada
como escalas entre valores sucesivos rankeados de x. Para graficar (plot) los ejes escalados, pero
sin lneas o puntos use type="n"

Evaluacin de funciones con las funciones: apply, sapply y lapply.

apply

La funcin apply es usada para aplicar funciones a la filas o columnas de matrices o dataframes.
Ejemplo:

(X<-matrix(1:24,nrow=4))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 5 9 13 17 21
[2,] 2 6 10 14 18 22
[3,] 3 7 11 15 19 23
[4,] 4 8 12 16 20 24
Ntese que al escribir la expresin a evaluar entre parntesis (como encima) provoca que el valor
del resultado aparezca inmediatamente en la pantalla, evitando una lnea extra para ello.

A menudo se desea aplicar funciones a travs de una de las dos mrgenes de la matriz (margen 1,
para las filas y margen 2 para las columnas. Por ejemplo sean los totales fila, (4 en este caso):

apply(X,1,sum)
[1] 66 72 78 84

Para las columnas, 5 en este caso:

45
apply(X,2,sum)
[1] 10 26 42 58 74 90

debe notar que en ambos casos las respuestas luego de aplicar apply es un vector y no una matriz.
Tambin puede aplicar funciones a los elementos individuales de la matriz en vez de a los
mrgenes. El margen especificado influencia solo la forma de la matriz resultante.

apply(X,1,sqrt)
[,1] [,2] [,3] [,4]
[1,] 1.000000 1.414214 1.732051 2.000000
[2,] 2.236068 2.449490 2.645751 2.828427
[3,] 3.000000 3.162278 3.316625 3.464102
[4,] 3.605551 3.741657 3.872983 4.000000
[5,] 4.123106 4.242641 4.358899 4.472136
[6,] 4.582576 4.690416 4.795832 4.898979

apply(X,2,sqrt)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.000000 2.236068 3.000000 3.605551 4.123106 4.582576
[2,] 1.414214 2.449490 3.162278 3.741657 4.242641 4.690416
[3,] 1.732051 2.645751 3.316625 3.872983 4.358899 4.795832
[4,] 2.000000 2.828427 3.464102 4.000000 4.472136 4.898979

Una la traspuesta de la otra.

Si se desea barajar los nmeros dentro de cada una de las filas , se usa sample sin
reemplazamiento:

apply(X,1,sample)
[,1] [,2] [,3] [,4]
[1,] 9 6 15 24
[2,] 17 14 7 4
[3,] 1 18 19 20
[4,] 21 22 11 16
[5,] 5 10 23 12
[6,] 13 2 3 8

De Nuevo, la matriz resultante resulto de 6x4, o sea una traspuesta. Lo que hizo fue:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 5 9 13 17 21
[2,] 2 6 10 14 18 22
[3,] 3 7 11 15 19 23
[4,] 4 8 12 16 20 24, etc
Se puede propiciar una funcin definida por el usuario dentro de apply similar a esta:

apply(X,1,function(x) x^2+2*x-1)

46
[,1] [,2] [,3] [,4]
[1,] 2 7 14 23
[2,] 34 47 62 79
[3,] 98 119 142 167
[4,] 194 223 254 287
[5,] 322 359 398 439
[6,] 482 527 574 623

La anterior entonces es funcin annima pues no tiene denominacin.

Funcin sapply

La funcin sapply se usa para vectores. Ac se muestra el cdigo para generar una lista de
secuencias desde 1:4 hasta 1:8

sapply(4:8, seq)
[[1]]
[1] 1 2 3 4

[[2]]
[1] 1 2 3 4 5

[[3]]
[1] 1 2 3 4 5 6

[[4]]
[1] 1 2 3 4 5 6 7

[[5]]
[1] 1 2 3 4 5 6 7 8

La funcin sapply resulta de la mayor utilidad con clculos iterativos complejos. Los siguientes
datos muestran las disminuciones de emisiones radioactivas durante un perodo de 50 das para el
cual intentamos modelar, con una estimacin minimocuadrtica no lineal, la rata de disminucin
radiactiva a con el modelo supuesto y=exp(ax):

decra<-read.table("c:\\estadistica\\sapdecay.txt",header=T)
attach(decra)
names(decra)
[1] "x" "y"
> decra
x y
1 0 1.00000000
2 2 0.96023540
3 4 0.84466377
4 6 0.70693633

47
5 8 0.70864140
..
23 44 0.08829140
24 46 0.07179059
25 48 0.05932741
26 50 0.06170623

Necesitamos escribir una funcin para calcular la suma de cuadrados de las diferencias entre los
valores observados (y) y los predichos de y que llamaremos (yf), para un valor especfico provisto
para el parmetro a:

sumcu <- function(a,xv=x,yv=y)


{ yf <- exp(-a*xv)
sum((yv-yf)^2) }

Por medio de regresin se encontr que a podra estar cercano a 0.058, por lo cual se va a generar
un rango de valores para l en un espacio cercano.

a<-seq(0.01,0.2,.005)
plot(a,sapply(a,sumcu),type="l")
6
5
4
sapply(a, sumcu)

3
2
1
0

0.05 0.10 0.15 0.20

a
Esta grfica muestra que la estimacin mnimo cuadrtica de a esta cercana a 0.06 Para obtener el
mnimo valor de a usamos min con subscritos [entre parntesis cuadrados]:

a[min(sapply(a,sumcu))==sapply(a,sumcu)]
[1] 0.055:

Por ltimo usaramos este valor para generar una curva suavizada para la funcin exponencial
ajustada de nuestros datos:

plot(x,y)

48
xv<-seq(0,50,0.1)
lines(xv,exp(-0.055*xv))

1.0
0.8
0.6
y

0.4
0.2

0 10 20 30 40 50

x
Listas (Lists) y lapply

Empezaremos creando un objeto lista que tiene 3 partes: Informacin nominal (carcter) en un
vector llamado a, numrica en uno llamado b y, lgica en el vector llamado c:

a<-c("a","b","c","d")
b<-c(1,2,3,4,4,3,2,1)
c<-c(T,T,F)
list.object<-list(a,b,c)

class(list.object)
[1] "list"

list.object
[[1]]
[1] "a" "b" "c" "d"

[[2]]
[1] 1 2 3 4 4 3 2 1

[[3]]
[1] TRUE TRUE FALSE

La funcin lapply aplica una funcin especificada a cada uno de los elementos en turno (sin
necesidad de especificar bucles y sin necesidad de conocer cuntos elementos hay en la lista).

49
Una funcin til para aplicar a listas es la funcin longitud (length) porque con ella se responde a:
cuntos elementos comprende cada componente de la lista? Mas tcnicamente deseamos
conocer la longitud de cada uno de los vectores que hacen parte de lista.

lapply(list.object,length)
[[1]]
[1] 4

[[2]]
[1] 8

[[3]]
[1] 3

Lo anterior muestra que el objeto lista consiste de 3 vectores ([[1]], [[2]] and [[3]]), muestra que
en el primer vector hay 4 elementos, 8 en el segundo y 3 en el tercero. Pero, 4, y 8 de qu? Para
encontrarlos aplicamos la funcin class a la lista:

lapply(list.object,class)
[[1]]
[1] "character"

[[2]]
[1] "numeric"

[[3]]
[1] "logical"

Aplicar funciones numricas a listas solo actuara sobre la parte de ellas cuyos objetos son de clase
numrica o, objetos (parecidos a los valores lgicos) que por coercin se convierten en nmeros.
Se muestra lo que sucede al aplicar lapply a la funcin mean a la lista objeto:

> lapply(list.object,mean)
[[1]]
[1] NA

[[2]]
[1] 2.5

[[3]]
[1] 0.6666667

Mensajes de aviso perdidos


In mean.default(X[[1L]], ...) :
argument is not numeric or logical: returning NA

50
Solo los vectores de la lista 2 y 3 tienen media porque el 2 era cuantitativo y el 3 por chersion
convirti los trues en 1s.

Guardada de datos producidos dentro de R a un disco.

A veces es conveniente generar nmeros dentro de R para usarlos luego en una hoja aparte, por
ejemplo como ac que se va a generar 1000 enteros aleatorios de una distribucin binomial
negativa con media mu= 1.2 y el factor de agregacin (k) llamado size = 1.0. Se desea guardar una
columna nica de 1000 filas en un archivo llamado nubineg.txt en un archivo temporal, o donde
usted disponga en el disco c (c: drive):

> nubineg<-rnbinom(50, size=1, mu=1.2)

Para exportar estos nmeros se usa la funcin write como sigue especificando que van a ser
puestos fuera en una sola columna (tercer argumento 1, pues por defecto esto tendr 5
columnas):

write(nubineg,"c:\\estadistica\\nubineg.dat",1)

Pegado (pasting) dentro de una hoja de Excel.

Para escribir un vector desde R al portapapeles (clipboard) de Windows se usa la funcin


writeClipboard(x), donde x es un vector de caracteres, por lo cual usted necesita hacerlo columna
a columna en Excel. Se recuerda que frases o sartas (character strings) en estructuras de datos
(dataframes) se convierten en factores a menos que se proteja de ello por medio de la funcin
as.is(name) al ingresarlos. Por ejemplo

x<-c(4,3,7,9)
writeClipboard("x")
Vaya al excel y pegue (Crtl*V). Aparecer el nombre de la variable x
regrese a R y escriba:
writeClipboard(as.character(x))

se pegan los datos de x, y as para cada columna, como aparecer en el EXCEL

x
4
3
7
9

Escribir un archivo legible en Excel desde R

Suponga que usted desea transferir una estructura de datos dese su consola en R (dataframe)
llamado data al Excel:

51
write.table(data,"clipboard",sep="\t",col.names=NA)
Vaya al Excel,y pegue con (Ctrl+V) o la tecla para ello. Ejemplo sea el archivo de datos decra, ya
puesto en R, entonces se escribir:

write.table(decra,"clipboard",sep="\t",col.names=NA)

En EXCEL tendremos:
x y
1 0 1
2 2 0.9602354
3 4 0.84466377
4 6 0.70693633
5 8 0.7086414
Entrada de datos (Data input).

Ya sabe crear vectores con la funcin de contenacin y scan(). Ahora desde archivos puede usar la
funcin scan pero resulta algo complejo. Pero existe la funcin read.table bastante amigable para
ello. Esta funcin lee un archivo en formato tabla (table format) y automticamente crea un
dataframe de l, con los casos en las filas (lines) y las variables como columnas (fields) en el
archivo (file).

La forma ms simple de proceder consiste en hacer su dataframe como una hoja en Excel, y
guardarla (save) como texto tabulado delimitado: tab-delimited text file. As evitar molestias que
se encuentran usando otros formatos de entrada (input formats)

Guardar (Save) el archivo Excel.

Debe guardar su archivo de datos (dataframe) en un formato legible por R. La forma ms simple es
grabar o salvar en Excel como tab-delimited text files: File/Save As _ _ _ / busca el men para
tipos de archivos y escoge Text (Tab delimited). Ac no necesita adicionar un sufijo pues l lo
coloca autoamticamente: .txt Se recomienda hacerlo en Excel 2007 o anterior si su versin de R
no es muy actual. Ejemplo sea el siguiente dataframe en Excel ya salvado en una rachivo del c
llamado estadisitica como texto y tabulado:

parcela asnm temp prec numesp


1 1148 20 941 1779
2 751 19 1114 2188
3 777 23 532 625
4 999 13 743 1184
5 1942 25 1064 1448
6 1462 12 1229 1213
7 1504 14 1237 1216
8 1799 14 976 690
9 579 22 1005 1874

52
10 894 28 1249 1718
11 706 15 390 1216
12 1463 25 1076 470

este archivo puede ser ledo por R directamente como un dataframe que llamaremos datos,
usando la funcin read.table, como se muestra

> datos<-read.table("c:\\Estadistica\\ejedaframe.txt",header=T)
> datos
attach(datos)
names(datos)
[1] "parcela" "asnm" "temp" "prec" "numesp"
parcela asnm temp prec numesp
1 1 1148 20 941 1779
2 2 751 19 1114 2188
3 3 777 23 532 625
4 4 999 13 743 1184
5 5 1942 25 1064 1448
6 6 1462 12 1229 1213
7 7 1504 14 1237 1216
8 8 1799 14 976 690
9 9 579 22 1005 1874
10 10 894 28 1249 1718
11 11 706 15 390 1216
12 12 1463 25 1076 470

Construyamos un anava simple. Se hizo un experimento para comparar el crecimiento de 4


especies en un terreno para ver cul sera la mejor. Los datos se dan en:

dataov<-read.table("c:\\Estadistica\\aovesal.txt",header=T)
attach(dataov)
names(dataov)
[1] "creci" "especies"

model1<-aov(creci~especies)

summary(model1)
Df Sum Sq Mean Sq F value Pr(>F)
especies 3 64.323 21.4411 19.053 2.849e-07 ***
Residuals 32 36.011 1.1254

summary.lm(model1)

Call:
aov(formula = creci ~ especies)

53
Residuals:
Min 1Q Median 3Q Max
-1.85311 -0.69703 0.07822 0.85897 1.62189

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.9208 0.3536 5.432 5.65e-06 ***
especiesE2 1.2392 0.5001 2.478 0.0187 *
especiesE3 2.5943 0.5001 5.188 1.15e-05 ***
especiesE4 -0.9670 0.5001 -1.934 0.0620 .
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 1.061 on 32 degrees of freedom


Multiple R-squared: 0.6411, Adjusted R-squared: 0.6074
F-statistic: 19.05 on 3 and 32 DF, p-value: 2.849e-07

Verificacin y forzado (Testing and Coercing) en R.

Los objetos en R tienen un tipo (type) que puede averiguarse usando la funcin is.type (Tabla 2.4
de Crowley), lo cual es muy til por ejemplo: funciones matemticas esperan entradas numricas
y procesadoras de texto entrada de caracteres. Sin embargo, algunos tipos de objetos pueden
forzarse a otros de ellos (cohersin). Una de las mas familiares ocurre cuando interpretamos los
valores de variables lgicas (T=TRUE; verdadero y F=FALSE; falso) como numricas 1 y 0,
respectivamente. Los niveles de los factores nominales (Factor levels) pueden forzarse a nmeros,
los nmeros a caracteres, pero los caracteres no-numricos no podrn forzarse a ser numricos.

Tabla 2.4. Funciones para verificar (is) los atributos de diferentes categoras de objetos (arrays,
lists, etc.) y para forzar (as) los atributos de un objeto a una forma especificada. Ninguna
operacin cambia los atributos del objeto.

Tipo Verificacin Forzado


Array is.array as.array
Character is.character as.character
Complex is.complex as.complex
Dataframe is.data.frame as.data.frame
Double is.double as.double
Factor is.factor as.factor
List is.list as.list
Logical is.logical as.logical
Matrix is.matrix as.matrix
Numeric is.numeric as.numeric
Raw is.raw as.raw
Time series (ts) is.ts as.ts
Vector is.vector as.vector

Ejemplos:

54
as.numeric(factor(c("a","b","c")))
[1] 1 2 3

as.numeric(c("a","b","c"))
[1] NA NA NA
Warning message:
NAs introduced by coercion

as.numeric(c("a","4","c"))
[1] NA 4 NA
Warning message:
NAs introduced by coercin

Barrida rebuscadora (Browsing) para encontrar archivos.

La funcin R para ello es file.choose(). Por ejemplo, se har con la funcin read.table:
data<-read.table(file.choose(),header=T)

Inmediatamente empieza a abrir rutas hasta que usted llegue al lugar adecuado: la carpeta de
archivos donde usted tiene los datos. Una vez los ubique y seale, ser ubicado dentro del
dataframe llamado data.

Ubicacin o actualizacin del directorio de trabajo

No se necesita estar escribiendo el nombre del disco ni de la carpeta cada vez que usted desee
leer o escribir un archivo, cuando usa frecuentemente la misma ruta, en vez de ello puede
ajustarlo como directorio de trabajo usando la funcin setwd: Por ejemplo, si cree una carpeta
llamada estadistica en el disco c, entonces basta escribir:

setwd("c:\\estadistica")
y a continuacin solo el resto de la funcin:

read.table("alva.txt",header=T)
crec trat local
1 24.97 a medellin
2 24.84 a Medellin, etc.

Si desea hallar el nombre del directorio corriente de trabajo use la funcin getwd():

getwd()
[1] "c:/estadistica"

Verificacin de archivos (Files) desde la lnea de comandos.

Resulta til verificar si el nombre del archivo dado est ubicado en la ruta donde se cree que
estara. La funcin para ello es file.exists y se usa por ejemplo como esto:
file.exists("c:\\estadistica\\alva.txt")
55
[1] TRUE

Estructuras de datos (Dataframes)


Aprender a manipular sus datos, como ingresarlos a su computador, y como leerlos en R son de los
temas ms importantes que usted debera dominar.

R maneja los datos en objetos conocidos como dataframe, un objeto con filas y columnas, (similar
a una matriz). Las filas contienen las diferentes medidas u observaciones de su experimento. Las
columnas contendrn los valores de las diferentes variables.

Mientras los valores en el cuerpo de una matriz pueden ser solo nmeros, en un dataframe,
adems de estos, pueden aparecer textos (como los nombres de los niveles de los factores para
variables categricas, ejemplo: sano o enfermo en una variable llamada estado), fechas calendario
(como 23/5/04), o variables lgicas verdadero o falso (TRUE o FALSE). Ac se muestra parte de una
hoja de trabajo en forma de un dataframe con 7 variables, la de la extrema izquierda contiene los
nmeros de las filas mientras las otras variables son numricas (Area, Slope, Soil pH y Worm
density), categricas (Field Name y Vegetation) o, lgicas (Damp is either true=T or false=F).

etc.

La clave est en que valores de una misma variable estn en la misma columna. Por ejemplo si
tengo una variable llamada tratamientos, todos estos deben ir en una sola columna bajo este
nombre, como en las mostradas anteriormente. Nuevamente se recomienda el uso de Excel para
facilitar estas labores. Se insiste que la forma ms simple es gravar o salvar sus dataframes en
Excel como archivos tipo tab-delimited text: (File/Save As/, luego desde Save as type options
escoja Text (Tab delimited).No es necesario el sufijo.txt, automticamente Excel lo pondr. Este
archivo como ya se vio puede leerse directamente en R como un dataframe, usando la funcin
read.table.

Nota, recuerde que puede fallar en su intento por este camino si una variable compuesta tiene
espacios en blanco. Entonces en vez de escribir, por ejemplo pH del suelo puede hacerlo como
pH.del.suelo. Tambin R se toma sus licencias, por ejemplo en vez de TRUE, puede abreviarlo a
T, o viceversa etc.

Los resmenes de sus dataframes se obtienen con summary(datos). Los valores de variables
continuas se resumen bajo 6 encabezados: uno paramtrico (la media aritmtica) y 5 no-
paramtricos (mximo, mnimo, mediana, percentil 25 o primer cuartil, y percentil 75 o tercer
cuartil). Note que no aparecen los nombres de todas las columnas puesto que estos son nicos
para cada fila; en archivos mas grandes R le dira por ejemplo ms otros 14 plus 14 others. Los
niveles de las variables son contados. Ej:
worms<-read.table("c:\\estadistica\\worms.txt",header=T)
56
> attach(worms)
> names(worms)
[1] "Field.Name" "Area" "Slope" "Vegetation" "Soil.pH"
[6] "Damp" "Worm.density"

> summary(worms)
Field.Name Area Slope Vegetation
Ashurst : 1 Min. :0.800 Min. : 0.00 Arable :3
Cheapside : 1 1st Qu. :2.175 1st Qu : 0.75 Grassland :9
Church.Field : 1 Median :3.000 Median : 2.00 Meadow :3
Farm.Wood : 1 Mean :2.990 Mean : 3.50 Orchard :1
Garden.Wood : 1 3rd Qu. :3.725 3rd Qu. : 5.25 Scrub :4
Gravel.Pit : 1 Max. :5.100 Max. :11.00
(Other) :14
Soil.pH Damp Worm.density
Min. :3.500 Mode :logical Min. :0.00
1st Qu.:4.100 FALSE:14 1st Qu.:2.00
Median :4.600 RUE :6 Median :4.00
Mean :4.555 NA's :0 Mean :4.35
3rd Qu.:5.000 3rd Qu.:6.25
Max. :5.700 Max. :9.00

Funciones por y agregadas (by y aggregate).

Las dos funciones: by y aggregate permiten resmenes del dataframe sobre la base de niveles de
un factor. Por ejemplo: conocer las medias de las variables numricas por cada tipo de
vegetacin. La funcin para ello ser:

by(worms,Vegetation,mean)

Vegetation: Arable
Field.Name Area Slope Vegetation Soil.pH Damp
NA 3.866667 1.333333 NA 4.833333 0.000000
Worm.density
5.333333
------------------------------------------------------------
Vegetation: Grassland
Field.Name Area Slope Vegetation Soil.pH Damp
NA 2.9111111 3.6666667 NA 4.1000000 0.1111111
Worm.density
2.4444444
------------------------------------------------------------
Vegetation: Meadow
Field.Name Area Slope Vegetation Soil.pH Damp
NA 3.466667 1.666667 NA 4.933333 1.000000
Worm.density

57
6.333333
------------------------------------------------------------
Vegetation: Orchard
Field.Name Area Slope Vegetation Soil.pH Damp
NA 1.9 0.0 NA 5.7 0.0
Worm.density
9.0
------------------------------------------------------------
Vegetation: Scrub
Field.Name Area Slope Vegetation Soil.pH Damp
NA 2.425 7.000 NA 4.800 0.500
Worm.density
5.250

Subscritos e ndices.

La clave para trabajar efectivamente con dataframes es manejar bien los subscritos (o ndices,
como tambin los llaman algunos). En R, aparecen entre parntesis cuadrados ([ ]). Como un
dataframe es un objeto bi-dimensional, comprende filas y columnas. Las filas son referenciada por
el primer subscrito (mano izquierda), Las columnas por el segundo (mano derecha), por ello:
worms
Field.Name Area Slope Vegetation Soil.pH Damp Worm.density
1 Nashs.Field 3.6 11 Grassland 4.1 FALSE 4
2 Silwood.Bottom 5.1 2 Arable 5.2 FALSE 7
3 Nursery.Field 2.8 3 Grassland 4.3 FALSE 2
4 Rush.Meadow 2.4 5 Meadow 4.9 TRUE 5
5 Gunness.Thicke 3.8 0 Scrub 4.2 FALSE 6
6 Oak.Mead 3.1 2 Grassland 3.9 FALSE 2
7 Church.Field 3.5 3 Grassland 4.2 FALSE 3
8 Ashurst 2.1 0 Arable 4.8 FALSE 4
9 The.Orchard 1.9 0 Orchard 5.7 FALSE 9
10 Rookery.Slope 1.5 4 Grassland 5.0 TRUE 7
11 Garden.Wood 2.9 10 Scrub 5.2 FALSE 8
12 North.Gravel 3.3 1 Grassland 4.1 FALSE 1
13 South.Gravel 3.7 2 Grassland 4.0 FALSE 2
14 Observatory.Ri 1.8 6 Grassland 3.8 FALSE 0
15 Pond.Field 4.1 0 Meadow 5.0 TRUE 6
16 Water.Meadow 3.9 0 Meadow 4.9 TRUE 8
17 Cheapside 2.2 8 Scrub 4.7 TRUE 4
18 Pound.Hill 4.4 2 Arable 4.5 FALSE 5
19 Gravel.Pit 2.9 1 Grassland 3.5 FALSE 1
20 Farm.Wood 0.8 10 Scrub 5.1 TRUE 3

> worms[3,5]
[1] 4.3
Soil.pH fila 3 columna 5

Para extraer un rango de valores, por ejemplo de la fila 14ava a la 19ava de la variable
worm.density (la 7 columna), usamos el operador dos puntos (:) para generar la serie de
subscritos (14, 15, 16, 17, 18 y 19):
58
worms[14:19,7]
[1] 0 6 8 4 5 1

Para extraer un grupo de filas y un grupo de columnas, debe generarse una serie de subscritos
para ambos indicadores: suponga que deseamos: Area y Slope (columnas 2 y 3) entre las filas 1 a
5:

worms[1:5,2:3]
Area Slope
1 3.6 11
2 5.1 2
3 2.8 3
4 2.4 5
5 3.8 0

Pngase cuidado a la siguiente instruccin: Para seleccionar todas las entradas en una fila la
sintaxis es numero coma blanco. Similarmente para seleccionar todas las entradas de una
columna la sintaxis es blanco coma numero.

worms[3,]
Field.Name Area Slope Vegetation Soil.pH Damp Worm.density
3 Nursery.Field 2.8 3 Grassland 4.3 FALSE 2

se interpreta como de la fila 3, todas las columnas. Mientras que para seleccionar todas las filas en
la columna 3 entramos:

worms[,3]
[1] 11 2 3 5 0 2 3 0 0 4 10 1 2 6 0 0 8 2 1 10

Pueden crearse grupos de filas o columnas. Por ejemplo extraer todas las filas para las variables:
Field Name y Soil pH (columnas 1 y 5) use funcin de concatenacin, c, para crear un vector con el
numero de las columnas requeridas c(1,5) entre corchetes cuadrados, se lee como extraer todas la
filas de las columnas 1 y 5:

> worms[,c(1,5)]
Field.Name Soil.pH
1 Nashs.Field 4.1
2 Silwood.Bottom 5.2
3 Nursery.Field 4.3
4 Rush.Meadow 4.9
5 Gunness.Thicket 4.2
6 Oak.Mead 3.9
7 Church.Field 4.2
8 Ashurst 4.8
9 The.Orchard 5.7
10 Rookery.Slope 5.0
11 Garden.Wood 5.2

59
12 North.Gravel 4.1
13 South.Gravel 4.0
14 Observatory.Ridge 3.8
15 Pond.Field 5.0
16 Water.Meadow 4.9
17 Cheapside 4.7
18 Pound.Hill 4.5
19 Gravel.Pit 3.5
20 Farm.Wood 5.1

Un Dataframe con nombres de filas en lugar de nmero de fila.

Se puede suprimir la creacin de los nmeros de fila y colocar sus propios nombres nicos a cada
una, alterando la sintaxis de la funcin read.table. La primera columna de la base de datos worms
contiene los nombres de los campos en los cuales las otras variables fueron medidas. Hasta ahora
hemos ledo esta columna como si fuera la primera variable, pero eliminaremos el archivo y lo
abrimos con la nueva sintaxis:

detach(worms)
worms<-read.table("c:\\estadistica\\worms.txt",header=T,row.names=1)
worms
> worms
Area Slope Vegetation Soil.pH Damp Worm.density
Nashs.Field 3.6 11 Grassland 4.1 FALSE 4
Silwood.Bottom5.1 2 Arable 5.2 FALSE 7
Nursery.Field 2.8 3 Grassland 4.3 FALSE 2
Rush.Meadow 2.4 5 Meadow 4.9 TRUE 5
Gunness.Thicket3.8 0 Scrub 4.2 FALSE 6
..
La columna con nombres de los campos ya no tiene nombre de encabezado y los numero de las
filas como se pretenda se suprimieron

Grficos.

La funcin plot es la usada por R y depende del nmero de variables y del patrn elegido para
obtener uno de los siguientes: Grficos con dos variables, grficos para una muestra simple,
grficas multivariadas y grficas especiales.

Grficas con 2 Variables.

En este caso se acostumbra la variable respuesta o dependiente en el eje y y la variable


explicatoria en el eje x, y el grfico producido depende de la naturaleza de esta ltima.

Cuando la variable explicatoria es continua (algo medible, por ejemplo una longitud o una edad) la
funcin adecuada para ello es una grfica de dispersin (scatterplot). Cuando la variable
explicatoria es categrica, como un color o el gnero, se acostumbra bien sea un diagrama de
cajas o muescas y bigotes (box-and-whisker plot) para la dispersin de los datos crudos o, un
grfico de barras (barplot) para enfatizar el tamao de los efectos. Las funciones ms
frecuentemente utilizadas en R para dos variables son:
60
plot(x,y) dispersin de y versus x.

plot(factor, y) cajas y bigotes de y para los niveles dados del factor.

barplot(y) Alturas u ordenadas para un vector de valores de y.

Grficas con dos variables explicatorias continuas (scatterplots).

La funcin plot produce los ejes y adiciona la dispersin de los puntos. Existen dos funciones
extras para adicionar: puntos (points) y lneas (lines), a una grfica ya existente. Hay dos formas
de especificarlas:
Grficas cartesianas (Cartesian plot(x,y)),
Grficas por medio de una frmula (plot(y~x)).

Las diferencias radican en que si usamos grficas cartesianas plot(x,y) es como si mapificramos
primero a los Estes, luego a los Nortes, en resumen x, luego y. Por el contrario el modelo
basado en frmulas presenta y luego x, o sea la funcin plot y el modelo ajustado se comportan
de la misma manera (variables respuesta tilde(~) variable explicatoria).

En su forma ms simple la funcin plot necesita nicamente dos argumentos: primero el nombre
de la variable explicatoria (x en este caso), y el segundo el nombre de la variable respuesta (y en
esta caso): plot(x,y). Los datos debern estar para ser ledos por R en un archivo como el siguiente,
con 2000 coordenadas:

data1<-read.table("c:\\estadistica\\scatter1.txt",header=T)
attach(data1)
names(data1)
[1] "xv" "ys"

> data1
xv ys
1 90.77212000 51.75918
2 16.11536000 28.95312
3 31.12350000 35.50002
..
1999 99.20837000 50.20170
2000 48.45682000 40.97587

Para producir la grfica de dispersin no podra hacerse ms simple: escribir:

plot(xv,ys,col="red")

61
Los valores de x primero luego los de y (xv y ys) y un argumento adicional y opcional para el color
de los puntos. Las etiquetas de los ejes sern los nombres de las variables a menos que deseemos
evitarlo usando las funciones xlab y ylab. Por ejemplo cambiar xv por Variable explicatoria y ys
por Variable respuesta. Para lo cual escribimos:

plot(xv,ys,col="red",xlab="Variable explicatoria",ylab="Variable respuesta")

La versatilidad de R permite adicionar elementos a la grfica en una forma simple. Por ejemplo,
adicionar una lnea de regresin a travs de la nube de puntos por medio de la funcin abline la
cual puede tomar como argumento el objeto modelo lineal lm(ys~xv).

abline(lm(ys~xv))

As como es de fcil adicionar lneas a la grfica, tambin lo es adems de importante, adicionar


ms puntos. Estos los tendramos por ejemplo en otro archivo:
62
data2<-read.table("c:\\estadistica\\scatter2.txt",header=T)
attach(data2)
names(data2)
[1] "xv2" "ys2"

Para adicionar estos puntos nuevos (xv2,ys2) basta la funcin:


points(xv2,ys2,col="blue")

y, adems, podemos agregarle la lnea de regresin a estos puntos extras con algo como:

abline(lm(ys2~xv2))

Este ejemplo muestra algunas caractersticas importantes de la funcin plot. Por ejemplo, note
que varios de los valores ms bajos del segundo archivo (azules) no aparecen en el grfico. Ello
sucede porque a menos que usted especifique otra cosa, R escoge el escalamiento pretty para
los ejes basado en el rango de datos del primer conjunto a graficar, dejando de lado los del otro
conjunto que no cumplan este rango. Una forma de arreglar este problema es acudir a una grfica
de todos los datos con tipo =n (type="n"), ejes en blanco, por medio de la cual se acogen y
escalan los puntos de ambos archivos usando la funcin de concatenacin (concatenation
function), luego se usan las de puntos y lneas para adicionar los datos a los ejes en blanco como
esto:

> plot(c(xv,xv2),c(ys,ys2),xlab="x",ylab="y",type="n")
> points(xv,ys,col="red")
> points(xv2,ys2,col="blue")
> abline(lm(ys~xv))
> abline(lm(ys2~xv2))

Ahora todos los puntos de ambos archivos de datos aparecen en la grfica. Otra forma es escalar
por usted mismo en vez de esperar la escogencia de R (pretty), utilizando xlim y ylim. Cada uno
de estos requiere un vector de longitud 2 que contenga los valores mnimos y mximos para cada
eje. Estos valores sern redondeados automticamente para hacerlos pretty para el etiqueteo.

63
Leyendas.

Adicionar una leyenda a la grfica para explicar las diferencias entre ambos colores de puntos es
muy til. La clave para comprender esta funcin legend es que, el nmero de lneas de texto
dentro de la caja de la leyenda est determinado por la longitud del vector que contiene las
etiquetas (2 en este caso: c("tratamiento","control"). Los otros dos vectores deben ser de la
misma longitud que aquel: para los smbolos de graficado pch=c(1,1) y para los colores col=c(2,4).
La funcin legend puede ser usada con localizador (locator(1)) para seleccionar exactamente el
rea dentro de la grafica donde se ubicara la leyenda. Debe dar click en el botn del mouse en el
punto escogido a la izquierda superior de la caja.

legend(locator(1),c("tratamiento","control"),pch=c(1,1),col=c(2,4))

Resulta til conocer los 6 primeros colores usados por la funcin plot (col=): 1 negro (black, por
defecto), 2 rojo (red), 3 verde (green), 4 azul (blue), 5 azul plido (pale blue), 6 purpura
(purple).
Ac los crculos rojos (col = 2) son los valores de los tratamientos y los crculos azules (col = 4) son
los valores del control. Ambos estn representados por smbolos de grafica abiertos pch=c(1,1).

Graficas de funciones matemticas. Funcin curve.

Vamos a graficar la curva x3 3x entre x=2 y x=2. Para ello basta con escribir:

curve(x^3-3*x, -2, 2)

64
La forma como R lo hace, un poco ms sofisticado es usando algo como esto:
x<-seq(-2,2,0.01)
y<-x^3-3*x
plot(x,y,type="l")

Pruebas clsicas.

Las as llamadas pruebas clsicas se relacionan con algunas de las ms frecuentemente usadas
formas de anlisis para muestras simples y problemas de comparacin de dos muestras.

Muestras simples.

Las preguntas ms frecuentes al respecto seran:

Cual es el valor medio?

Es el valor medio significativamente diferente del esperado o terico?

Cual es el nivel de incertidumbre asociado con el estimado de una media?

Y con el fin de estar razonablemente seguros que nuestras inferencias son correctas necesitamos
conocer algunos aspectos de la distribucin de los datos:

Son los valores normalmente distribuidos o no?

Existen observaciones remotas en los datos?

Si los datos fueron colectados sobre un periodo de tiempo, existe evidencia de correlacin
serial?

65
La no normalidad, observaciones remotas y correlacin serial podran invalidar todas las
inferencias hechas por estadsticos paramtricos estndar, similares a la t de student. Resulta
mucho mejor en casos con no normalidad y/o observaciones remotas acudir a pruebas no
paramtricas tales como las de Wilcoxon por ejemplo. Si existe correlacin serial en los datos se
debe acudir a anlisis de series de tiempo o modelos de anlisis de efectos mezclados.

Resmenes de los datos.

Para ver lo que involucra el resumen estadstico de una prueba simple usaremos un archivo
llamado das.txt:

data<-read.table("c:\\estadistica\\das.txt",header=T)
> attach(data)
> names(data)
[1] "y"

Usualmente deberamos empezar con grficos simples como, una grfica indexada (index plot): un
grfico de dispersin con un argumento simple en el cual los datos son graficados en el orden en el
cual fueron tomados o aparecen en el dataframe, una grfica de cajas y bigotes (box-and-whisker
plot) y una grafica de frecuencias (un histograma con paralelogramos o cajas (bins) cuyos anchos
los elige R). Se empezar con cuatro grficos por salida con la siguiente orden:

par(mfrow=c(2,2))
plot(y)
boxplot(y)
hist(y,main="")

Vamos a alterar la base de datos, cambiando la observacin 52 por 21.75 en otro vector y2 y
graficamos
y2<-y
y2[52]<-21.75
plot(y2)

66
La grfica indexada (superior derecha) es particularmente valiosa para descubrir errores posibles
en el dataframe. Supngase que el 52-esimo valor hubiera sido entrado como 21.75 en lugar del
correcto 2.175: el error se vuelve evidente en la grfica indexada (abajo a la derecha). Estos
resmenes grficos no podran ser ms simples. Acudimos a las funciones incorporadas en R al
respecto como la llamada funcin summary:

summary(y)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.904 2.241 2.414 2.419 2.568 2.984
summary(y2)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.904 2.246 2.418 2.615 2.575 21.750

que, da 6 piezas de informacin acerca del vector llamado y. El ms pequeo de los datos es 1.904
etiquetado como Min, el mayor 2.984 (Max). Tambin se dan dos medidas de tendencia central,
la mediana 2.414 y la media aritmtica (mean) 2.419 y el primer y tercer cuartiles (1st Qu. y 3rd
Qu.). En el vector alterado y2 el max(21.75).

Una alternativa son los 5 nmeros resumen de Tukey five-number summary que comprende
mnimo, menor bsico, mediana, mayor bsico y mximo de los datos. Los bsicos (Hinges) son
cercanos al primer y tercer cuartil (compare con summary, encima), pero diferentes para
pequeas muestras (ver abajo):

fivenum(y)
[1] 1.903978 2.240931 2.414137 2.569583 2.984053

Grficas para verificar normalidad.


67
La ms simple prueba de normalidad (y de alguna manera una de las mejores pruebas) es la
grfica cuantil-cuantil (quantilequantile plot). Esta presenta muestras ranqueadas de nuestra
distribucin contra un nmero similar de cuantiles ranqueados sacados de una distribucin
normal. Si nuestra muestra es normalmente distribuida se producir una lnea recta. Los
alejamientos (departures) de la normalidad se muestran con varias formas de no linealidad
(ejemplo, formas de S estilizadas o formas de banano). Las funciones necesarias para ello son:
qqnorm y qqline (grfica cuantilcuantil contra una distribucin normal):

par(mfrow=c(1,1))
> qqnorm(y)
> qqline(y,lty=2)

En este caso se muestra una pequea tendencia hacia una forma de S estilizada que no es
evidencia por lo suave de no-normalidad (nuestra distribucin es algo segada a la izquierda como
se ver en un histograma siguiente).

Prueba (Test) para normalidad.

Otra prueba muy famosa es la de Shapiro Wilks: funcin shapiro.test para verificar si los datos de
un vector provienen de una normal. Para verlo generaremos unos datos distribuidos lognormales
para ver como falla la prueba de normalidad:
> x<-exp(rnorm(30))
> shapiro.test(x)

Shapiro-Wilk normality test

data: x
W = 0.8127, p-value = 0.0001126.

68
Este (p<0.000001) es un estimado de la probabilidad de que un resultado particular, o un
resultado ms extremo que el observado, pudiera haber ocurrido por azar si la hiptesis nula fuera
verdadera. En resumen, el p value es una medida de la credibilidad de la hiptesis nula. Si algo es
suficientemente incierto para que haya ocurrido por azar (dgase, p<0.05), decimos que es
estadsticamente significativo. Por ejemplo al comparar dos medias muestrales, en que la hiptesis
nula plantea igualdad de medias un bajo p value<0.05 significa que falla la hiptesis anterior (o sea
es improbablemente cierta) y la diferencia estadstica resulta significativa. Un gran p value
(p=0.23) significa que no hay evidencia que nos obligue a rechazar la nula. Se recuerda que no es
lo mismo afirmar no rechazamos la hiptesis nula y la hiptesis nula es verdadera. Podramos
haber fallado para rechazar una falsa hiptesis nula con una muestra demasiado pequea o
errores de medicin. Por ello los p values son interesantes pero no dicen todo de la muestra, pues
el tamao de ella as como la magnitud de los efectos es importante para juzgar los datos.

Bootstrap en verificacin de hiptesis.

Probablemente ha odo alguna vez la frase mtase en sus propios zapatos, de ah provendra esta
palabra bootstrap. La idea es muy simple. Usted tiene una muestra de tamao n pero puede
manipularla de mltiples maneras, por ejemplo permitiendo que algunos valores aparezcan ms
de una vez mientras otros son dejados de lado (o sea muestreos con reemplazamiento). Todo lo
que har ser calcular una gran cantidad de veces la media muestral, una por cada muestra de
tamao n de sus datos, para las cuales ir obteniendo sus intervalos de confianza, y buscando los
valores extremos estimados de las medias usando una funcin llamada cuantil (quantile) para
extraer los intervalos deseados (por ejemplo un intervalo al 95% de confianza se especifica
utilizando c(0.0275, 0.975) para localizar los limites inferior y superior). Por ejemplo tenemos un
archivo de edades de unas personas fumadoras llamado bootal cuya media es 31.30.

edfum<-read.table("c:\\estadistica\\bootal.txt",header=T)
> attach(edfum)
> names(edfum)
[1] "edad"

Podramos preguntarnos algo como esto: Que tan probable sera que la media de la poblacin
(de donde proviene esta muestra) que intentamos estimar, sea tan alta como 40? Para
responderlo vamos a tomar 5000 muestras aleatorias con reemplazamiento de tamao n=100 de
los 100 valores de edad y calculamos 5000 valores de las medias. Entonces nos preguntamos cul
es la probabilidad de obtener una media tan grande como 40 inspeccionando la cola derecha de la
probabilidad acumulada de nuestras 5000 bootstrapped medias. Es ms fcil de la cuenta por
medio de:

>edad.fumadores<-numeric(5000)
> for(i in 1:5000) edad.fumadores[i]<-mean(sample(edad,replace=T))
> hist(edad,main="")

69
Hacemos un resumen de descriptores no paramtricos de la muestra como este:
summary(edad)
Min. 1st Qu. Median Mean 3rd Qu. Max.
15.27 25.17 30.79 31.30 40.07 44.78

En este se ve que la mediana casi coincide con la media, un poco menor (o sea que se presenta un
pequeo sesgo como lo muestral el histograma). El rango intercuartil (diferencia entre el primer y
tercer cuartiles: 40.07-25.17= 14.9), resulta til para detectar observaciones remotas: una buena
prueba del pulgar es que una observacin ser remota cuando est ms alejada que 1.5 veces el
rango intercuartil) del tercer cuartil o por debajo del primero (14.9*1.5=22.35). En este caso no se
presentaron observaciones remotas. Deseamos verificar la hiptesis que el estimado de nuestra
edad promedio est bastante alejado del valor propuesto de 40 aos. Se podra usar una prueba
de t en caso de no alejamientos de la normalidad o si ocurren con una prueba de Wilcoxon. Se
usar esta ltima por intuicin con base en la grfica:

wilcox.test(edad,mu=40)

Wilcoxon signed rank test with continuity correction

data: edad
V = 433, p-value = 6.419e-13
alternative hypothesis: true location is not equal to 40

Rechazamos la hiptesis nula y a aceptamos la alternativa pues el p = 0.00000 (o sea mucho


menor a 0.05). La edad del fumador promedio es significativamente menor a 40 aos. El valor de
prueba 40 aos est bastante lejos a la derecha por lo cual una media como esta es claramente
improbable dados los datos con un max(edad) =44.78.

Momentos de orden superior para una distribucin: cuantificacin de no-normalidad.


70
Ya se conoce que la media aritmtica de una muestra simple es el primer momento, mientras la
varianza constituye el segundo, con respecto a la media. Momentos de mayor orden involucran
potencias mayores a 2 para la suma de las diferencias entre las desviaciones con respecto a la
media.

Sesgo (skew)

El sesgamiento (skewness) es la versin adimensional del tercer momento con respecto a la


media:
n

(y i y )3
m3 i 1

n ,
Su adimensionalidad resulta al dividir por el cubo de la desviacin estndar de y que resultara
medida en unidades cubicas de y
s3 (sd )3 ( s 2 )3
El sesgo se obtiene entonces como:
m3
sesgo 1
s3
Este mide la cantidad que una distribucin tiene de largo dejando colas a un lado u otro. Una
distribucin normal es simtrica y tiene 1 0 . Valores negativos de este indicador significan
sesgos a la izquierda mientras los positivos representan sesgos a la derecha.

Para verificar si un valor particular del sesgo es significativamente = 0 (cero, lo cual significa no
normalidad) se divide el sesgo estimado por su aproximado error estndar:
6
se1
n
Es entonces evidente escribir una funcin en R para calcular el grado de sesgo para cualquier
vector de nmeros, x, similar a esto:

skew<-function(x){
71
m3<-sum((x-mean(x))^3)/length(x)
s3<-sqrt(var(x))^3
m3/s3 }

Note el uso de la funcin length(x) como tamao n de muestra (longitud del vector). La ltima
expresin dentro de la funcin no est asignada a un nombre de variable y ser retornada como el
valor de sesgo (x) (skew(x)) cuando se ejecuta desde la lnea de comandos.

> skew(edad)
[1] -0.2352727

Ahora se precisa saber si un sesgo como este (-0.2352727) difiere significativamente de 0.


Hacemos una prueba de t, dividiendo el sesgo observado por su error estndar

ts<-skew(edad)/sqrt(6/length(edad))
> ts
[1] -0.9604966

Finalmente nos preguntamos la probabilidad de tener una t = -0.9604966 por azar solamente
cuando el valor del sesgo realmente es cero.

1-pt(-0.9604966,99)
[1] 0.8304273

Concluimos que estos datos no se apartan significativamente de la normalidad, (p>0.05).

Kurtosis

Esta es una medida de no normalidad debido al empinamiento o aplanamiento de la distribucin.


La forma de campana de la normal puede alterarse a una distribucin aplanada o platikurtica o
muy puntiaguda: leptokurtica. La kurtosis (kurtosis) es la versin adimensional del cuarto
momento con respecto a la media:
n

(y i y )4
m4 i 1
,
n
Su adimensionalidad resulta al dividir m4 por el cuadrado de la varianza de y (que resultara
medida en unidades a la cuarta de y):
s4 (var( y))2 (s 2 )2
La kurtosis se obtiene entonces como:
m4
kurtosis 2 3
s4
m4
El termino -3 se debe a que la distribucin normal tiene 3 , con la deseable propiedad de dar
s4
kurtosis=0 para ella, mientras una curva aplanada (platykurtica) tiene valor negativo para la
kurtosis, y una puntiaguda positivo. El aproximado error estndar de de la kurtosis es:
72
24
se 2
n
Una funcin en R para calcularla sera:

kurtosis<-function(x) {
m4<-sum((x-mean(x))^4)/length(x)
s4<-var(x)^2
m4/s4 - 3 }

> kurtosis(edad)
[1] -1.139413
Se calcula el valor de t:
tk<-kurtosis(edad)/sqrt(24/length(edad))
> tk
[1] -2.325818

Similar al caso anterior nos preguntamos la probabilidad de tener una t = -2.325818 por azar
solamente cuando el valor de la kurtosis realmente es cero:

> 1-pt(-2.325818,99)
[1] 0.9889659
Podemos concluir que, para nuestros datos, la kurtosis no es significativamente diferente de la
normal.

Dos muestras.

Las pruebas clsicas para dos muestras incluyen:


Comparacin de dos varianzas (Prueba de Fisher, y prueba de varianzas: var.test)
Comparacin de dos medias muestrales con errores normales (Prueba de t: t.test)
Comparacin de dos medias muestrales con errores no normales (Prueba de rangos de
Wilcoxon: wilcox.test)
Comparacin de dos proporciones (Prueba binomial: prop.test)
Correlacin entre dos (Correlacin de Pearson o correlacin de rangos de Spearman: cor.test)
Verificacin de independencia en tablas de contingencia (Prueba chi-cuadrada: chisq.test, o
Prueba exacta de Fisher: fisher.test).

Comparacin de dos varianzas.

Se hace por medio de de la prueba de Fisher. Todo lo que se necesita es dividir la varianza mayor
entre la menor, si fueran iguales esta relacin sera cercana a 1. Se compara contra el valor crtico
obtenido con la funcin de R: qf, la cual sale de la distribucin de F.

jardines<-read.table("c:\\estadistica\\f.test.data.txt",header=T)
> attach(jardines)
> names(jardines)
73
[1] "gardenB" "gardenC"
> jardines
gardenB gardenC
1 5 3
2 5 3
3 6 2
4 7 1
5 4 10
6 4 4
7 3 3
8 5 11
9 6 3
10 5 10

> var(gardenB)
[1] 1.333333
> var(gardenC)
[1] 14.22222

Calculamos la razn de F como sigue:

> F.ratio<-var(gardenC)/var(gardenB)
> F.ratio
[1] 10.66667

Por lo visto la varianza en C es 10 veces mayor que la de B. El valor crtico de F tiene 9 g.l. en
ambos trminos de la razn (numerador y denominador) y lo obtenemos como:

> qf(0.975,9,9)
[1] 4.025994

La hipotesis nula es que las varianzas en ambas muestras son iguales de modo que aceptaramos
la alternativa si resultaran significativamente diferentes. En este caso nos basaremos en el p-value
asociado con la F calculada para lo cual usamos la funcin pf, en este caso doblando la
probabilidad del resultado por tratarse de una prueba de dos colas:

2*(1-pf(F.ratio,9,9))
[1] 0.001624199
que respalda nuestra hiptesis alternativa ya que la probabilidad que las varianzas sean iguales es
p<0.002.

Existe al respecto una funcin incorporada ya al R llamada var.test(variable1, variable2) para


agilizar este proceso:

var.test(gardenB,gardenC)

F test to compare two variances


74
data: gardenB and gardenC
F = 0.0938, num df = 9, denom df = 9, p-value = 0.001624
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
0.02328617 0.37743695
sample estimates:
ratio of variances
0.09375
En esta prueba el valor del denominador es la varianza del primer nombre en orden alfabtico, por
lo cual no coincidi con la anterior, pero si escribimos:

> var.test(gardenC,gardenB)

F test to compare two variances

data: gardenC and gardenB


F = 10.6667, num df = 9, denom df = 9, p-value = 0.001624
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
2.649449 42.943938
sample estimates:
ratio of variances
10.66667

Llegamos al mismo resultado anterior. Esta prueba debe correrse con cuidado pues es altamente
sensible a las observaciones remotas.

Homocedasticidad.

Es importante saber si la varianza difiere significativamente de muestra a muestra. La constancia


de homogeneidad de varianzas, homocedasticidad (homoscedasticity) es la ms importante
asuncin para regresin y ANAVA. Para comparar las varianzas de dos muestras la F ya mostrada
es apropiada, pero para mltiples muestras puede escogerse entre las pruebas de Bartlett y la de
FlignerKilleen. Se muestran ambas con el siguiente archivo:

> refs<-read.table("c:\\estadistica\\refuge.txt",header=T)
> attach(refs)
>names(refs)
[1] "B" "T"

T es Factor ordenado con 9 niveles, cada uno con 30 estimados excepto el 9 que tiene 0. Miremos
las varianzas:

> tapply(B,T,var)
1 2 3 4 5 6 7 8
1354.024 2025.431 3125.292 1077.030 2542.599 2221.982 1445.490 1459.955
75
9
NA

Debemos dejar de lado entonces el nivel 9 pues se requieren al menos dos muestras por factor.
Buscaremos a qu punto se refiere el tratamiento 9:

which(T==9)
[1] 31

Entonces debemos omitir el 31-esimo punto usando suscritos negativos. Calculamos primero
Bartlett:

> bartlett.test(B[-31],T[-31])

Bartlett test of homogeneity of variances

data: B[-31] and T[-31]


Bartlett's K-squared = 13.1986, df = 7, p-value = 0.06741

Segn esta no hay heterocedasticidad. Veamos ahora una nueva prueba:

> fligner.test(B[-31],T[-31])

Fligner-Killeen test of homogeneity of variances

data: B[-31] and T[-31]


Fligner-Killeen:med chi-squared = 14.3863, df = 7, p-value = 0.04472

Con esta encontramos un resultado muy diferente: hay diferencias entre las varianzas (p<0.05).
Entonces lo que sigue depende de su juicio dado lo cercano de los dos valores de p. Entonces si
mirar la grafica de los datos con plot(T,B) parecen tener buen comportamiento. Un modelo lineal
nos dara mayor luz acerca de los patrones encontrados en los residuales.

par(mfrow=c(2,2))
> model<-lm(B~T)
> plot(model)

76
Es posible tener, hasta salvajes, diferentes, interpretaciones. Usemos el archivo siguiente para
verlo:
ozone<-read.table("c:\\estadistica\\gardens.txt",header=T)
attach(ozone)
names(ozone)
[1] "gardenA" "gardenB" "gardenC"
> ozone
gardenA gardenB gardenC
1 3 5 3
2 4 5 3
3 4 6 2
4 3 7 1
5 2 4 10
6 3 4 4
7 1 3 3
8 3 5 11
9 5 6 3
10 2 5 10

Coloquemos en un solo vector los valores de los factores y discriminmoslos con las letra A,B,C.

y<-c(gardenA,gardenB,gardenC)
garden<-factor(rep(c("A","B","C"),c(10,10,10)))

garden
[1] A A A A A A A A A A B B B B B B B B B B C C C C C C C C C C
Levels: A B C

La pregunta es si la varianza en la concentracin de ozono difiere de jardn a jardn (garden a


garden) o no. La prueba de Fisher (test de F) nos da una respuesta al comparar B y C con una
varianza mayor para C:
77
var.test(gardenB,gardenC)

F test to compare two variances

data: gardenB and gardenC


F = 0.0938, num df = 9, denom df = 9, p-value = 0.001624
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
0.02328617 0.37743695
sample estimates:
ratio of variances
0.09375
La prueba de Bartlett, nos dice algo similara: hay una diferencia significante en varianza:

bartlett.test(y~garden)

Bartlett test of homogeneity of variances

data: y by garden
Bartlett's K-squared = 16.7581, df = 2, p-value = 0.0002296

Al contrario, la prueba de FlignerKilleen (preferida sobre la de Bartlett por algunos estadsticos)


no encuentra evidencia comprometedora de la no-constancia de la varianza (heterocedasticidad)
en estos datos:

fligner.test(y~garden)

Fligner-Killeen test of homogeneity of variances

data: y by garden
Fligner-Killeen:med chi-squared = 1.8061, df = 2, p-value = 0.4053

La razn para tales diferencias es que las pruebas de Fisher y Bartlett son muy sensible a las
observaciones remotas, mientras la de FlignerKilleen no (por ser una prueba no paramtrica que
usa los rangos de los valores absolutos de las muestras centradas con ponderaciones o pesos: a(i)
= qnorm((1 + i/(n+1))/2). De las mltiples pruebas de homocedasticidad esta es la prueba ms
robusta contra alejamientos de la normalidad segn (Conover et al., 1981).

Usted puede bien usar una formula (como las anteriores) o una lista (como sigue) para correr
estas pruebas:

fligner.test(list(gardenA,gardenB,gardenC))

Fligner-Killeen test of homogeneity of variances

78
data: list(gardenA, gardenB, gardenC)
Fligner-Killeen:med chi-squared = 1.8061, df = 2, p-value = 0.4053

> bartlett.test(list(gardenA,gardenB,gardenC))

Bartlett test of homogeneity of variances

data: list(gardenA, gardenB, gardenC)


Bartlett's K-squared = 16.7581, df = 2, p-value = 0.0002296

Comparacin de dos medias.

Que tan probable es que dos muestras provengan de la misma poblacin (o sea del mismo
promedio). Entonces diremos que ambas medias muestrales no resultan diferentes
significativamente. Si lo anterior no se da entonces diremos que ambas muestras son
significativamente diferentes. pero la mejor manera de proceder es encontrar la probabilidad de
que ambas muestras provienen de una poblacin con la misma media. S, esta probabilidad es muy
baja (digase, menor a 5% o menor a 1%) entonces tendramos una certidumbre razonable de (95%
o 99%) que las medias son realmente diferentes una de otra. Existen dos pruebas simples para
comparar medias:
Prueba de t de student para muestras independientes, homocedasticidad, y errores
normalmente distribuidos;
Prueba de suma de rangos de Wilcoxon para muestras independientes pero los errores no son
normales
Cuando las asunciones anteriores no se dan existen mltiples alternativas

Prueba de t de student.

La prueba se basa en el nmero de errores estndar que separan las dos muestras:
Diferencia entre dos muestras y A yB s2 s2
t ; sediferencia A B
Error estndar de la diferencia se diferencia nA nB

La hiptesis nula es que las medias son iguales, la cual debe rechazarse para grandes valores de t.
para nuestro ejemplo de ozono cada muestra tiene 9 g.l. y 18 para las dos, o que la muestra
completa tiene 20 datos pero dos parmetros estimados o sea 20-2 g.l. En este caso para una
prueba de dos colas, por no saber cul de las medias ser ms alta, calculamos el valor critico de t,
as:
> qt(0.975,18)
[1] 2.100922

Entonces nuestra t de prueba tiene que superar este valor para rechazar la hiptesis nula, con lo
cual diramos que ambas medias son diferentes para 0.05 . Hacemos un vector llamado
ozonAB y lo etiqueteamos:
ozonAB<-c(gardenA,gardenB)
label<-factor(c(rep("A",10),rep("B",10)))

79
> label
[1] A A A A A A A A A A B B B B B B B B B B
Levels: A B
Una grfica util en estos casos es opcion de muescas (notch) del boxplot.

> boxplot(ozonAB~label,notch=T,xlab="Jardn",ylab="Ozono")

Debido a que las muescas (notches) de las dos muestras no traslapan, podemos concluir que las
medianas son diferentes significativamente al nivel del 5%. Se nota adems que la variabilidad es
bastante similar en ambos jardines, ambos en trminos de rango + (los bigotes (whiskers)) + el
rango ntercuartil + (las cajas).

Esto se puede hacer a punta de funciones, pero el R tiene una funcin: t.test(x,y) incorporada para
ello:

t.test(gardenA,gardenB)

Welch Two Sample t-test

data: gardenA and gardenB


t = -3.873, df = 18, p-value = 0.001115
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-3.0849115 -0.9150885
sample estimates:
mean of x mean of y
3 5
Elvalor de t encontrado cuyo signo es irrelevante es mayor de 2.1 y lo respalda el p value. Note
que debido a diferencia significativa entre las medias el interval de confianza de las diferencias no
incluye el cero.
80
Cuando queremos correr t para muestras pareadas entonces R dispone de la funcin modificada
t.test(x1,x2,paired=T). Solo a manera de ejmplo usemoslo con nuestras muestras de ozono:

t.test(gardenA,gardenB,paired=T)

Paired t-test

data: gardenA and gardenB


t = -6.7082, df = 9, p-value = 8.771e-05
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-2.674445 -1.325555
sample estimates:
mean of the differences
-2
Prueba de los signos.

Es uno de los ms simples de la estadstica. Suponga que no puede medir una diferencia, pero
puede verla o sentirla de alguna manera (ejemplo un juicio con divisin de opiniones). Por ejemplo
9 saltadores de tramplon fueron calificados como mejor o peor, en dos regmenes de
entrenamiento asignados en secuencia aleatoria a cada atleta (nuevo-convencional, convencional-
nuevo). Los saltadores fueron juzgados dos veces: uno fue peor en el nuevo entrenamiento y 8
juzgados como mejor. Cul sera la evidencia de que el nuevo rgimen de entrenamiento mejore
los puntajes de competencia. La respuesta proviene de una prueba binomial de dos colas. Qu tan
probable es una respuesta de 1/9 (u 8/9 o ms extremo que esto, por ejemplo 0/9 o 9/9) si las
poblaciones fueran la misma (o sea p=0.5)? Se usara una prueba binomial para ello especificando
el nmero de fallas (failures) (1) y el tamao total de la muestra (9):

binom.test(1,9)

Exact binomial test

data: 1 and 9
number of successes = 1, number of trials = 9, p-value = 0.03906
alternative hypothesis: true probability of success is not equal to 0.5
95 percent confidence interval:
0.002809137 0.482496515
sample estimates:
probability of success
0.1111111

81
Concluimos que el nuevo rgimen de entrenamiento es significativamente mejor que el tradicional
pues el p-value <0.05. Veamos que pasa con la prueba de los signos. Es fcil escribir una funcin
para correr una prueba de signos para comparar dos muestras, x y y:

sign.test <- function(x, y)


{
if(length(x) != length(y)) stop("Ambas variables deben ser de igual longitud")
d <- x - y
binom.test(sum(d > 0), length(d))
}

La funcin verifica primero si los vectores tienen igual longitud. Si es cierto pasa a calcular el
vector de diferencias, d. La prueba binomial es aplicada entonces al nmero de diferencias
positivas (sum(d > 0)) y al total de nmeros (length(d)). Si no hay diferencia entre las muestras
entonces en promedio la suma debera ser cercana a la mitad de la longitud(length(d)). Vamos a
usarlo para comparar los niveles de ozono en los jardines A y B del ejemplo anterior:

sign.test(gardenA,gardenB)

Exact binomial test

data: sum(d > 0) and length(d)


number of successes = 0, number of trials = 10, p-value = 0.001953
alternative hypothesis: true probability of success is not equal to 0.5
95 percent confidence interval:
0.0000000 0.3084971
sample estimates:
probability of success
0
Note que el p value (0.00195) de la prueba de signos es mayor que en la prueba de t equivalente
(p=0.0011) corrida antes. Este ser el caso en forma general, adems si otras cosas se mantienen
iguales la prueba paramtrica ser ms potente que la no paramtrica equivalente.

Modelamiento estadstico (Statistical Modelling).

Iniciar cualquier trabajo estadstico es lo ms duro y entre esto se encuentra la escogencia del
anlisis correcto. Este, depende de la naturaleza de los datos y de la pregunta o los objetivos que
intenta responder. La clave es comprender el tipo de variable respuesta (aquella que se intenta
comprender o cuya variacin se intenta explicar, la que usualmente va en el eje y de las grficas),
y la naturaleza de las variables explicatorias (van el eje X, las responsables de la variacin asociada
a la y). Adems, s se trata de variables categricas o continuas. Entonces debe responderse estas
preguntas: claves simples para llegar al adecuado mtodo estadstico:
Cual de sus variables es la respuesta o dependiente?
Cuales son las variables explicatorias?

82
Son las anteriores continuas, categricas o de naturaleza mixta?
Que tipo de variable y se tiene: una continua producto de mediciones, un conteo de datos, una
proporcin, un tiempo de supervivencia o muerte, o una categora?

Las siguientes claves simples le facilitarn llegar al adecuado mtodo estadstico:

S las variables explicatorias:


(a) Son todas continuas: Regresin
(b) Son todas categricas: Anlisis de varianza (ANOVA)
(c) Son de las dos clases: continuas y categricas: Anlisis de covarianza (ANCOVA)

S la variable respuesta:
(a) Es continua: Regresin normal, ANOVA o ANCOVA
(b) Es una proporcin: Regresin logstica
(c) Es un conteo: Modelos log-lineales
(d) Es binaria: Anlisis binario logstico
(e) Son tiempos de muerte: Anlisis de supervivencia

El modelamiento busca determinar los mejores parmetros en un modelo especifico y que mas
adecuadamente se ajuste a los datos (los cuales son sagrados, lo contrario no es lo correcto), los
que cuentan lo sucedido bajo las mltiples circunstancias a que son sometidos. El mejor modelo es
aquel que produce la mnima variacin inexplicada (Devianza mnima residual) y cumple las
restricciones de modo que los parmetros sean significativos. Pero es el estadistico quien
especifica el modelo, lo que involucra mucha experiencia, conocimiento del tema,
comportamiento mecnico de los datos y de las variables explicatorias y la forma de relacionarse
de ellas, etc.

Se debiera buscar el modelo mnimo por el principio de parsimonia, que sea adecuado pues no es
til retener variables que no expliquen una variacin significativa de la varianza en los datos. Muy
importante recordar que no existe un nico modelo, existen muchos, unos mejores que otros y
por ltimo es solo un modelo.

Mxima verosimilitud (Maximum Likelihood).

Qu significa? Que los parmetros ajusten lo mejor posible el modelo a los datos? La
respuesta es simple: que los parmetros sean insesgados y, de varianza mnima. Para ello se define
mejor en trminos de mxima verosimilitud. Ello significa: que dados unos datos y dada la
escogencia de nuestro modelo, buscar los parmetros de este que hagan los datos observados los
ms probables. Se juzga el modelo en la base de que tan probables seran los datos si el modelo
fuera correcto.

Principio de parsimonia (Occams Razor)

Atribuido al filosofo nominalista del siglo 14, Guillermo de Occam, quien insista que, de un
conjunto de buenas explicaciones de un fenmeno la correcta sera la ms simple de ellas. De ac

83
el nombre de barbera, pues se insista en rasurar las explicaciones al mnimo, es decir sin
asunciones innecesarias. Estadsticamente se resumira as:
Los modelos debern tener tan pocos parmetros como sea posible;
Se debe preferir modelos lineales a los no lineales;
Los experimentos que descansan en pocas asunciones deberan preferirse a los que tienen
muchas;
Los modelos deberan ser recortados hasta un mnimo adecuado;
Las explicaciones simples deben preferirse a las complejas.

Por ello los procesos de simplificacin de modelos se vuelven fundamentales en R. En general, una
variable es retenida en un modelo nicamente si causa un incremento notable en la devianza
cuando es removida del modelo corriente. Obviamente todo esto tiene sus limitaciones y
cuidados, por lo cual un modelo deber ser tan simple como sea posible y no el ms simple de los
modelos, segn Einstein.

Tipos de modelos estadsticos.

El ajuste de modelos es un caso tpico de exploracin; no tiene reglas ni fijas ni absolutas. El


objetivo es determinar un modelo mnimo y adecuado de un gran conjunto de modelos
potenciales que pueda ser usado para describir un conjunto de datos. Entre los principales se
encuentran:
El modelo nulo;
El modelo mnimo adecuado;
El modelo corriente;
El modelo mximo; y
El modelo saturado.

La serie de pasos desde el modelo saturado (o el mximo, a veces coinciden) a travs de una serie
de simplificaciones hasta llegar al mnimo adecuado se basa en pruebas de borrado (deletion
tests). Para ello se acude bien a la prueba de F o la chi cuadrada para asegurar la significancia del
incremento de la devianza resultante de remover un trmino del modelo corriente.

Tabla. Seleccin del modelo mnimo adecuado del gran conjunto de modelos ms complejos por
simplificacin.
Modelo Interpretacin
Modelo Saturado Un parmetro por cada punto muestral
Ajuste: perfecto
Grados de libertad (g.l.): ninguno
Poder explicatorio del modelo: ninguno
Modelo Mximo Contiene todos los (p) factores, interacciones y covariables
que seran de inters. Muchos de los trminos del modelo
seran de algn inters. Muchos de los trminos del
modelo podran resultar insignificantes.
Grados de libertad (g.l.): np1
Poder explicatorio del modelo: depende
Modelo Mnimo adecuado Un modelo simplificado con 0p p parmetros

84
Ajuste: menor al mximo, pero no significativamente
Grados de libertad (g.l.): np 1
Poder explicatorio del modelo: r2 =SSR/SSY
Modelo Nulo Solo un parmetro, la media total.
Ajuste: ninguno; SSE =SSY
Grados de libertad (g.l.): n1
Poder explicatorio del modelo: ninguno

Los modelos son apenas representaciones de una realidad pero deben ser correctos y
convenientes. Sin embargo, es imposible maximizar el realismo de ellos, por lo cual se debe lograr
una generalidad e integralidad simultneamente en que el principio de parsimonia debe
ayudarnos con un modelo a favor de otros. Por ello, de ser posible, deberamos incluir una variable
explicatoria en el modelo si y solo si mejora significativamente su ajuste. El hecho de haber
medido algo, no significa que deba aparecer en el modelo. El principio de parsimonia dice que si
otras cosas quedan iguales deberamos preferir:
Un modelo con n1 parmetros a un modelo con n;
Un modelo con k1 variables explicatorias a uno con k de ellas;
Un modelo lineal a uno curvado;
Un modelo sin giba a uno con ella;
Un modelo sin interacciones a uno con ellas entre factores.

Otras consideraciones seran: preferir modelos con las variables explicatorias ms fciles de medir
que otras ms difciles o muy costosas. Tambin modelos con algn significado prctico sobre
funciones meramente empricas. Insistimos en la parsimonia para lograr modelos lo ms simples
posibles o sea sin parmetros o variables redundantes. Para ello se ajusta un modelo mximo y se
va simplificando de acuerdo con uno o ms de los siguientes pasos:
Remover trminos de interacciones no significativos.
Remover trminos cuadrticos o no lineales no significativos.
Remover variables explicatorias no significativas.
Agrupar niveles de factores que no difieran entre ellos.
Amalgamar variables explicatorias con valores de parmetros similares.
Ajustar pendientes no significativas a cero dentro de un ANCOVA.

Deben tener obviamente sentido cientfico o practico tales simplificaciones y no atentar nuca
contra el poder explicatorio. Resultan muy a menudo variables explicatorias correlacionadas entre
ellas, por lo cual el orden en que se retiran del modelo influenciar este poder explicatorio,
adems de recordar que el nmero de combinaciones de trminos de interaccin y trminos
polinomiales puede volverse un infinito. Existen algunas reglas simples como las expresadas y
algunas formas automticas de proceder como los stepwise, pero en principio siempre demandar
mucho tiempo la modelacin de un simple dataframe. No existen reglas concretas ni fciles para
lograrlo, pero en el borrado a pasos (stepwise deletion) algunos trminos no-significativos son
dejados de lado y otros significativos aparecen con posterioridad.

Lo anterior est sujeto obviamente a salvedades. As como no existe el modelo perfecto puede
suceder que no encontremos una escala ptima de medida para el modelo, por lo cual son
posibles las transformaciones.

85
Pasos involucrados en la simplificacin de modelos .

Se resumen en la tabla siguiente, sabiendo que ello puede consumir mucho tiempo, pero este
reduce el riesgo de ignorar aspectos importantes de los datos. Pero adems, es importante
resaltar que no hay forma de garantizar el hallazgo de buenas estructuras sobre todo en procesos
complejos.

Tabla sobre pasos para la simplificacin de modelos


Paso Procedimiento Explicacin
1 Ajustar el modelo maximal Ajustar todos los factores, interacciones y covariadas de
Inters. Anotar la desvianza residual.
2 Iniciar la simplificacin Inspeccionar los parmetros estimados usando la funcin
summary de R. Remover los trminos menos significativos
primero usando la funcin update -, arrancando con las
interacciones de ms alto orden.
3 Si el borrado causa un Deje ese trmino por fuera del modelo.
incremento insignificante en Inspeccione los parmetros de nuevo.
la desvianza Remueva los trminos restantes menos significativos.
4 Si el borrado causa un Regrese el termino de nuevo al modelo, usando update +.
incremento significativo en la Estos son los trminos significativos estadsticos obtenidos
desvianza por borrado.
5 Contine removiendo Repetir pasos 3 o 4 hasta que el modelo quede no mas con
trminos del modelo trminos significativos. Este es el modelo mnimo
adecuado. Si no quedan parmetro en el modelo este ser
el modelo nulo
Orden de borrado (deletion).

Generalmente los datos caen en dos categoras principalmente: Experimentos planeados donde
no se esperan valores faltantes, salvo accidentes y las combinaciones de los tratamientos se
esperan igualmente representadas, por lo cual se habla de datos ortogonales. Pero existen
tambin los estudios observacionales sin control sobre el nmero de individuos por lo cual
aparecen datos u otras circunstancias por fuera de los objetivos, as como variables
correlacionadas explicatorias e incluso con la variable respuesta, hasta tratamientos faltantes, por
lo cual los datos llegan a la categora de no ortogonalidad, lo cual hace una gran diferencia a la
hora de modelar, porque en diseos ortogonales se asume homocedasticidad y no importa el
orden de borrado o remocin del modelo, todo lo cual si es importante para los modelos no
ortogonales del modelo maximal, incluso por la probabilidad de aparecer las confusiones (iguales
Sumas de cuadrados atribuibles a factores diferentes).

Aunque algn factor haya costado mucho esfuerzo medirlo, no se justifica retenerlo si no presenta
un buen poder explicatorio. Las Tablas de Anava a menudo muestran una mezcla de efectos
significativos y no significativos, lo cual en modelos ortogonales no es problema, sus sumas de
cuadrados corregidas pueden ser inequvocamente atribuidas a cada factor incluidas las
interacciones. Pero si se dan valores faltantes o ponderaciones desiguales en los datos sera
imposible saber las alteraciones en los estimados, errores estndar, etc.

86
Cuando se ha producido borrado de trminos no significativos, lo siguiente es lo aconsejable: Diga
si sus datos son o no ortogonales; explique algunas correlaciones entre sus variables explicatorias;
presente el modelo mnimo adecuado; presente una lista de los trminos no significativos
omitidos y los cambios de devianza resultantes del borrado.
Como modelar (Formulas) en R.

La estructura de la modelacin en R es similar a lo mostrado en la siguiente tabla:


Variable respuesta~Variable(s) explicatoria(s)

donde la tilde (~) significa es modelado como una funcin de

Tabla. Ejemplos de formulacin de modelos en R. (ojo, la funcin I (i mayscula) se usara siempre


como tal cual y para generar secuencias I(1:10) o calcular trminos cuadrticos I(x^2)

Modelo Formula del modelo Comentarios


Nulo y~1 1 es el intercepto en una regresin pero
ac representa la media total
Regresin y~x x variable explicatoria continua
Regresin a travs y ~ x-1 Sin intercepto
del origen
ANOVA de una va y ~ sexo sexo variable categrica con 2 niveles
ANOVA de una va y ~ sexo-1 similar al anterior sin intercepto (entrega
dos medias en vez de una y una diferencia)
ANOVA dos vas y ~ sexo + genotipo genotipo variable categrica de 4 niveles
ANOVA (factorial) y~N * P * K N, P and K factores con 2 niveles Y todas
sus interacciones
ANOVA 3 vas y ~ N*P*K N:P:K Como el anterior pero sin la triple interac.
Anlisis de covarianza y ~ x + sexo Una pendiente comn para y contra x con
dos interceptos uno por cada sexo
Anlisis de covarianza y ~ x * sexo 2 pendientes y 2 interceptos
ANOVA anidado y ~ a/b/c Factor c anidado dentro del factor b y este
anidado dentro del factor a
ANOVA en parcelas y ~ a*b*c+Error(a/b/c) Arreglo factorial con 3 tamaos de parcelas
divididas , 3 varianzas diferentes (una por cada
tamao de parcela
Regresin Mltiple y~x + z 2 variables continuas explicatorias, ajusta
un plano
Regresin Mltiple y~x * z Ajusta un termino de interaccin tanto
como (x + z + x:z)
Regresin Mltiple y ~ x + I(x^2) + z + I(z^2) Ajusta un trmino cuadrtico para ambos
xyz
Regresin Mltiple y <- poly(x,2) + z Ajusta una polinomial cuadrtica para x y
lineal para z
Regresin Mltiple y~(x + z + w)^2 Ajusta 3 variables ms todas sus
interacciones hasta la doble va
Modelo No-parame- y ~ s(x) +s(z) y es una funcin x suavizada y z en modelo
trico aditivo generalizado
87
Variables: respuesta y log(y) ~ I(1/x) + sqrt(z) Todas las 3 variables son transformadas en
explicatorias transformadas el modelo

Adems una regresin simple lineal de y en x podra escribirse como: y~x


Y, un ANOVA de una va donde sexo es un factor de 2 niveles podra escribirse como: y ~ sexo

A la derecha de la tilde (~), se tiene la opcin de especificar salidas para los trminos del error en
algunos casos especiales. Tanto con la variable respuesta como con las variables explicatorias
pueden aparecer como transformaciones, potenciales o polinomiales. Es muy importante notar
que los smbolos son usados diferentemente a las expresiones aritmticas en la formulacin de
modelos. En particular:
+ indica inclusin de una variable explicatoria en el modelo (no adicin);
- indica supresin de una variable explicatoria del modelo (no substraccin);
* indica inclusin de variables explicatorias e interacciones (no multiplicacin);
/ indica variables explicatorias anidadas en el modelo (no divisin);
| indica condicionamiento (no o), tal que y~x | z debe leerse como y como una funcin de
x dado z.

Existen otros smbolos que tienen significado especial en la formulacin de modelos. Dos puntos
(:)(colon) denota una interaccin, tal que A:B significa la interaccin de segundo orden entre A y
B, y N:P:K:Mg significa la interaccin de cuarto orden entre N, P, K y Mg. Algunos trminos
pueden ser escritos en forma expandida. Entonces:
A*B*C es lo mismo que A+B+C+A:B+A:C+B:C+A:B:C
A/B/C es lo mismo que A+B%in%A+C%in%B%in%A
(A+B+C)^3 es lo mismo que A*B*C
(A+B+C)^2 es lo mismo que A*B*C A:B:C

Interacciones entre variables explicatorias.

Las interacciones entre dos variables categricas con dos niveles de la forma A*B significa que dos
efectos principales y una interaccin sern evaluados. De otra parte si el factor A tiene 3 niveles y
el factor B tiene 4 niveles, entonces 7 parmetros sern estimados para los efectos principales (3
medias para A y 4 medias para B). El numero de trminos de interaccin es (a 1)(b 1), en que a
y b son los numero de niveles de los factores A y B, respectivamente. As en este caso, R estimara
(3 1)(4 1) = 6 parmetros para la interaccin.
Las interacciones entre 2 variables continuas son ajustadas diferentemente. Si x y z son 2 variables
explicatorias continuas, entonces x*z significa ajustar x+z+x:z y el trmino de la interaccin x:z se
comporta como si una nueva variable hubiera sido calculada como el producto puntual de los 2
vectores x y z. El mismo efecto podra haberse obtenido si calculramos el producto
explcitamente:

product.xz <- x * z

con lo cual se formulara el modelo como y~x + z + product.xz. Note que la representacin de la
interaccin por el producto de 2 variables continuas es una asuncin, no un hecho. La interaccin
real pudo ser una forma funcional completamente diferente (ejemplo x * z^2).

88
Las interacciones entre una variable categrica y una continua se interpretan como en el anlisis
de covarianza; una pendiente y un intercepto por separado son ajustados para cada nivel de la
variable categrica. Por decir:
y ~ A*x
debera ajustar 3 ecuaciones de regresin si el factor A hubiera tenido 3 niveles; o sea, debera
estimar 6 parmetros para los datos 3 pendientes y 3 interceptos.

El operador slash es usado para denotar anidamientos. As, con las variables categricas A y B,
y ~ A/B
significa ajustar A mas B dentro de A. Ello podra escribirse en otras dos formas equivalentes:

y ~A + A:B
y ~A + B %in% A
ambas de cuyas alternativas enfatizan que no hay inters en intentar un efecto principal para B
(este podra probablemente ser un factor etiqueta similar a rbol numero 1 sin inters cientfico.

Algunas funciones para especificar trminos no lineales e interacciones de rdenes ms altos


tambin resultan de utilidad. Ajustar una regresin polinomial en x y z, pudo escribirse como:

y ~ poly(x,3) + poly(z,2)

para ajustar una polinomial cbica para x y una cuadrtica para z. Para ajustar interacciones, pero
nicamente hasta cierto nivel, resulta til el operador ^. La frmula
y~(A + B + C)^2
ajusta todos los efectos principales y las interacciones de segundo orden (o sea se excluyen las de
tercer orden que con la notacin A*B*C hubiera incluido).

La funcin I (letra mayscula i) equivale a como si (as is). Esta prevalece sobre la interpretacin
de smbolo de un modelo o como operador de frmula cuando la intencin es usarla como un
operador aritmtico. Supngase que deseamos ajustar 1/x como una variable explicatoria en una
regresin. Podramos tratar algo como:

y~1/x
pero sucede algo muy peculiar. Esto equivale a ajustar x anidado dentro del intercepto! Cuando
aparece en la formulacin de un modelo, el operador / (slash) se asume que implica anidamiento.
Para obtener el efecto deseado debemos usar I al escribir:
y ~ I(1/x)

Tambin necesitamos usar I cuando deseamos que: * represente multiplicacin and ^ signifique
a la potencia en lugar de una interaccin en la expansin de modelos: Entonces para ajustar x y x2
en una regresin cuadrtica debemos escribir

y ~ x+I(x^2)
en una forma convincente y estadsticamente aceptable.

89
Anlisis de Varianza ANAVA, ANOVA, AOV, ETC

El ANAVA COMO SE VIO ES UNA tcnica usada cuando las variables explicatorias o independientes
de un modelo son categricas. Estas son llamadas factores, y cada uno tiene dos o ms niveles.
Con un solo factor y ms de 3 niveles se tiene el ANOVA de una va. S se tienen justamente solo
dos niveles en un solo factor usamos t de Student, que dara la misma respuesta que la obtenida
con el Anava.

Cuando se tienen dos o ms factores se llega al de dos o tres vas, dependiendo del nmero de
variables explicatorias. Cuando se dan replicaciones de cada combinacin de niveles en una
ANOVA de mltiples vas el experimento se dice que es un diseo arreglado en forma factorial y
permite el estudio de las interacciones (interactions) entre variables, en cada una de las cuales
verificaremos si la respuesta de un factor depende de los niveles de otro

ANOVA de una va.

Como se vio, lo paradjico del anlisis de varianza es que compara dos o ms medias pero lo hace
comparando varianzas. Adems de lo visto, en el curso, aparece otra prueba importante para
verificar la heterocedasticidad llamado el test de FlignerKilleen que se invoca s:
fligner.test(y~x)

O el ya mencionado de Bartlett

bartlett.test(y~x)

Grficos para interpretar un ANOVA de una va.

Hay dos formas de mostrar grficamente los resultados del ANOVA:


Grficas de caja y bigotes (box-and-whisker);
Grafico de barras con errores.
Utilizaremos el ejemplo de competencias para mostrar las dos aproximaciones.
Como la variable explicatoria es categrica, varios niveles de x, una inspeccin inicial de los datos
involucra la grafica de box-and-whisker plot de y contra x similar a:
plot(x,y,names=c("trat1","trat2","trat3", etc),ylab="nombre de la variable dependiente")

Para el caso:
plot(clipping,biomass,xlab="Tratamiento (competencia)",ylab="Biomasa")

90
La grfca de caja y bigotes es til para mostrar la variacin dentro de cada tratamiento, y tambin
si hay sesgo dentro de cada tratamiento (ejemplo para las de control, hay un rango mas amplio de
valores entre la mediana y el tercer cuartil que entre la mediana y el primer cuartil). Ninguna
observacin remota (outliers) son mostrados por fuera de los bigotes (whiskers), total que las
bases y las cimas de las barras son la mxima y mnima dentro de cada tratamiento. Las medianas
para los tratamientos de competencia son todos ms altos que el tercer cuartil de los controles
sugiriendo que ellas podran ser significantemente diferentes de los controles, pero es poca para
sugerir que algunos de los tratamientos de competencia sean significativamente diferentes unos
de otros. Se podra usar la opcin notch=T (musca) para tener una impresin visual de la
significancia de las diferencias entre las medianas; todas las medianas de los tratamientos caen
por fuera de la muesca (notch) de los controles, pero ninguna otra comparacin parece ser
significativa.

Las graficas de barras con barras del error se presentaron en la pagina 36.

Razn F

Ya sabe que es MStratamientos/MSE que confrontamos con el estadstico F comparado con su


valor crtico por los grados de libertad. Por ejemplo asumamos 3 gl en el numerador y 12 en el
denominador. Los valores crticos en R se encuentran con la funcin cuantil F qf que nos da la
distribucin de los cuantiles de de F, por ejemplo para 95% de confianza como:

qf(.95,3,12)
[1] 3.490295

Pero la aproximacin moderna no es esclavizarse con 5% para alfa sino calcular el p-value
asociado, para lo cual en lugar de cuantiles de F calculamos las probabilidades acumulativas con la
funcin pf similar a esto:

91
1-pf(3.49,3,12)
[1] 0.05001097

R puede hacer todo esto de una vez con la funcin summary en una sola lnea:

summary(aov(y~x))

La tabla resumen para variables explicatorias continuas y categricas


(summary.lm table).

Es importante comprender la diferencia entre summary.lm y summary.aov para el mismo


modelo. Por ejemplo vemoslo en una Anava de una va en un experimento de competencia de
plantas, en el cual la biomasa del control ser comparada a la biomasa de las plantas que crecen
en condiciones de competencia, est reducida en 4 formas diferentes: 2 tratamientos en los cuales
las races de las plantas vecinas fueron cortadas (a 5 cm o 10 cm de profundidad) y 2 tratamientos
en los cuales los renuevos de las plantas vecinas fueron cortados (25% o 50% de con respecto al
nivel del piso).

comp<-read.table("c:\\estadistica\\competition.txt",header=T)
attach(comp)
names(comp)
[1] "biomass" "clipping"
La variable categrica explicatoria es clipping y tiene 5 niveles como se muestra con:

> levels(clipping)
[1] "control" "n25" "n50" "r10" "r5"

El ANAVA del modelo es ajustado como:

> model<-lm(biomass ~ clipping)

> summary.aov(model)
Df Sum Sq Mean Sq F value Pr(>F)
clipping 4 85356 21339.1 4.3015 0.008752 **
Residuals 25 124020 4960.8
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

> summary.lm(model)

Call:
lm(formula = biomass ~ clipping)

Residuals:
Min 1Q Median 3Q Max
-103.333 -49.667 3.417 43.375 177.667

Coefficients:

92
Estimate Std. Error t value Pr(>|t|)
(Intercept) 465.17 28.75 16.177 9.4e-15 ***
clippingn25 88.17 40.66 2.168 0.03987 *
clippingn50 104.17 40.66 2.562 0.01683 *
clippingr10 145.50 40.66 3.578 0.00145 **
clippingr5 145.33 40.66 3.574 0.00147 **
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 70.43 on 25 degrees of freedom


Multiple R-squared: 0.4077, Adjusted R-squared: 0.3129
F-statistic: 4.302 on 4 and 25 DF, p-value: 0.008752

Esta funcin, summary.lm, es con mucho ms informativa que la aov. Muestra los tamaos de los
efectos (en forma de contrastes) y sus errores estndar, mientras la funcin summary.aov
muestra solamente la varianza del error (s2 =4961) y la F (4.3015) revelando la existencia o no de
diferencias significativas entre tratamientos. La primera fila de la tabla summary.lm contiene una
media y las dems, diferencias entre medias. Adems, el error estndar en la primera fila
etiquetada como intercepto (Intercept) es el error estndar de una media
Erestmedia s 2 / (k n) , mientras los errores estndar en las dems filas son errores estndar
de diferencias entre dos medias: Erestdif 2 s / n en que se dan k niveles de los factores,
2

cada uno con n = # de replicaciones. Como se calculan los tamaos de los efectos? Que son ac
estos valores 465.17 y 88.17, etc.?

Para comprender las respuestas necesitamos conocer la estructura de la ecuacin para las
variables explicatorias en un modelo lineal para variables categricas. Para ello es necesario
recordar que el modelo lineal para variable explicatoria continua se escribe como:

lm(y ~ x)
y, ajusta y=a+bx en cuyo caso los valores de los parmetros a y b se estiman de los datos. Pero en
un anlisis de varianza como se hace? Por ejemplo ac tenemos una variable explicatoria con 5
niveles: control, n25, n50, r10 and r5. El modelo para anlisis de varianza (aov model) es
exactamente anlogo al anterior:
aov(y ~ x)
pero, que est asociado con esta ecuacin? Al mirarla trataremos de entenderlo:
y = a+bx1 + cx2 + dx3 + ex 4 + fx 5
luce como si fuera una regresin mltiple con 5 variables explicatorias x1 ,x2 ,x3 ,x 4 , x 5 , pero la
clave es entender que estos x1 ,x2 ,x3 ,x 4 , x 5 son los niveles de un factor llamado x. El intercepto,
a, es la media general o gran media de todo el experimento. Los parmetros b,..,f son diferencias
entre la gran media y la media para cada nivel del factor dado. Entonces es necesario ponerle
cuidado a esto. Con una variable categrica explicatoria, todas las variables son codificadas como
si x=0 excepto para el nivel del factor que es asociado con el valor de la y en cuestin, en cuyo
caso x ser codificada como x=1. Miremos la primera fila de datos en nuestro dataframe:

comp[1,]
93
biomass clipping
1 551 n25

Ac el primer valor de la biomasa (551)proviene del tratamiento clipping n25 el cual, entre todos
los niveles de los factores, ocupa el segundo orden alfabticamente hablando siendo el primero
control. Esto significa que para esta fila del dataframe: x1 = 0, x2 = 1, x 3 = x 4 x 5 0 . La ecuacin
para la primera fila lucira como sigue:
y = a+b 0 + c 1+ d 0 + e 0 + f 0
As que el modelo para el valor ajustado al nivel n25 es: y = a + c y as para los dems niveles de
los otros factores. El valor de y ajustado ( y ) es la suma de 2 parmetros, a y c. Por tanto, la
ecuacin aparentemente no contiene una variable explicatoria (ac no hay x en la ecuacin como
si la habra en un modelo de regresin). Note, tambin, cuantos parmetros contiene el modelo
completo, representados por las letra de a a f y que hay 6 de ellos. Pero, solo podramos estimar
nicamente 5 en este experimento (una media para cada uno de los 5 niveles de los factores), o
sea que nuestro modelo contiene un parmetro redundante y debemos lidiar con ello. Existen
varias formas de hacerlo, pero con muchas opiniones acerca de cul sera la mejor. Los autores de
R concuerdan que los contrastes de tratamientos representan la mejor solucin (tema tratado
posteriormente).

Este mtodo suprime el parmetro a, la gran media, pero la media del nivel del factor con la
primera letra en el alfabeto (control, en nuestro ejemplo) es la posicionada en el primer lugar, y
luego los otros efectos son mostrados como diferencias (contrastes) entre esta media y las medias
de los otro cuatro niveles de los factores. Un ejemplo nos ayuda a clarificarlo. He ac nuestras 5
medias:

medias<-tapply(biomass,clipping,mean)
> medias
control n25 n50 r10 r5
465.1667 553.3333 569.3333 610.6667 610.5000

La idea es que la media del control (465.1667) se convierta en el primer parmetro del modelo
(conocido como el intercepto). El Segundo parmetro es la diferencia entre la segunda media
(n25=553.333) y el intercepto:
medias[2]-medias[1]
n25
88.16667
El tercer parmetro es la diferencia entre la tercera media (n50 = 569.333) y el intercepto:
> medias[3]-medias[1]
n50
104.1667
y as sucesivamente.

Pero, que muestran los errores estndar? Como la primera fila es una media, entonces
necesitamos el error estndar de la media de un nivel del factor. Como esta media se basa 6
valores, para el ejemplo, entonces el error estndar error de la media ser: Erstmedia s 2 / n en

94
que la varianza del error estndar es s2 =4961, obtenida del summary.aov(model) ya mostrado
antes:

sqrt(4961/6)= 28.75471.

Las dems filas tienen el mismo error estndar, pero ms alto que el anterior ya que los efectos en
la segunda y subsecuentes filas no son medias sino diferencias de ellas. Cuando dos muestras son
independientes la varianza de su diferencia es la suma de las varianzas:
s12 s22
Eestdiferencias
n1 n2
Adems como ambas varianzas y tamaos muestrales son los mismos (como ac que tenemos un
diseo balanceado, acudimos a la varianza mezclada del error (4961) salida de la tabla del
s2
summary.aov), por lo cual la formula se simplifica como Eestdiferencias 2 :
n
sqrt(2*4961/6)
[1] 40.6653

Con alguna prctica puede desmitificarse el origen de los nmeros presentados en la tabla del
summary.lm. Toma algn tiempo y dedicacin, pues al principio parece difcil. Seguro se clarificar
mas despus del estudio de los contrastes.

Contrastes.

Los contrastes son la esencia de las verificaciones de las hiptesis y de la simplificacin de modelos
en un ANOVA y ANCOVA, y por definicin usados para comparar medias o medias de grupos en lo
conocido como comparaciones de un g.l. (single-degree-of-freedom comparisons). Dos tipos de
ellos son de gran inters:
Contrastes planeados con anticipacin o a priori (a priori contrasts);
Contrastes que parecen interesantes despus de conocer los resultados o a posteriori.

Los ltimos tienen reservas para mucha gente pues al no ser planeados se aprovecha de
informacin que puede sesgar las bsquedas. No se supone decidir que comparaciones hacer
luego de aparecer los resultados, pero esto lo hacen los cientficos muchas veces. Adems,
realmente solo se pueden hacer cuando el ANAVA ha establecido diferencias significativas entre lo
investigado. No es buena prctica llevar a cabo pruebas para comparar la mayor media con la ms
pequea si el Anava no rechaza la hiptesis nula. Hay dos importantes puntos a comprender
acerca de los contrastes:
hay un gran nmero de posibles contrastes, y
hay solamente k1 contrastes ortogonales, cuando k es el nmero de niveles del factor. Dos
contrastes se dicen ortogonales el uno al otro si las comparaciones son estadsticamente
independientes. Tcnicamente, dos contrastes son ortogonales s el producto de sus coeficientes
suman cero.

Repasmoslo con un ejemplo simple. Sea un factor con 5 niveles (a, b, c, d, y e). Se mostrarn
algunos de los posibles contrastes. Entre los ms obvios estarn por supuesto los que comparan

95
cada media simple con cada una de las dems: a vs b, a vs c, a vs d, etc. Pero tambin sera posible
comparar pares de medias: {a,b}vs{c,d},{a,b}vs{c,e}, {a,b}vs{d,e}, o tripletas de medias: {a,b,c} vs d,
{a,b,c} vs e, {a,b,c} vs f, etc. o cuartetas.

Entonces aparece una gran masa de contrastes, pero en la prctica desearamos comparar
nicamente algunas cosas a la vez directa o implcitamente. As que dos contrastes como a vs. b y
a vs. c implcitamente contrastara b vs. c. Ello implicara que si hemos corrido los 2 contrastes a
vs. b y a vs. c, el tercer contraste b vs. c resulta no ortogonal.

Se expuso como formar contrastes independientes que, adems depende mucho de la primera
escogencia. Supngase una buena razn para comparar {a,b,c,e} vs. d, ya que por ejemplo d fuera
un placebo y los otros 4 diferentes tipos de drogas. Este sera entonces nuestro primer contraste.
Como son solo posibles k1=4, solo nos quedaran 3 contrastes ortogonales con este, que a priori
podran ser por determinadas razones {a,b} y {c,e} tal que este sera nuestro segundo contraste
ortogonal. Esto significa que no tendramos grados de libertad para la escogencia de los dos
ltimos contrastes ortogonales: que podran ser a vs. b y c vs. e. recuerde que con contrastes
ortogonales solo se comparan cosas una sola vez. Ya se sabe como asignar coeficientes a un
contraste y como calcular sus sumas de cuadrados corregidas(SS..). Un ejemplo debe clarificarnos
su uso.

Ejemplo de contrastes en R.

Siguiendo con el ejemplo de competencia de plantas ya trabajado, volvamos a l:

comp<-read.table("c:\\estadistica\\competition.txt",header=T)
attach(comp)
names(comp)
Iniciamos con un anava de una va:

> model1<-aov(biomass ~ clipping)


> summary(model1)
Df Sum Sq Mean Sq F value Pr(>F)
clipping 4 85356 21339.1 4.3015 0.008752 **
Residuals 25 124020 4960.8
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Los tratamientos de cortas (Clipping) tienen un efecto altamente significativo en la biomasa. Pero
para comprender a cabalidad estos resultados deberamos poder responder que niveles de los
factores son los responsables del mayor efecto y como se diferencian del control, por ejemplo.
Para ello nos ayudamos de la funcion summary.lm:

summary.lm(model1)
Call:
aov(formula = biomass ~ clipping)

Residuals:
96
Min 1Q Median 3Q Max
-103.333 -49.667 3.417 43.375 177.667

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 465.17 28.75 16.177 9.4e-15 ***
clippingn25 88.17 40.66 2.168 0.03987 *
clippingn50 104.17 40.66 2.562 0.01683 *
clippingr10 145.50 40.66 3.578 0.00145 **
clippingr5 145.33 40.66 3.574 0.00147 **
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 70.43 on 25 degrees of freedom


Multiple R-squared: 0.4077, Adjusted R-squared: 0.3129
F-statistic: 4.302 on 4 and 25 DF, p-value: 0.008752

El resultado luce como si necesitramos todos los 5 parmetros por el acompaamiento de las
estrellas de significancia. Pero no es el caso. Este ejemplo resalta el mayor defecto de los
contrastes, pues no muestra cuantos niveles de los factores necesitaramos retener en el modelo
mnimo adecuado, pues todas las filas estn siendo comparadas con el intercepto (en este caso
con el control, simplemente porque este se ubic como primer nombre alfabticamente como ya
se resalt):
levels(clipping)
[1] "control" "n25" "n50" "r10" "r5"

Contrastes a priori.

En este experimento hay varias comparaciones planeadas que podramos intentar. Lo ms obvio
sera empezar por comparar las plantas control, expuestas a la ms rigurosa competencia con los
dems tratamientos. Es decir deseamos contrastar el primer nivel de clipping con los otros 4
niveles. Para ello los coeficientes de los contrastes deberan ser 4, 1, 1, 1, 1. La siguiente
comparacin planeada podra contrastar los tratamientos del corte de retoos (n25 y n50) con los
tratamientos de cortas de raz (r10 y r5), cuyos coeficientes seran: 0, 1, 1, 1, 1. Un tercer
contraste sera de comparar los dos niveles de profundidad de corte de races; 0, 0, 0, 1, 1, y el
ltimo, las dos intensidades de rebaja de retoos: 0, 1, 1, 0, 0. En total 4 contrastes ortogonales.

R es sorprendentemente bueno en el trabajo con contrastes y podramos asociar estos 5


contrastes especificados por el usuario a priori con la variable categrica llamada clipping similar
a esto:
> contrasts(clipping)<-cbind(c(4,-1,-1,-1,-1),c(0,1,1,-1,-1),c(0,0,0,1,-1),c(0,1,-1,0,0))
> contrasts(clipping)
[,1] [,2] [,3] [,4]
control 4 0 0 0
n25 -1 1 0 1
n50 -1 1 0 -1
r10 -1 -1 1 0
97
r5 -1 -1 -1 0
que, produce la matriz de contrastes especificada, todos ortogonales, como debe comprobar.
Ahora podemos reajustar el modelo e inspeccionar los resultados de esos contrastes, en vez de los
contrastes de los tratamientos por defecto con:

> model2<-aov(biomass ~ clipping)


> summary.lm(model2)
Call:
aov(formula = biomass ~ clipping)

Residuals:
Min 1Q Median 3Q Max
-103.333 -49.667 3.417 43.375 177.667

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 561.80000 12.85926 43.688 < 2e-16 ***
clipping1 -24.15833 6.42963 -3.757 0.000921 ***
clipping2 -24.62500 14.37708 -1.713 0.099128 .
clipping3 0.08333 20.33227 0.004 0.996762
clipping4 -8.00000 20.33227 -0.393 0.697313
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 70.43 on 25 degrees of freedom


Multiple R-squared: 0.4077, Adjusted R-squared: 0.3129
F-statistic: 4.302 on 4 and 25 DF, p-value: 0.008752
En lugar de requerir 5 parmetros como se sugerira al principio, este anlisis muestra que
necesitamos nicamente dos parmetros: la gran media o media total (561.8) y el contraste entre
los controles y los 4 tratamientos de competencias (p = 0.000921). Los dems resultaron no
significativos. Cuando nosotros especificamos los contrastes, el intercepto es la media total (gran
media):

>mean(biomass)
[1] 561.8

La segunda fila etiquetada como clipping1, estima, similar a todos los contrastes, la diferencia
entre dos medias, pero cuales exactamente? Recordemos las medias para los diferentes niveles:

> tapply(biomass,clipping,mean)
control n25 n50 r10 r5
465.1667 553.3333 569.3333 610.6667 610.5000

Nuestro primer contraste ha comparado los controles (media = 465.1667, encima) con la media
de los otros 4 tratamientos. La forma ms simple de obtener la media de estos, es crear un nuevo
factor, c1 que tiene valor 1 para los controles y 2 para el resto:

98
> c1<-factor(1+(clipping!="control"))
> c1
[1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2
Levels: 1 2
> tapply(biomass,c1,mean)
1 2
465.1667 585.9583
El estimado en la primera fila que refleja el contraste 1, es la diferencia entre la media total (561.8)
y la media de los 4 tratamientos por fuera de control (585.9583), entonces:

> mean(biomass)-tapply(biomass,c1,mean)
1 2
96.63333 -24.15833
y ac vemos que el estimado en la segunda lnea es -24.158 33.

Qu pasa con el segundo contraste en la lnea 3?. Esta compara los tratamientos de cortes de raz
y reduccin de rebrotes, lo cual se podra manejar con un factor c2 que los agrupa juntos:

c2<-factor(2*(clipping=="n25")+2*(clipping=="n50")+(clipping=="r10")+(clipping=="r5"))
c2
[1] 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1
Levels: 0 1 2
luego de lo cual podemos calcular la biomasa promedio para los dos tratamientos usando tapply, y
luego sustraer las medias, una de la otra, usando la funcin diff y luego la mitad de las diferencias:

diff(tapply(biomass,c2,mean))/2
12
72.70833 -24.62500

As, el Segundo contraste en la fila 3 (24.625) es la mitad de la diferencia entre los tratamientos
de raz y los de reduccin de renuevos. Ahora que se tiene para la tercera fila? El contraste
nmero 3 es entre los dos tratamientos de raz. Conocemos ya estos valores con la funcin tapply,
que habamos usado antes:
r10 r5
610.6667 610.5000

Ambas medias difieren en 0.166666 tal que el tercer contraste es la mitad de la diferencia entre
ambas medias:
(610.666666-610.5)/2
[1] 0.083333

El contraste final compara los tratamientos de reduccin de renuevos y el contraste es la mitad de


la diferencia entre estas dos medias:
(553.3333-569.3333)/2
[1] -8

99
Recapitulemos: el primer contraste compara la gran media total con la media de los cuatro
tratamientos por fuera del control, el segundo contraste es la mitad de la diferencia entre medias
de tratamientos aplicados a la raz y a los renuevos, el tercer contraste es la mitad de las
diferencias entre los tratamientos de raz, y el cuarto contraste, es la mitad de la diferencia entre
los tratamientos de renuevos.

Resulta importante notar que los 4 primeros errores estndar en la tabla summary.lm resultan
diferentes unos de los otros. Como hemos visto, el estimado en la primera fila de la tabla es una
media, mientras todas las dems filas contienen estimados de diferencias entre medias. La gran
media en la cima de la tabla est basada en 30 datos de modo que el error estndar de la media
ser: Erstmedia s 2 / 30 con s2 proveniente del Anova:
sqrt(4961/30)
[1] 12.85950

La siguiente fila compara dos medias por lo que necesitamos el error estndar de la diferencia
entre dos medias. La complejidad proviene del hecho de que las dos medias provienen de
diferentes nmeros de datos. Mientras la gran media vena de los 5 niveles cada uno con 6 datos,
la media de los tratamientos por fuera del control proviene de 24 datos por ser cuatro
tratamientos cada uno con 6 datos, por lo cual el denominador en la frmula de error estndar
ser 546=120. As, el error estndar en la diferencia de estas dos medias ser:
Erstmedia s 2 / (5 4 6) :
sqrt(4961/(5*4*6))
[1] 6.429749

Para el Segundo contraste en la fila 3, cada una de las medias se basa en 12 datos por lo cual
Erstmedia 2 s 2 / 12 :
sqrt(2*(4961/12))/2
[1] 14.37735

Los ltimos dos contraste son ambos entre medias cada una con 6 datos, por lo cual:
Erstmedia 2 s 2 / 6 :
sqrt(2*(4961/6))/2
[1] 20.33265

La complejidad de estos clculos es otra razn para preferir los contrastes de tratamientos por
defecto a los especificados por los usuarios. Pero la ventaja de los contrastes ortogonales, adems,
es que la tabla summary.lm nos da mucha mejor idea del nmero de parmetros requeridos en el
modelo mnimo adecuado (2 en este caso). Los contrastes de tratamientos tenan estrellas de
significancia en todas las 5 filas ya que todos los tratamientos por fuera del control fueron
comparados con los controles (Intercepto).

Simplificacin de modelos por borrado en paso a paso (stepwise deletion).

100
Una alternativa a especificar nuestros contrastes, por nosotros mismos como se vio, es agregar
niveles de factores no significativos en un procedimiento posterior paso a paso. Para demostrarlo,
debemos revertir lo anterior. Primero desconectamos nuestros contrastes definidos por nosotros
de antemano con la funcin:
contrasts(clipping)<-NULL
options(contrasts=c("contr.treatment","contr.poly"))

Ahora ajustamos el modelo con todos los 5 niveles de los factores como punto de partida:
> model3<-aov(biomass ~ clipping)
> summary.lm(model3)

Call:
aov(formula = biomass ~ clipping)

Residuals:
Min 1Q Median 3Q Max
-103.333 -49.667 3.417 43.375 177.667

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 465.17 28.75 16.177 9.4e-15 ***
clippingn25 88.17 40.66 2.168 0.03987 *
clippingn50 104.17 40.66 2.562 0.01683 *
clippingr10 145.50 40.66 3.578 0.00145 **
clippingr5 145.33 40.66 3.574 0.00147 **
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 70.43 on 25 degrees of freedom


Multiple R-squared: 0.4077, Adjusted R-squared: 0.3129
F-statistic: 4.302 on 4 and 25 DF, p-value: 0.008752

Mirando la lista hacia abajo vemos que los efectos ms similares son los de poda de races a 10 y 5
cm (145.5 vs. 145.33). Empezaremos por simplificar estos dos en un solo tratamiento llamado root
(raz). El truco es usar la gets arrow para cambiar los nombres de los apropiados niveles de los
factores, para lo cual se inicia por copiar el nombre original del factor:
clip2<-clipping

En seguida inspeccionamos los nmeros de los niveles de los varios nombres de los niveles de los
factores:
> levels(clip2)
[1] "control" "n25" "n50" "r10" "r5"

El plan es agrupar conjuntamente r10 y r5 bajo el mismo nombre root, cuarto y quinto nivel de
clip2, para lo cual escribimos:
levels(clip2)[4:5]<-"root"

101
Si averiguamos:
levels(clip2)
[1] "control" "n25" "n50" "root"
r10 y r5 han sido reemplazados por root.

El prximo paso es ajustar un Nuevo modelo con clip2 en lugar de clipping, y verificar si el nuevo
modelo ms simple es significantemente peor que la descripcin de los datos usando anova:
> model4<-aov(biomass ~ clip2)
> anova(model3,model4)

Analysis of Variance Table

Model 1: biomass ~ clipping


Model 2: biomass ~ clip2
Res.Df RSS Df Sum of Sq F Pr(>F)
1 25 124020
2 26 124020 -1 -0.083333 0 0.9968

como se esperaba la simplificacin se justifica plenamente, no hay diferencia en los dos modelos
(p=0.9968).
El prximo paso es investigar los efectos, usando la funcin summary.lm:
summary.lm(model4)

Call:
aov(formula = biomass ~ clip2)

Residuals:
Min 1Q Median 3Q Max
-103.333 -49.667 3.417 43.417 177.667

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 465.17 28.20 16.498 2.72e-15 ***
clip2n25 88.17 39.87 2.211 0.036029 *
clip2n50 104.17 39.87 2.612 0.014744 *
clip2root 145.42 34.53 4.211 0.000269 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 69.07 on 26 degrees of freedom


Multiple R-squared: 0.4077, Adjusted R-squared: 0.3393
F-statistic: 5.965 on 3 and 26 DF, p-value: 0.003099

Pareciera que entre los tratamientos de podas de renuevos (n25 y n50) no hubiera diferencia
significativa entre ellos (difieren apena por solo 16.0 con un error estndar de 39.87). Se colocaran
juntos como ya se hizo con los de raz:

102
> clip3<-clip2
> levels(clip3)[2:3]<-"shoot"
> levels(clip3)
[1] "control" "shoot" "root"

Entonces se ajusta un nuevo modelo con clip3 en lugar de clip2:

> model5<-aov(biomass ~ clip3)


> anova(model4,model5)
Analysis of Variance Table

Model 1: biomass ~ clip2


Model 2: biomass ~ clip3
Res.Df RSS Df Sum of Sq F Pr(>F)
1 26 124020
2 27 124788 -1 -768 0.161 0.6915

De nuevo se justifica la simplificacin. Diferirn los niveles de los tratamientos raz y renuevo?
Para ello como se ha hecho antes:
clip4<-clip3
levels(clip4)[2:3]<-"pruned"
levels(clip4)
[1] "control" "pruned"
se corre un modelo(6)
> model6<-aov(biomass ~ clip4)
> anova(model5,model6)
Analysis of Variance Table

Model 1: biomass ~ clip3


Model 2: biomass ~ clip4
Res.Df RSS Df Sum of Sq F Pr(>F)
1 27 124788
2 28 139342 -1 -14553 3.1489 0.08726 .

Aceptamos la simplificacin. Ahora tenemos el modelo mnimo adecuado:


> summary.lm(model6)

Call:
aov(formula = biomass ~ clip4)

Residuals:
Min 1Q Median 3Q Max
-135.958 -49.667 -4.458 50.635 145.042

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 465.2 28.8 16.152 1.01e-15 ***
103
clip4pruned 120.8 32.2 3.751 0.000815 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 70.54 on 28 degrees of freedom


Multiple R-squared: 0.3345, Adjusted R-squared: 0.3107
F-statistic: 14.07 on 1 and 28 DF, p-value: 0.000815

Queda con justo dos parmetros: la media de los controles (465.2) y la diferencia entre la media
de control y las 4 medias de tratamientos (465.2+120.8=586.0):

tapply(biomass,clip4,mean)
control pruned
465.1667 585.9583

Sabemos que estas dos medias difieren significativamente por el p value = 0.000815, pero para
saber como sucede esto ajustamos un modelo 7 sin variable explicatoria (se ajusta nicamente la
media total). Ello se logra escribiendo y~1 en la frmula del modelo:

> model7<-aov(biomass~1)
> anova(model6,model7)
Analysis of Variance Table

Model 1: biomass ~ clip4


Model 2: biomass ~ 1
Res.Df RSS Df Sum of Sq F Pr(>F)
1 28 139342
2 29 209377 -1 -70035 14.073 0.000815 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Se nota que el p value no cambi con respecto al modelo 6. Los p values en R se calculan de tal
manera que eviten este paso final en la simplificacin.

Tamao de los efectos

El R dispone de la funcin plot.design (la cual toma una frmula en vez de un modelo objeto as:

plot.design(y~x)

R muestral los efectos como desviaciones de la media general. Los errores estndar que aparecen
ac no son los apropiados para comparar dos medias. Si se especifica "means" tendr los
correctos:

model.tables(model,"means",se=T)

104
La otra forma de buscar los tamaos de los efectos es usando la funcin. summary.lm para ver el
modelo lineal:
summary.lm(aov(y~soil))
La prxima accin sera verificar las asunciones del modelo aov usando la funcin plot como:
plot(aov(y~x))

La primera grafica izquierda superior mira homocedasticidad. La segunda (derecha arriba) verifica
normalidad de los errores si se encuentra una lnea recta ntrenlos residuales estandarizados y los
cuantiles derivados de la distribucin normal. La tercera iz abajo muestra el comportamiento de
los residuales y la ltima observaciones remotas o influenciales que podran distorsionar los
parmetros estimados.

Experimentos con arreglo factorial.

Entonces tienen 2 o ms factores cada uno con dos o ms niveles, mas replicaciones para cada
combinacin de los niveles de los factores, lo que implica investigar las interacciones, en las cuales
la respuesta de un factor depende del nivel de otro.

Por ejemplo sean fincas de diversas escalas en las cuales vamos a probar dietas de animal. Se
prueban dos factores: diet y supplement. Diet con 3 niveles: barley (cebada), oats (avena) y wheat
(trigo). Supplement, el Segundo factor con 4 niveles de productos (comerciales y un testigo):
agrimore, control, supergain y supersupp. La variable respuesta fue la ganancia de peso luego de
6 semanas:
peso<-read.table("c:\\estadistica\\growth.txt",header=T)
attach(peso)

La inspeccin de datos se puede empezar usando la funcin barplot (en la cual con el uso de
beside=T coloca barras en grupos adyacentes en vez de las acostumbradas pilas verticales):
barplot(tapply(gain,list(diet,supplement),mean),
beside=T,ylim=c(0,30),col=rainbow(3))
labs<-c("Cebada","Avena","Trigo")
legend(locator(1),labs,fill=rainbow(3))

105
La leyenda se ubica dando click en la ubicacin que usted desee en la grfica. Inspeccionamos las
medias usando la funcin tapply

tapply(gain,list(diet,supplement),mean)

agrimore control supergain supersupp


barley 26.34848 23.29665 22.46612 25.57530
oats 23.29838 20.49366 19.66300 21.86023
wheat 19.63907 17.40552 17.01243 19.66834a

Ahora pasamos a las funciones aov o lm para ajustar el anlisis de varianza en arreglo factorial (La
escogencia depende si deseamos la tabla de ANOVA o los parmetros estimados del modelo como
se estima por defecto en la funcin summary).

model<-aov(gain~diet*supplement)

summary(model)
Df Sum Sq Mean Sq F value Pr(>F)
diet 2 287.171 143.586 83.5201 2.999e-14 ***
supplement 3 91.881 30.627 17.8150 2.952e-07 ***
diet:supplement 6 3.406 0.568 0.3302 0.9166
Residuals 36 61.890 1.719
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Cmo para una simplificacin preliminar y del modelo la funcin, summary.lm es a menudo ms
til que la anterior, como ya se present:

summary.lm(model)
106
Call:
aov(formula = gain ~ diet * supplement)

Residuals:
Min 1Q Median 3Q Max
-2.48756 -1.00368 -0.07452 1.03496 2.68069

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 26.3485 0.6556 40.191 < 2e-16 ***
dietoats -3.0501 0.9271 -3.290 0.002248 **
dietwheat -6.7094 0.9271 -7.237 1.61e-08 ***
supplementcontrol -3.0518 0.9271 -3.292 0.002237 **
supplementsupergain -3.8824 0.9271 -4.187 0.000174 ***
supplementsupersupp -0.7732 0.9271 -0.834 0.409816
dietoats:supplementcontrol 0.2471 1.3112 0.188 0.851571
dietwheat:supplementcontrol 0.8183 1.3112 0.624 0.536512
dietoats:supplementsupergain 0.2470 1.3112 0.188 0.851652
dietwheat:supplementsupergain 1.2557 1.3112 0.958 0.344601
dietoats:supplementsupersupp -0.6650 1.3112 -0.507 0.615135
dietwheat:supplementsupersup 0.8024 1.3112 0.612 0.544381
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 1.311 on 36 degrees of freedom


Multiple R-squared: 0.8607, Adjusted R-squared: 0.8182
F-statistic: 20.22 on 11 and 36 DF, p-value: 3.295e-12

Simplificacin del modelo.

Similar al proceso de regresin mltiple (que solo usa variables continuas en la mayora de los
casos) el Anova (aov) para Diseos experimentales usa variables categricas principalmente o una
mezcla de estas con continuas. El principio de la barbera de Occam (Occams razor), da lugar al
concepto de parsimonia en estadstica: Se requiere que el modelo sea tan simple como sea
posible, lo que quiere decir que carezca de parmetros o niveles de factores redundantes. Para
ello se ajusta un modelo mximo y se va simplificando de acuerdo con uno o ms de los siguientes
pasos:
Remover trminos de interacciones no significativos.
Remover trminos cuadrticos o no lineales no significativos.
Remover variables explicatorias no significativas.
Agrupar niveles de factores que no difieran entre ellos.
Amalgamar variables explicatorias con valores de parmetros similares.
Ajustar pendientes no significativas a cero dentro de un ANCOVA.

107
Deben tener obviamente sentido cientfico o practico tales simplificaciones y no atentar nuca
contra el poder explicatorio. Resultan muy a menudo variables explicatorias correlacionadas entre
ellas, por lo cual el orden en que se retiran del modelo influenciar este poder explicatorio,
adems de recordar que el nmero de combinaciones de trminos de interaccin y trminos
polinomiales pueden volverse un infinito. Existen algunas reglas simples como las expresadas y
algunas formas automticas de proceder como los stepwise, pero en principio siempre demandar
mucho tiempo la modelacin de un simple dataframe. No existen reglas concretas ni fciles para
lograrlo, pero en el borrado a pasos (stepwise deletion) algunos trminos no-significativos son
dejados de lado y otros significativos aparecen con posterioridad.

Volviendo a nuestro ejemplo, result un modelo complejo, con 12 parmetros estimados (el
nmero de filas en la tabla): 6 efectos principales y 6 interacciones. La salida muestra que ninguna
de las interacciones result significativa, pero sugiere que el modelo mnimo adecuado requerira
de 5 parmetros: un intercepto, una diferencia debida a la avena (oats), una diferencia debida al
trigo (wheat), una diferencia debida al control y una diferencia debida al supergain (las 5 filas con
estrellas de significancia alta). Se debe prestar atencion a los principales defectos al usar
contrastes de tratamientos por defecto. Al mirar cuidadosamente la tabla ver que los tamaos de
los efectos de los dos suplementos, control y supergain, no resultan significativamente diferentes
entre ellos. Se require bastante prctica para juzgar las pruebas de t. Ignorando los signos (dos de
ellos negativos), tenemos 3.05 vs. 3.88, una diferencia de 0.83, pero con errores estndar de
0.927; con diferencia menor de 1 error estndar entre las dos medias. Para ser significativa se
necesitara al bulto al menos 2 errores estndar (recuerde una regla del dedo pulgar t 2 es
generalmente significativa). Las filas tienen doble asterisco en las columnas de significancia a
causa de que los contrastes de tratamientos comparan todos los efectos principales en las filas
con el intercepto (pues en R un factor es ubicado en el primer nivel alfabticamente,
nominalmente agrimore y barley para el caso). Cuando, como ac, varios niveles de factores son
diferentes del intercepto sin ser diferentes unos de otros, ellos portan estrellas significativas. Esto
significa que no podemos contar el numero de filas con estrellas con el fin de determinar
diferencias significativas en los niveles. Podemos, entonces, dejar de lado los trminos de las
interacciones por no resultar significativos:
> model<-aov(gain~diet+supplement)
> summary.lm(model)

Call:
aov(formula = gain ~ diet + supplement)

Residuals:
Min 1Q Median 3Q Max
-2.30792 -0.85929 -0.07713 0.92052 2.90615

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.1230 0.4408 59.258 < 2e-16 ***
dietoats -3.0928 0.4408 -7.016 1.38e-08 ***
dietwheat -5.9903 0.4408 -13.589 < 2e-16 ***
supplementcontrol -2.6967 0.5090 -5.298 4.03e-06 ***

108
supplementsupergain -3.3815 0.5090 -6.643 4.72e-08 ***
supplementsupersupp -0.7274 0.5090 -1.429 0.160
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 1.247 on 42 degrees of freedom


Multiple R-squared: 0.8531, Adjusted R-squared: 0.8356
F-statistic: 48.76 on 5 and 42 DF, p-value: < 2.2e-16

Ahora resulta claro que debemos retener todos los 3 niveles de dieta (oats difiere de wheat por
5.993.09 = 2.90 con un error estndar de 0.44). No es claro sin embargo que necesitemos los 4
niveles de supplement. Supersupp no es obviamente diferente de agrimore (0.727 con error
estandar 0.509). Ni es supergain diferente de control de animales no suplementados
(3.382.70=0.68). Se tratar un nuevo factor de dos niveles para reemplazar el suplemento de 4
niveles, y vemos si esta significancia reduce el poder explicatorio del modelo. Agrimore y
supersupp sern recodificados como mejor (best) y control y supergain como peor (worst):

> supp2<-factor(supplement)
> levels(supp2)
[1] "agrimore" "control" "supergain" "supersupp"

> levels(supp2)[c(1,4)]<-"best"
> levels(supp2)[c(2,3)]<-"worst"
> levels(supp2)
[1] "best" "worst"

Ahora podemos compar los dos modelos:


> model2<-aov(gain~diet+supp2)
> anova(model,model2)

Analysis of Variance Table

Model 1: gain ~ diet + supplement


Model 2: gain ~ diet + supp2
Res.Df RSS Df Sum of Sq F Pr(>F)
1 42 65.296
2 44 71.284 -2 -5.9876 1.9257 0.1584
El model2 ms simple ha salvado 2 grados de libertad y no es significativamente peor que el
modelo mas complejo (p=0.158). Este es el modelo mnimo adecuado: todos los parmetros son
significativamente diferentes de cero y el uno del otro:

> summary.lm(model2)

Call:
aov(formula = gain ~ diet + supp2)

109
Residuals:
Min 1Q Median 3Q Max
-2.6716 -0.9432 -0.1918 0.9293 3.2698

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 25.7593 0.3674 70.106 < 2e-16 ***
dietoats -3.0928 0.4500 -6.873 1.76e-08 ***
dietwheat -5.9903 0.4500 -13.311 < 2e-16 ***
supp2worst -2.6754 0.3674 -7.281 4.43e-09 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 1.273 on 44 degrees of freedom


Multiple R-squared: 0.8396, Adjusted R-squared: 0.8286
F-statistic: 76.76 on 3 and 44 DF, p-value: < 2.2e-16

La simplificacin de modelos ha reducido nuestro modelo con 12 parmetros iniciales a un modelo


con 4 parmetros.

ANOVA con aov o lm.

Se reitera, la diferencia entre lm y aov es principalmente en la forma de la salida: la tabla de


resumen (summary table) con aov es la forma tradicional de los anavas, con una fila para cada
variable categrica y cada trmino de interaccin. De otra parte el resumen para lm (summary
table for lm) produce una fila por parmetro estimado (o sea, una fila por cada nivel del factor y
una fila por cada nivel de interaccin). cuando se tienen multiples del error, se debe usar aov
porque lm no soporta trminos del error. Ac se muestral el mismo analisis ajustado de dos vas
usando aov primero y luego con lm con un dataframe llamado Daphnia:

daphnia<-read.table("c:\\estadistica\\Daphnia.txt",header=T)
attach(daphnia)
names(daphnia)

"Growth.rate" "Water" "Detergent" "Daphnia"


> daphnia
Growth.rate Water Detergent Daphnia
1 2.919086 Tyne BrandA Clone1
2 2.492904 Tyne BrandA Clone1
3 3.021804 Tyne BrandA Clone1
4 2.350874 Tyne BrandA Clone2
5 3.148174 Tyne BrandA Clone2
6 4.423853 Tyne BrandA Clone2
7 4.870959 Tyne BrandA Clone3

69 5.990973 Wear BrandD Clone2


70 2.553241 Wear BrandD Clone3

110
71 2.592766 Wear BrandD Clone3
72 1.761603 Wear BrandD Clone3

> model1<-aov(Growth.rate~Water*Detergent*Daphnia)
> summary(model1)
Df Sum Sq Mean Sq F value Pr(>F)
Water 1 1.985 1.9851 2.8504 0.0978380 .
Detergent 3 2.212 0.7372 1.0586 0.3754783
Daphnia 2 39.178 19.5889 28.1283 8.228e-09 ***
Water:Detergent 3 0.175 0.0583 0.0837 0.9686075
Water:Daphnia 2 13.732 6.8660 9.8591 0.0002587 ***
Detergent:Daphnia 6 20.601 3.4334 4.9302 0.0005323 ***
Water:Deterg:Daph 6 5.848 0.9746 1.3995 0.2343235
Residuals 48 33.428 0.6964
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

> model2<-lm(Growth.rate~Water*Detergent*Daphnia)
> summary(model2)

Call:
lm(formula = Growth.rate ~ Water * Detergent * Daphnia)

Residuals:
Min 1Q Median 3Q Max
-1.4882 -0.5440 0.0239 0.3560 1.5250

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.81126 0.48181 5.835 4.48e-07***
WaterWear -0.15808 0.68138 -0.232 0.81753
DetergentBrandB -0.03536 0.68138 -0.052 0.95883
DetergentBrandC 0.47626 0.68138 0.699 0.48794
DetergentBrandD -0.21407 0.68138 -0.314 0.75475
DaphniaClone2 0.49637 0.68138 0.728 0.46986
DaphniaClone3 2.05526 0.68138 3.016 0.00408**
WaterWear:DetergentBrandB 0.46455 0.96361 0.482 0.63193
WaterWear:DetergentBrandC -0.27431 0.96361 -0.285 0.77712
WaterWear:DetergentBrandD 0.21729 0.96361 0.225 0.82255
WaterWear:DaphniaClone2 1.38081 0.96361 1.433 0.15835
WaterWear:DaphniaClone3 0.43156 0.96361 0.448 0.65627
DetergentBrandB:DaphniaClone2 0.91892 0.96361 0.954 0.34506
DetergentBrandC:DaphniaClone2 -0.16337 0.96361 -0.170 0.86609
DetergentBrandD:DaphniaClone2 1.01209 0.96361 1.050 0.29884
DetergentBrandB:DaphniaClone3 -0.06490 0.96361 -0.067 0.94658
DetergentBrandC:DaphniaClone3 -0.80789 0.96361 -0.838 0.40597
DetergentBrandD:DaphniaClone3 -1.28669 0.96361 -1.335 0.18809
111
WaterWear:DetergentBrandB:DaphniaClone2 -1.26380 1.36275 -0.927 0.35837
WaterWear:DetergentBrandC:DaphniaClone2 1.35612 1.36275 0.995 0.32466
WaterWear:DetergentBrandD:DaphniaClone2 0.77616 1.36275 0.570 0.57164
WaterWear:DetergentBrandB:DaphniaClone3 -0.87443 1.36275 -0.642 0.52414
WaterWear:DetergentBrandC:DaphniaClone3 -1.03019 1.36275 -0.756 0.45337
WaterWear:DetergentBrandD:DaphniaClone3 -1.55400 1.36275 -1.140 0.25980
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 0.8345 on 48 degrees of freedom


Multiple R-squared: 0.7147, Adjusted R-squared: 0.578
F-statistic: 5.227 on 23 and 48 DF, p-value: 7.019e-07

Se nota que dos interacciones significativas, WaterDaphnia y DetergentDaphnia, mostradas en


la tabla aov no estn en el resumen lm (ello debido a menudo al hecho que la tabla lm summary
muestra contrastes de tratamientos diferentes a unos contrastes llamados (Helmert contrasts).
Esto llama la atencin acerca del modelo de simplificacin usado por fila con pruebas de t (o sea,
removiendo los trminos de interaccin de tercer orden en este caso). En las tablas aov, los
valores de p (p values) son los de borrado los cuales son una gran ventaja.

La principal diferencia es que hay 8 filas en la tabla resumen del aov (3 efectos principales, 3
interacciones de doble va, una interaccin de triple va y un trmino del error) pero, hay 24 filas
en la tabla resumen del proceso lm (4 niveles de detergent por 3 de clones de daphnia por2
niveles dewater). Se puede fcilmente ver la salida de model1 en el arreglo de modelo lineal, o el
model2 como una tabla de ANOVA usando las opciones: options .lm o .aov:

summary.lm(model1)

Call:
aov(formula = Growth.rate ~ Water * Detergent * Daphnia)

Residuals:
Min 1Q Median 3Q Max
-1.4882 -0.5440 0.0239 0.3560 1.5250

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.81126 0.48181 5.835 4.48e-07
WaterWear -0.15808 0.68138 -0.232 0.81753
DetergentBrandB -0.03536 0.68138 -0.052 0.95883
DetergentBrandC 0.47626 0.68138 0.699 0.48794
DetergentBrandD -0.21407 0.68138 -0.314 0.75475
DaphniaClone2 0.49637 0.68138 0.728 0.46986
DaphniaClone3 2.05526 0.68138 3.016 0.00408
WaterWear:DetergentBrandB 0.46455 0.96361 0.482 0.63193
WaterWear:DetergentBrandC -0.27431 0.96361 -0.285 0.77712

112
WaterWear:DetergentBrandD 0.21729 0.96361 0.225 0.82255
WaterWear:DaphniaClone2 1.38081 0.96361 1.433 0.15835
WaterWear:DaphniaClone3 0.43156 0.96361 0.448 0.65627
DetergentBrandB:DaphniaClone2 0.91892 0.96361 0.954 0.34506
DetergentBrandC:DaphniaClone2 -0.16337 0.96361 -0.170 0.86609
DetergentBrandD:DaphniaClone2 1.01209 0.96361 1.050 0.29884
DetergentBrandB:DaphniaClone3 -0.06490 0.96361 -0.067 0.94658
DetergentBrandC:DaphniaClone3 -0.80789 0.96361 -0.838 0.40597
DetergentBrandD:DaphniaClone3 -1.28669 0.96361 -1.335 0.18809
WaterWear:DetergentBrandB:DaphniaClone2 -1.26380 1.36275 -0.927 0.35837
WaterWear:DetergentBrandC:DaphniaClone2 1.35612 1.36275 0.995 0.32466
WaterWear:DetergentBrandD:DaphniaClone2 0.77616 1.36275 0.570 0.57164
WaterWear:DetergentBrandB:DaphniaClone3 -0.87443 1.36275 -0.642 0.52414
WaterWear:DetergentBrandC:DaphniaClone3 -1.03019 1.36275 -0.756 0.45337
WaterWear:DetergentBrandD:DaphniaClone3 -1.55400 1.36275 -1.140 0.25980

(Intercept) ***
WaterWear
DetergentBrandB
DetergentBrandC
DetergentBrandD
DaphniaClone2
DaphniaClone3 **
WaterWear:DetergentBrandB
WaterWear:DetergentBrandC
WaterWear:DetergentBrandD
WaterWear:DaphniaClone2
WaterWear:DaphniaClone3
DetergentBrandB:DaphniaClone2
DetergentBrandC:DaphniaClone2
DetergentBrandD:DaphniaClone2
DetergentBrandB:DaphniaClone3
DetergentBrandC:DaphniaClone3
DetergentBrandD:DaphniaClone3
WaterWear:DetergentBrandB:DaphniaClone2
WaterWear:DetergentBrandC:DaphniaClone2
WaterWear:DetergentBrandD:DaphniaClone2
WaterWear:DetergentBrandB:DaphniaClone3
WaterWear:DetergentBrandC:DaphniaClone3
WaterWear:DetergentBrandD:DaphniaClone3
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 0.8345 on 48 degrees of freedom


Multiple R-squared: 0.7147, Adjusted R-squared: 0.578
F-statistic: 5.227 on 23 and 48 DF, p-value: 7.019e-07

113
summary.aov(model2)
Df Sum Sq Mean Sq F value Pr(>F)
Water 1 1.985 1.9851 2.8504 0.0978380 .
Detergent 3 2.212 0.7372 1.0586 0.3754783
Daphnia 2 39.178 19.5889 28.1283 8.228e-09 ***
Water:Detergent 3 0.175 0.0583 0.0837 0.9686075
Water:Daphnia 2 13.732 6.8660 9.8591 0.0002587 ***
Detergent:Daphnia 6 20.601 3.4334 4.9302 0.0005323 ***
Water:Detergent:Daphnia 6 5.848 0.9746 1.3995 0.2343235
Residuals 48 33.428 0.6964
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Tamao de los efectos.

En diseos de experimentos complicados, es ms fcil resumir estos tamaos de los efectos con la
funcin model.tables. Ellas toman el nombre del objeto modelo ajustado como su primer
argumento, y usted puede especificar si desea los errores estndar (como usualmente se hara):

model.tables(model1, "means", se = TRUE)


Tables of means
Grand mean

3.851905

Water
Water
Tyne Wear
3.686 4.018

Detergent
Detergent
BrandA BrandB BrandC BrandD
3.885 4.010 3.955 3.558

Daphnia
Daphnia
Clone1 Clone2 Clone3
2.840 4.577 4.139

Water:Detergent
Detergent
Water BrandA BrandB BrandC BrandD
Tyne 3.662 3.911 3.814 3.356
Wear 4.108 4.109 4.095 3.760

114
Water:Daphnia
Daphnia
Water Clone1 Clone2 Clone3
Tyne 2.868 3.806 4.383
Wear 2.812 5.348 3.894

Detergent:Daphnia
Daphnia
Detergent Clone1 Clone2 Clone3
BrandA 2.732 3.919 5.003
BrandB 2.929 4.403 4.698
BrandC 3.071 4.773 4.019
BrandD 2.627 5.214 2.834

Water:Detergent:Daphnia
, , Daphnia = Clone1

Detergent
Water BrandA BrandB BrandC BrandD
Tyne 2.811 2.776 3.288 2.597
Wear 2.653 3.082 2.855 2.656

, , Daphnia = Clone2

Detergent
Water BrandA BrandB BrandC BrandD
Tyne 3.308 4.191 3.621 4.106
Wear 4.530 4.615 5.925 6.322

, , Daphnia = Clone3

Detergent
Water BrandA BrandB BrandC BrandD
Tyne 4.867 4.766 4.535 3.366
Wear 5.140 4.630 3.504 2.303

Standard errors for differences of means


Water Detergent Daphnia Water:Detergent Water:Daphnia
0.1967 0.2782 0.2409 0.3934 0.3407
replic. 36 18 24 9 12
Detergent:Daphnia Water:Detergent:Daphnia
0.4818 0.6814
replic. 6 3

115
Ac debe notarse que los errors estandar son de diferencias, y que son diferentes en cada uno de
los diferentes estratos ya que difeieren las replicaciones. Todos los errores estandar usan la misma
varianza mezclada del error s2 =0.696 (ver la tabla arriba). por ejemplo las interaciones de tercer
orden tienen Ee 2 0.696 / 24 0.681 y los efectos principales de daphnia tienen:
Ee 2 0.696 / 24 0.2409

Graficas atractivas de los tamaos de los efectos se encuentran en la librera de efectos: paquete
de efectos que toma un objeto modelo (un modelo lineal o un modelo lineal generalizado) y
produce graficas enrejadas de los efectos especificados.

> install.packages("effects")

sale una informacin al respectoluego de unos segundos.

library(effects)

model<-lm(Growth.rate~Water*Detergent*Daphnia)

Primero calcula todos los efectos usando las funcion allEeffects, luego de lo cual se grafica este
objeto especificando la interaccion que estemos interesados en ver, por ejmplo los de Dapnia
utilizando comillas dobles(double quotes):

> daph.effects<-allEffects(model)

plot(daph.effects,"Water:Detergent:Daphnia")

mostrada en la pagina siguiente.

Resumen.

Es necesario dar algunas pautas importantes acerca de la graficacin:

Grficas: plot(x,y) da una grafica de dispersion de valores de x si x is continua, y un grafico de


caja y bigotes (box-and-whisker plot) se x es un factor. Algunos prefieren la sintaxis alternativa
plot(y~x) usando la tilde como en la frmula de un modelo.

116
Tipo de grfica: las opciones incluyen lineas type="l" o nada, solo los ejes con type="n".
Lineas: lines(x,y) grafica una function suavizada (smooth function) de y versus x usando los
valores de x y y proporcionados por el usuario. pero podra preferir lines(y~x).
Tipos de lineas: Util con grficas de multiples lineas, lty=2 (una opcion para graficas o lneas).
Puntos: points(x,y) adiciona otro grupo de puntos de datos a una parcela. Usted podra preferir
points(y~x).
Graficas de caracteres para diferentes conjuntos de datos: pch=2 o pch="*" (es una opcion para
points o plot)
Ajuste de lmites no por defecto: Ajustaar los limites no por defecto a las escalas de los ejes de
x o y usa xlim=c(0,25) y/o ylim=c(0,1) como una opcion al graficar.

Comparaciones mltiples (Multiple Comparisons)

Cuando se hace una prueba de comparaciones de medias para los niveles de un factor en un
anova, una comparacin simple usando pruebas mltiples de t inflan la probabilidad de declara
una diferencia significativa sin que ello sea cierto. Esto a causa de que los intervalos son calculados
con una cobertura de probabilidad dada para cada intervalo pero la interpretacin de esta
cobertura es usualmente con respecto la familia entera de intervalos (o sea para el factor como un
todo). Con los protocolos de simplificacin de modelosya explorados esto no suceder con
frecuencia, porque una t ocasionalmente significativa entre un ramillete de interacciones no
significativas con un gran numero de niveles difcilmente sobrevivir a la prueba de borrado. Por
ello si se tienen factores con gran nmero de niveles podra usarse ms bien modelos de efectos
mezclados que el ANOVA de efectos fijos).

117
Tukey introdujo intervalos basados en el rango de medias muestrales en vez del de las diferencias
individuales, hoy da llamadas diferencias honestamente significativas. Estas son basadas en
rangos estudentizados invocando la funcion TukeyHSD.

Tecnicamente los intervalos construidos en esta forma podran aplicarse unnicamente a diseos
balanceados en que cada nivel del factor tiene el mismo numero de observaciones . Esta funcin
incorpora un ajuste del tamao d muestra que produce intervalos sensibles modelos
mediamnamente desbalanceados).

El siguiente ejemplo tiene que ver con la produciin de hongos recogidos en 16 habitats
diferentes:

> hongos<-read.table("c:\\estadistica\\Fungi.txt",header=T)
> attach(hongos)
> names(hongos)
[1] "Habitat" "Fungus.yield"

vamos a establecer si se dan diferencias en la produccin:

> model<-aov(Fungus.yield~Habitat)
> summary(model)
Df Sum Sq Mean Sq F value Pr(>F)
Habitat 15 7527.4 501.83 72.141 < 2.2e-16 ***
Residuals 144 1001.7 6.96
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Aparece un (p<0.000001), a causa de que unos habitats producen mas hongos que otros. Las
comparaciones multiples en 16 habitats daran (16 15)/2 = 120 posibles comparaciones
pareadas. Se dan dos opciones:
Aplicar la funcion TukeyHSD al modelo;
Usar la funcion pairwise.t.test para obtener los p values ajustados para todas las comparaciones.

Ac se presenta la prueba de Tukey que produce una tabla de p values por defecto:
TukeyHSD(model)
Tukey multiple comparisons of means
95% family-wise confidence level

Fit: aov(formula = Fungus.yield ~ Habitat)

$Habitat
diff lwr upr p adj
Ash-Alder 3.53292777 -0.5808096 7.6466651 0.1844088
Aspen-Alder 12.78574402 8.6720067 16.8994814 0.0000000
Beech-Alder 12.32365349 8.2099161 16.4373908 0.0000000
Birch-Alder 14.11348150 9.9997441 18.2272189 0.0000000

118
..
Willow-Rowan -3.51860059 -7.6323379 0.5951368 0.1896363
Sycamore-Spruce 4.96019563 0.8464583 9.0739330 0.0044944
Willow-Spruce 4.92754623 0.8138089 9.0412836 0.0049788
Willow-Sycamore -0.03264941 -4.1463868 4.0810879 1.0000000

pero puede graficar estos intervlos si prefiere o hacer ambos, desde luego:

plot(TukeyHSD(model))

Habitats en lados opuestos de la linea punteada y no traslapantes son significativamente


diferentes entre ellos.

Alternativamente puede usar la function pairwise.t.test en la cual usted especifica la variable


respuesta y la variable categrica que contiene los niveles de los factores que desa sean
comparados separados por una coma (no un a tilde):
pairwise.t.test(Fungus.yield,Habitat)

119
Pairwise comparisons using t tests with pooled SD

data: Fungus.yield and Habitat

Alder Ash Aspen Beech Birch Cherry Chestnut Holmoak


Ash 0.10011 - - - - - - -
Aspen < 2e-16 6.3e-11 - - - - - -
Beech < 2e-16 5.4e-10 1.00000 - - - - -
Birch < 2e-16 1.2e-13 1.00000 1.00000 - - - -
Cherry 4.7e-13 2.9e-06 0.87474 1.00000 0.04943 - - -
Chestnut < 2e-16 7.8e-10 1.00000 1.00000 1.00000 1.00000 - -
Holmoak 1.00000 0.00181 < 2e-16 < 2e-16 < 2e-16 3.9e-16 < 2e-16 -
Hornbeam 1.1e-13 8.6e-07 1.00000 1.00000 0.10057 1.00000 1.00000 < 2e-16
Lime < 2e-16 < 2e-16 1.1e-05 1.9e-06 0.00131 3.3e-10 1.4e-06 < 2e-16
Oak < 2e-16 < 2e-16 1.4e-07 2.0e-08 2.7e-05 1.9e-12 1.5e-08 < 2e-16
Pine < 2e-16 3.9e-14 1.00000 1.00000 1.00000 0.02757 1.00000 < 2e-16
Rowan 1.8e-05 0.51826 8.5e-06 4.7e-05 3.9e-08 0.03053 6.2e-05 5.3e-08
Spruce 1.00000 0.00016 < 2e-16 < 2e-16 < 2e-16 < 2e-16 < 2e-16 1.00000
Sycamore 0.50084 1.00000 2.1e-12 1.9e-11 3.3e-15 1.5e-07 2.7e-11 0.01586
Willow 0.51826 1.00000 1.9e-12 1.6e-11 2.8e-15 1.4e-07 2.4e-11 0.01702
Hornbeam Lime Oak Pine Rowan Spruce Sycamore
Ash - - - - - - -
Aspen - - - - - - -
Beech - - - - - - -
Birch - - - - - - -
Cherry - - - - - - -
Chestnut - - - - - - -
Holmoak - - - - - - -
Hornbeam - - - - - - -
Lime 1.3e-09 - - - - - -
Oak 8.4e-12 1.00000 - - - - -
Pine 0.05975 0.00253 6.1e-05 - - - -
Rowan 0.01380 < 2e-16 < 2e-16 1.5e-08 - - -
Spruce < 2e-16 < 2e-16 < 2e-16 < 2e-16 2.5e-09 - -
Sycamore 4.2e-08 < 2e-16 < 2e-16 1.1e-15 0.10218 0.00187 -
Willow 3.8e-08 < 2e-16 < 2e-16 9.3e-16 0.10057 0.00203 1.00000

P value adjustment method: holm

Como ve se uso el metodo por defecto de ajuste de los p-values: holm, pero existen otros como:
hochberg, hommel, bonferroni, BH, BY, fdr y none. Sin ajuste de los p values, la comparacin
entre rowanwillow cluce altamente significativa (p=0.00335), como lo puede ver si trata con:

pairwise.t.test(Fungus.yield,Habitat,p.adjust.method="none")

120
Algunos prefieren a TukeyHSD por ser mas conservadora sin llegar al meticulosidad a veces
exagerada para algunos de Bonferroni). Por ejemplo, Tukey da la coparacion birchcherry como
no significativa (p=0.101102 7) mientras Holm la encuentra significativa (p=0.04943). Tukey
muestral Willow-Holm Oak significativa (p = 0.038091 0), mientras Bonferroni hace todo lo
contrario pero por muy poco (p=0.056 72).
Existe un paquete estadstico para comparaciones multiples llamado multcomp:
install.packages("multcomp")

Si lo explora ver una lista ingente de propuestas que hacen este tema bastante prolijo en pruebas

Comparaciones multiples de Dunnett desde muchas a una.


Comparaciones de Tukey todas pareadas
Sequen
AVE
Changepoint
Williams
Marcus
McDermott
Tetrade
Bonferroni correction
Holm
Hochberg
Hommel
BenjaminiHochberg
BenjaminiYekutieli

Estas pruebas fueron diseadas para proceder a las comparacines multiples dentro de los modelos
lineales general es, por lo cual sirven para covariadas, efectos aniddos, medias correlacionadas y
valores faltantes. Los primeros 4 mtodos son para dar un fuerte control de la tasa de error
familiar. Los de Benjamini, Hochberg, y Yekutieli controlan una falsa rata descubierta que es la
proporcin esperada de todas lal falsas descubiertas entre las hiptesis rechazadas. Esta falsa rata
descubierta es una menos rigurosa condicin que las tasas familiares por lo que estos mtodos
son mas potentes que otros.

121

Potrebbero piacerti anche