# ROGER GUEVARA (roger.guevara@inecol.edu.mx)

# INSTITUTO DE ECOLOGIA A.C

# RED DE BIOLOGÍA EVOLUTIVA


# ESTADISTICA COMPUTACIONAL EN R

# IMPORTAR DATOS ------------------------------ Para importar una base de
# datos a R se requiere que, 1) La base de datos esté en un formato
# adecuado. R no puede leer el formato de excel, pero si dos formatos que
# podemos generar desde excel. Estos formatos son de texto simple, uno es
# el formato de valores separados por comas << CSV >> y el otro es el
# formato de texto separado por tabuladores << TXT >>.

# La función que utilizamos para importar los datos es << read.table() >>
# que tiene tres argumentos primarios. 1) La ruta en donde se encunetra el
# archivo de datos que queremos leer, incluyendo el nombre del archivo con
# la extensión correspondiente. 2) Un indicador lógico de si el archivo de
# datos tiene encabezados, es decir si la primera fila de la base de datos
# incluye nombres que identifican a cada una de las columnas. Por omisión
# este indicador esta definido como falso, es decir que no hay encabezados
# para las columnas. Usualmente nuestras bases de datos si tienen
# encabezados por lo que es necesario ajustar es indicador a verdadero con
# la palabra << TRUE >>. El tercer argumento en esta función para importar
# bases de datos se refiere al formato del archivo, si es que este está
# separado por comas debemos escribir << ',' >> o si está separado por
# tabuladores deberemos escribir << '\t' >>.

DATOS <- read.table("~/desktop/curso R 2012/TOLOACHE.csv", header = TRUE, sep = ",")
DATOS <- read.table("~/desktop/curso R 2012/TOLOACHE.txt", header = TRUE, sep = "\t")

# En windows la sintaxis es ligeramente diferente, y se deben utilizar
# dobles diagonales inversas << \\ >> entre los subdirectorios en la
# ruta

# DATOS <- read.table('c:\\...\\.....\\TOLOACHE.csv', header = TRUE,
# sep = ',') DATOS <- read.table('c:\\...\\.....\\TOLOACHE.csv',
# header = TRUE, sep = '\t')


# Como estamos asignando la base de datos importada a un objeto, << DATOS
# >> en la consola solamente vamos a ver el eco de la instrucción que
# hemos ejecutado. Ahora debemos proceder a explorar la base de datos para
# tener certeza de que el proceso de importación fue 100% exitoso. Con la
# función << names() >> exploramos cuales son los encabezados de las
# columnas.

names(DATOS)
##  [1] "NOTAS"          "NUM"            "INVERNADERO"    "LUZ"           
##  [5] "MICORRIZA"      "SUELO"          "HERBIVORIA"     "RAIZ"          
##  [9] "TALLO"          "HOJAS"          "FLORES"         "CAPSULAS"      
## [13] "SEMILLAS"       "INMADUROS"      "PESO_TOTAL"     "NUM_FLORES"    
## [17] "DIAS_A_LA_FLOR" "FRUT_INMADUROS" "FRUT_MADUROS"   "TOT_FRUTOS"    
## [21] "ABORTOS"        "ALT_TOT"        "HOJAS_TOT"      "DUREZA"        
## [25] "AREA"           "PESO_HOJAS"     "AFE"            "LONG_HIFAS"    
## [29] "HIFAS"          "ESPORAS"        "VESICULAS"      "ARBUSCULOS"    
## [33] "TOTAL"

# Y con la función << dim() >> exploramos el número de filas y columnas
# que contiene la base de datos.

dim(DATOS)
## [1] 218  33

# Siempre que importamos una base de datos el tipo de objeto que se crea
# es un << data.frame >> que tiene la propiedad de poder almacenar
# información organizada en filas y columnas, como una matriz, pero con la
# peculiaridad de que las columnas en el << data.frame >> pueden contener
# información de muy distinta naturaleza. Para verificar esto usamos la
# función << class() >> que ya habíamos utilizado.

class(DATOS)
## [1] "data.frame"

# Principalmente se reconocen dos tipos de datos. Los de texto <<
# character >> y los numéricos << numeric >>. Dentro de los de texto R
# reconoce dos tipos de objetos, 1) los de texto tal cuál que puede ser
# información meramente descriptiva de cada observación en la base de
# datos, y los factores << factor >> que R reconoce como etiquetas
# mediante las cuales se formarán grupos. En automático R reconoce a
# cualquier variable de texto como un factor. Entre las variables
# numéricas R reconoce variable de números enteros << integer >> y
# variables numéricas << numeric >> que contiene fracciones decimales.

# Así las columnas de la base de datos que recién importamos R la
# reconocerá con alguno de los tipos de objetos que hemos mencionado.
# Hasta ahorita lo que hemos hecho es importar la base datos dentro del
# objeto << DATOS >> por lo que solamente existe este objeto. Si
# intentamos utilizar como objeto uno de los encabezados de las columnas R
# nos indicará que ese objeto no existe. Por ejemplo si queremos llamar el
# objeto << LUZ >> que es uno de los encabezados de la base datos R nos
# mandará un mensaje de error << Error: object 'LUZ' not found >>

LUZ
## Error: object 'LUZ' not found

# Antes de poder usar los encabezados de la base de datos como objetos
# debemos indicarle a R que deseamos hacer esto, y lo hacemos mediante la
# fucnión << attach() >>

attach(DATOS)

# Ahora si, los encabezados están disponibles como objetos pero realmente
# no existe como objetos independientes, ya que si observan la ventana del
# del área de trabajo << workspace >> después de haber usado la función <<
# attach() >> solo existe el objeto llamado << DATOS >>.

LUZ
##   [1] ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML PL PL PL
##  [24] PL PL PL PL PL PL PL ML ML ML ML ML ML PL PL ML ML PL PL PL PL PL PL
##  [47] PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL ML ML ML ML
##  [70] ML PL PL PL PL PL PL PL PL PL PL ML ML ML ML ML ML ML ML ML PL PL PL
##  [93] PL PL ML ML PL ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML
## [116] ML PL PL PL PL PL PL PL PL PL PL PL PL PL ML PL ML PL ML PL PL ML ML
## [139] PL PL PL ML PL ML ML ML PL ML ML ML PL ML PL PL PL ML ML PL PL PL ML
## [162] PL PL ML PL ML PL PL ML PL ML ML ML PL ML ML ML PL PL ML ML PL ML PL
## [185] ML PL PL PL ML PL PL PL PL ML ML PL ML ML ML ML PL PL ML PL ML ML ML
## [208] ML ML ML ML PL ML ML ML ML ML ML
## Levels: ML PL

# EXPLORANDO LA BASE DE DATOS ------------------------------ Ya podemos
# explorar que tipo de objetos ha recocido R dentro de la base de datos

class(NOTAS)
## [1] "factor"
NOTAS
##   [1] a  b  c  d  e  f  g  h  I  j  k  l  m  n  o  p  q  r  s  t  u  v  w 
##  [24] x  y  z  ab ac ad ae af ag ah aI aj ak al am an ao ap aq ar as at au
##  [47] av aw ax ay az ba bb bc bd be bf bg bh bI bj bk bl bm bn bo bp bq br
##  [70] bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch cI cj ck cl cm cn co
##  [93] cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh dI dj dk dl
## [116] dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh eI
## [139] ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff
## [162] fg fh fI fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc
## [185] gd ge gf gg gh gI gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz
## [208] ha hb hc hd he hf hg hh hI hj hk
## 218 Levels: a ab ac ad ae af ag ah aI aj ak al am an ao ap aq ar as ... z

class(INVERNADERO)
## [1] "integer"
INV
## Error: object 'INV' not found

class(LUZ)
## [1] "factor"
LUZ
##   [1] ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML PL PL PL
##  [24] PL PL PL PL PL PL PL ML ML ML ML ML ML PL PL ML ML PL PL PL PL PL PL
##  [47] PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL ML ML ML ML
##  [70] ML PL PL PL PL PL PL PL PL PL PL ML ML ML ML ML ML ML ML ML PL PL PL
##  [93] PL PL ML ML PL ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML
## [116] ML PL PL PL PL PL PL PL PL PL PL PL PL PL ML PL ML PL ML PL PL ML ML
## [139] PL PL PL ML PL ML ML ML PL ML ML ML PL ML PL PL PL ML ML PL PL PL ML
## [162] PL PL ML PL ML PL PL ML PL ML ML ML PL ML ML ML PL PL ML ML PL ML PL
## [185] ML PL PL PL ML PL PL PL PL ML ML PL ML ML ML ML PL PL ML PL ML ML ML
## [208] ML ML ML ML PL ML ML ML ML ML ML
## Levels: ML PL

class(DUREZA)
## [1] "numeric"
DUREZA
##   [1] 41.97 55.25 62.77 41.97 62.77 55.25 62.77 48.40 62.77 41.97 36.25
##  [12] 48.40 41.97 41.97 36.25 41.97 41.97 41.97 48.40 62.77 62.77 55.25
##  [23] 71.34 62.77 80.59 48.40 36.25 41.97 48.40 41.97 41.97 48.40 48.40
##  [34] 41.97 36.25 62.77 80.59 71.34 48.40 48.40 71.34 62.77 71.34 71.34
##  [45] 62.77 55.25 48.40 41.97 48.40 41.97 48.40 71.34 71.34 80.59 48.40
##  [56] 62.77 48.40 71.34 71.34 41.97 41.97 55.25 41.97 41.97 36.25 41.97
##  [67] 55.25 45.11 41.97 36.25 41.97 55.25 62.77 71.34 80.59 71.34 45.11
##  [78] 48.40 48.40 62.77 48.40 71.34 55.25 36.25 71.34 55.25 55.25 55.25
##  [89] 62.77 48.40 48.40 30.98 48.40 41.97 41.97 62.77 55.25 48.40 48.40
## [100] 48.40 41.97 45.11 48.40 62.77 41.97 71.34 55.25 71.34 48.40 62.77
## [111] 41.97 71.34 48.40 55.25 62.77 36.25 41.97 30.98 62.77 55.25 41.97
## [122] 71.34 48.40 36.25 36.25 48.40 41.97 55.25 80.59 36.25 62.77 48.40
## [133] 55.25 41.97 71.34 62.77 48.40 41.97 62.77 55.25 62.77 41.97 62.77
## [144] 41.97 21.48 48.40 55.25 48.40 36.25 48.40 48.40 71.34 71.34 62.77
## [155] 48.40 48.40 71.34 55.25 71.34 48.40 71.34 48.40 55.25 55.25 41.97
## [166] 62.77 48.40 55.25 62.77 62.77 55.25 62.77 48.40 48.40 62.77 48.40
## [177] 48.40 41.97 55.25 48.40 41.97 48.40 55.25 62.77 48.40 62.77 55.25
## [188] 48.40 62.77 90.91 48.40 62.77 62.77 71.34 36.25 62.77 48.40 62.77
## [199] 48.40 41.97 62.77 62.77 71.34 71.34 41.97 55.25 48.40 71.34 48.40
## [210] 41.97 71.34 62.77 62.77 48.40 62.77 62.77 62.77 71.34

# Ahora si podemos seguir explorando la base de datos para tener certeza
# de la información que contiene. Por ejemplo, vamos a contar cuantas
# veces aparece cada una de la condiciones de << LUZ >> de << SUELO >>,
# etc y de las diferentes combinaciones.

# Para hacer esto usamos la función << table() >> que rápidamente cuenta
# las repeticiones de cada nivel de un objeto de texto o de las
# combinaciones de dos o mas objetos de texto. Los argumentos de la
# función << table() >> son cada uno de los nombres de los objetos que
# queremos explorar.

table(NOTAS)
## NOTAS
##  a ab ac ad ae af ag ah aI aj ak al am an ao ap aq ar as at au av aw ax ay 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
## az  b ba bb bc bd be bf bg bh bI bj bk bl bm bn bo bp bq br bs bt bu bv bw 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
## bx by bz  c ca cb cc cd ce cf cg ch cI cj ck cl cm cn co cp cq cr cs ct cu 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
## cv cw cx cy cz  d da db dc dd de df dg dh dI dj dk dl dm dn do dp dq dr ds 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
## dt du dv dw dx dy dz  e ea eb ec ed ee ef eg eh eI ej ek el em en eo ep eq 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
## er es et eu ev ew ex ey ez  f fa fb fc fd fe ff fg fh fI fj fk fl fm fn fo 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
## fp fq fr fs ft fu fv fw fx fy fz  g ga gb gc gd ge gf gg gh gI gj gk gl gm 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
## gn go gp gq gr gs gt gu gv gw gx gy gz  h ha hb hc hd he hf hg hh hI hj hk 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
##  I  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z 
##  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
table(INVERNADERO)
## INVERNADERO
##   1   2 
## 109 109
table(LUZ)
## LUZ
##  ML  PL 
## 113 105
table(SUELO)
## SUELO
##   P   R 
## 109 109
table(HERBIVORIA)
## HERBIVORIA
##  CH  SH 
## 111 107
table(DUREZA)
## DUREZA
## 21.48 30.98 36.25 41.97 45.11  48.4 55.25 62.77 71.34 80.59 90.91 
##     1     2    13    39     3    53    28    44    29     5     1

# Como mencioné también se puede hacer conteo entre combinaciones de
# factores

table(INVERNADERO, LUZ)
##            LUZ
## INVERNADERO ML PL
##           1 55 54
##           2 58 51
table(INVERNADERO, SUELO)
##            SUELO
## INVERNADERO  P  R
##           1 56 53
##           2 53 56
table(INVERNADERO, HERBIVORIA)
##            HERBIVORIA
## INVERNADERO CH SH
##           1 56 53
##           2 55 54

# pueden ser combinaciones de dos o mas factores

table(INVERNADERO, LUZ, SUELO, HERBIVORIA)
## , , SUELO = P, HERBIVORIA = CH
## 
##            LUZ
## INVERNADERO ML PL
##           1 14 14
##           2 16 11
## 
## , , SUELO = R, HERBIVORIA = CH
## 
##            LUZ
## INVERNADERO ML PL
##           1 14 14
##           2 13 15
## 
## , , SUELO = P, HERBIVORIA = SH
## 
##            LUZ
## INVERNADERO ML PL
##           1 15 13
##           2 14 12
## 
## , , SUELO = R, HERBIVORIA = SH
## 
##            LUZ
## INVERNADERO ML PL
##           1 12 13
##           2 15 13

# Podemos asignar el resultado de la función << table() >> a un objeto

TABLA1 <- table(INVERNADERO, LUZ, SUELO, HERBIVORIA)

# el cual R reconoce como un objeto de tipo tabla << table >>

class(TABLA1)
## [1] "table"

# y al igual que el << data.frame >> este objeto tiene dimensiones, y R
# nos puede indicar cuantas dimensiones tiene y cuantos niveles dentro de
# cada dimensión. Para esto usamos la misma función << dim() >> que
# habíamos utilizado para explorar el numero de filas y columnas del <<
# data.frame >>

dim(TABLA1)
## [1] 2 2 2 2
# podemos preguntar los nombres de las dimensiones

dimnames(TABLA1)
## $INVERNADERO
## [1] "1" "2"
## 
## $LUZ
## [1] "ML" "PL"
## 
## $SUELO
## [1] "P" "R"
## 
## $HERBIVORIA
## [1] "CH" "SH"

# y podemos usar la notación de los corchetes << [ ] >> para extraer una
# sub-tabla de la tabla mas compleja. Por ejemplo, ya que nuestra tabla
# compleja está compuesta de cuatro sub-tablas podemos extraer una de
# ellas, la que corresponde a la condición de suelo << P >> y herbivoría
# << CH >>

TABLA1[1:2, 1:2, 1, 1]
##            LUZ
## INVERNADERO ML PL
##           1 14 14
##           2 16 11
TABLA1[1:2, 1:2, 2, 1]
##            LUZ
## INVERNADERO ML PL
##           1 14 14
##           2 13 15
TABLA1[1:2, 1:2, 1, 2]
##            LUZ
## INVERNADERO ML PL
##           1 15 13
##           2 14 12
TABLA1[1:2, 1:2, 2, 2]
##            LUZ
## INVERNADERO ML PL
##           1 12 13
##           2 15 13

# Y lo podemos simplificar omitiendo los valores de filas y columnas lo
# cual R interpreta como que deseamos ver todas las filas y todas las
# columnas que existan.

TABLA1[, , 1, 1]
##            LUZ
## INVERNADERO ML PL
##           1 14 14
##           2 16 11


# VARIABLE NUMERICAS ------------------------------

# Ahora pasemos a explorar las variables numéricas. Como ya vimos
# anteriormente lo podríamos hacer ordenado los valores de menor a mayor
# para asegurarnos de que no haya algún valor atípico

sort(DUREZA)
##   [1] 21.48 30.98 30.98 36.25 36.25 36.25 36.25 36.25 36.25 36.25 36.25
##  [12] 36.25 36.25 36.25 36.25 36.25 41.97 41.97 41.97 41.97 41.97 41.97
##  [23] 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97
##  [34] 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97
##  [45] 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97 41.97
##  [56] 45.11 45.11 45.11 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40
##  [67] 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40
##  [78] 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40
##  [89] 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40
## [100] 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40 48.40
## [111] 48.40 55.25 55.25 55.25 55.25 55.25 55.25 55.25 55.25 55.25 55.25
## [122] 55.25 55.25 55.25 55.25 55.25 55.25 55.25 55.25 55.25 55.25 55.25
## [133] 55.25 55.25 55.25 55.25 55.25 55.25 55.25 62.77 62.77 62.77 62.77
## [144] 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77
## [155] 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77
## [166] 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77 62.77
## [177] 62.77 62.77 62.77 62.77 62.77 62.77 62.77 71.34 71.34 71.34 71.34
## [188] 71.34 71.34 71.34 71.34 71.34 71.34 71.34 71.34 71.34 71.34 71.34
## [199] 71.34 71.34 71.34 71.34 71.34 71.34 71.34 71.34 71.34 71.34 71.34
## [210] 71.34 71.34 71.34 80.59 80.59 80.59 80.59 80.59 90.91

# También podemos graficar los datos numéricos para explorar los datos

plot(DUREZA)

plot of chunk unnamed-chunk-1


# Podemos graficar dos variables numéricas para explorar su relación

plot(DUREZA, AFE)

plot of chunk unnamed-chunk-1


# En R existe predefinida una función para graficar una serie de variables
# numéricas entre si. Para esto usaremos un subconjunto de los datos que
# tenemos en el objeto << DATOS >>. Solo usaremos las columnas 9 a 13 de
# la base de datos para lo cual usamos la notación de los corchetes en
# donde en la primera posición al dejarlo en blanco estamos indicando que
# se utilicen todas las filas, y en el segundo término definimos que
# usaremos las columnas 9 a 13.

DATOS[, 9:13]
##     TALLO HOJAS FLORES CAPSULAS SEMILLAS
## 1   23.28  9.76   0.66     7.53    16.50
## 2    1.18  0.62   0.07     0.53     0.38
## 3    1.03  0.80   0.11     0.10     0.18
## 4   19.57  9.83   0.63     6.95    15.22
## 5   22.39  9.93   0.04     8.01    15.47
## 6    0.80  0.44   0.16     0.00     0.00
## 7    0.71  0.54   0.10     0.28     0.31
## 8   20.24  7.37   0.55     5.74    11.74
## 9    1.87  1.53   0.14     0.65     0.83
## 10   1.40  0.95   0.15     0.19     0.23
## 11  25.48  8.59   0.57     3.63     7.03
## 12  17.66  9.25   0.47     7.38    16.70
## 13  13.69  7.49   0.36     5.86    13.83
## 14  23.80  8.19   0.78     3.48     6.11
## 15  27.82 10.88   0.50     6.12    10.17
## 16  18.11 10.45   1.32     6.66    15.08
## 17   1.59  2.19   0.06     0.47     0.50
## 18  15.51  9.07   0.56     5.38    14.06
## 19  15.12  8.17   0.37     0.34     0.61
## 20  23.34  8.82   0.40     6.29    13.22
## 21  13.30  7.00   0.30     4.60     9.20
## 22  13.50  7.60   0.30     4.80     9.00
## 23  11.40  7.30   0.40     4.20     9.70
## 24  10.50  6.90   0.30     7.30    16.10
## 25  12.90  7.00   0.20     3.50     8.20
## 26  10.51  8.25   0.25     1.98     3.85
## 27  16.35  7.27   0.26     0.98     2.05
## 28  20.51  8.66   0.48     4.41     8.64
## 29   0.24  0.20   0.01     0.00     0.00
## 30  22.68  8.50   0.32     3.32     4.35
## 31   0.61  0.38   0.02     0.00     0.00
## 32  21.59 10.51   0.48     8.00    16.53
## 33  19.38 10.22   0.45     7.80    15.52
## 34  19.11  9.92   0.50     7.73    15.57
## 35  21.77 10.18   0.59     7.44    15.57
## 36  24.98 10.51   0.81     8.28    17.82
## 37  15.87 10.69   0.60     4.98    11.42
## 38  11.70  6.10   0.10     2.80     6.20
## 39  20.79 10.36   0.54     7.57    17.47
## 40  17.74  9.18   0.49     7.08    15.15
## 41  13.42  7.76   0.31     3.78     9.99
## 42  13.90  8.75   0.43     5.88    15.49
## 43   0.84  0.38     NA     0.00     0.00
## 44  22.48 10.96   0.81     6.12    12.80
## 45  15.10  8.86   0.31     5.24    11.94
## 46  17.64 11.61   0.46     6.54    14.17
## 47  12.00  7.00   0.40     3.69     7.74
## 48  11.31  7.38   0.29     4.74    11.92
## 49  12.47  7.38   0.53     1.98     4.19
## 50  25.45 11.34   0.99     4.86    10.06
## 51  12.88  4.80   0.34     3.65     8.69
## 52  17.50  8.58   0.54     2.94     5.68
## 53  19.68 11.08   0.55     6.63    14.34
## 54  14.75  8.38   0.45     4.97    13.80
## 55  16.03  7.94   0.55     4.04    10.23
## 56  16.39  9.57   0.45     6.02    14.99
## 57  16.87  7.67   0.65     3.51     7.23
## 58  16.65 10.04   0.35     5.21    12.63
## 59  14.07 10.61   0.37     4.14    10.57
## 60  19.84  8.89   0.67     5.47    11.34
## 61   9.92  7.47   0.31     2.72     7.82
## 62  16.87 10.37   0.46     6.35    13.79
## 63  21.10 10.56   0.91     3.67     6.20
## 64  19.73 10.10   0.84     6.82    13.92
## 65  21.94  8.65   0.92     3.37     6.42
## 66  23.91 11.04   1.05     6.54    13.70
## 67  24.12 12.99   0.71     6.92    15.33
## 68  20.03 10.69   0.63     7.75    14.76
## 69  26.35 12.81   0.65     9.07    12.66
## 70  24.93 10.91   0.86     6.18    12.17
## 71  16.63 12.80   0.84     5.94    14.13
## 72   0.54  0.37   0.10     0.00     0.00
## 73   0.64  0.42   0.08     0.00     0.00
## 74   0.29  0.09   0.04     0.00     0.00
## 75   0.58  0.45   0.08     0.06     0.09
## 76   0.75  0.27   0.01     0.00     0.00
## 77  17.80  9.44   0.76     3.48     4.67
## 78  13.20  7.09   0.34     5.49    10.98
## 79   0.52  0.40   0.07     0.22     0.21
## 80   1.02  0.60   0.03     0.00     0.00
## 81  19.89  7.91   0.62     3.06     6.57
## 82  15.73  7.97   0.71     3.13     6.64
## 83  19.85  9.91   0.69     5.27    10.33
## 84  20.02  8.51   0.92     4.82     9.40
## 85  19.77  4.83   0.86     5.22    10.03
## 86  21.31  9.83   0.29     4.10     5.67
## 87  19.06  8.34   0.58     6.92    11.36
## 88   8.30  6.48   0.19     0.34     0.61
## 89  16.99  8.54   0.53     3.12     6.19
## 90  15.20  8.96   0.42     4.69    12.58
## 91  10.16  8.13   0.24     2.41     4.57
## 92   5.39  5.55   0.12     0.29     0.52
## 93  11.62  7.55   0.30     3.99    10.24
## 94  11.85  8.11   0.14     1.61     3.34
## 95  18.98  8.02   0.68     4.04     9.27
## 96  19.88  9.24   0.47     5.09    12.54
## 97  13.75  8.16   0.33     4.69    13.31
## 98  14.68  7.74   0.30     3.14     7.84
## 99   0.42  0.42   0.03     0.13     0.16
## 100 17.54  7.91   0.44     5.85    12.25
## 101 15.84  7.37   0.48     6.66    12.78
## 102  0.43  0.33   0.02     0.00     0.00
## 103  0.60  0.40   0.11     0.00     0.00
## 104 18.37 10.41   0.48     6.58    14.33
## 105 13.50  7.07   0.42     3.03     6.94
## 106 15.18  8.92   0.45     5.98    13.08
## 107 12.27  7.54   0.29     4.90    13.76
## 108 14.14  7.66   0.51     5.81    13.25
## 109 15.14  9.66   0.50     5.34    12.74
## 110 24.08 12.07   0.94     3.40     7.53
## 111  1.12  0.66   0.04     0.51     0.77
## 112 20.96 11.24   0.52     4.28     8.92
## 113  0.71  0.42   0.03     0.00     0.00
## 114  1.12  0.85   0.03     0.29     0.56
## 115 16.14  8.49   0.47     5.36    11.83
## 116  0.67  0.58   0.01     0.00     0.00
## 117 16.29  9.52   0.35     5.13    12.39
## 118  0.07  0.13   0.07     0.00     0.00
## 119  0.64  0.49     NA     0.00     0.00
## 120  0.95  0.66   0.05     0.26     0.47
## 121  0.07  0.04   0.03     0.00     0.00
## 122  0.71  0.30   0.05     0.00     0.00
## 123 23.15  9.71   0.98     5.62     9.57
## 124 18.24  6.87   0.73     1.98     4.85
## 125 18.03  6.54   0.75     3.56     8.51
## 126  0.22  0.21   0.01     0.11     0.20
## 127  0.81  0.70   0.04     0.51     0.65
## 128  9.74  8.04   0.24     4.07    10.06
## 129 17.67  4.78   0.44     6.99    12.78
## 130 21.16 11.53   1.05     8.00    15.56
## 131 14.67  8.99   0.45     3.75     9.49
## 132 21.06  9.00   0.62     6.39    14.87
## 133 16.29  9.01   0.34     4.57     7.42
## 134 16.06  9.03   0.46     5.69    14.76
## 135 14.46  8.85   0.41     5.59    12.73
## 136  0.51  0.31   0.04     0.00     0.00
## 137  1.18  0.91   0.07     0.00     0.00
## 138 20.92 12.01   0.73     9.06    20.44
## 139  0.62  0.29   0.06     0.00     0.00
## 140  0.79  0.61   0.09     0.00     0.00
## 141 10.10  7.00   0.30     4.20    10.20
## 142  1.02  0.70   0.02     0.13     0.21
## 143  0.59  0.46   0.07     0.17     0.25
## 144 18.46  7.20   0.66     5.43    12.09
## 145  1.99  1.44   0.15     0.55     0.60
## 146  1.17  0.86   0.08     0.50     0.60
## 147  9.77  8.08   0.35     5.05    12.29
## 148 16.83  9.40   0.88     7.00    15.84
## 149  1.06  0.81   0.09     0.00     0.00
## 150  1.65  1.26   0.10     0.60     0.60
## 151  0.52  0.51   0.09     0.11     0.17
## 152  1.80  1.07   0.06     0.00     0.00
## 153  0.77  0.34   0.07     0.00     0.00
## 154  0.55  0.42   0.01     0.22     0.29
## 155  0.40  0.22   0.01     0.13     0.23
## 156  0.83  0.55   0.10     0.00     0.00
## 157  2.05  1.48   0.08     0.54     0.49
## 158  0.29  0.25   0.01     0.00     0.00
## 159  0.55  0.44   0.01     0.00     0.00
## 160  0.33  0.23   0.03     0.07     0.11
## 161  1.67  0.88   0.16     0.00     0.00
## 162  0.31  0.24   0.03     0.14     0.26
## 163  0.12  0.11   0.05     0.08     0.11
## 164  0.37  0.33   0.01     0.00     0.00
## 165  0.55  0.45   0.03     0.19     0.34
## 166  0.69  0.55   0.04     0.15     0.28
## 167  0.57  0.65   0.06     0.00     0.00
## 168  0.50  0.88   0.04     0.26     0.51
## 169  1.03  0.32   0.06     0.00     0.00
## 170  0.60  0.43   0.05     0.10     0.15
## 171  1.29  0.73   0.11     0.00     0.00
## 172  0.94  0.79   0.02     0.20     0.41
## 173  0.65  0.56   0.02     0.00     0.00
## 174  0.14  0.11   0.02     0.00     0.00
## 175  0.17  0.40   0.01     0.13     0.17
## 176  1.28  0.71   0.11     0.00     0.00
## 177  1.98  0.63   0.15     0.00     0.00
## 178  0.28  0.25   0.02     0.00     0.00
## 179  0.58  0.43   0.02     0.16     0.21
## 180  1.98  1.04   0.06     0.00     0.00
## 181  1.24  0.66   0.10     0.00     0.00
## 182  0.04  0.04   0.01     0.00     0.00
## 183  0.81  0.43   0.06     0.00     0.00
## 184  1.27  0.46   0.12     0.00     0.00
## 185  1.03  0.59   0.05     0.58     0.58
## 186  0.31  0.33   0.03     0.10     0.17
## 187  0.57  0.43   0.02     0.18     0.35
## 188  0.05  0.02   0.09     0.16     0.33
## 189  2.50  0.95   0.06     0.00     0.00
## 190  0.99  0.65   0.08     0.71     1.51
## 191  0.28  0.26   0.03     0.12     0.16
## 192  0.17  0.17   0.04     0.00     0.00
## 193  0.50  0.49   0.05     0.23     0.47
## 194  2.26  1.26   0.11     0.00     0.00
## 195  1.45  0.98   0.13     0.65     0.91
## 196  0.47  0.47   0.08     0.00     0.00
## 197  2.16  0.15   0.18     0.91     1.22
## 198  1.27  0.96   0.08     0.22     0.26
## 199  1.03  0.50   0.05     0.00     0.00
## 200  1.17  0.87   0.08     0.15     0.19
## 201  1.21  0.48   0.15     0.00     0.00
## 202  1.11  0.61   0.11     0.00     0.00
## 203  0.90  0.61   0.07     0.14     0.21
## 204  0.44  0.46   0.04     0.27     0.33
## 205  2.21  1.35   0.11     0.71     0.91
## 206  1.92  1.08   0.14     0.58     0.75
## 207  0.91  0.60   0.09     0.14     0.14
## 208  1.80  0.87   0.15     0.00     0.00
## 209  1.49  1.17   0.16     0.59     0.69
## 210  2.29  1.00   0.33     0.00     0.00
## 211  1.95  1.31   0.10     0.91     0.78
## 212  0.77  0.37     NA     0.00     0.00
## 213  1.62  1.01   0.22     0.34     0.44
## 214  0.86  0.59   0.08     1.26     0.73
## 215  2.46  0.82   0.11     0.00     0.00
## 216  1.73  1.14   0.29     0.00     0.00
## 217  1.07  0.42   0.05     0.00     0.00
## 218  1.66  0.87   0.21     0.00     0.00

# Esta notación lo colocamos dentro de la función << pairs() >> y
# automáticamente R generará una matriz de gráficos en donde podemos
# explorar las relaciones entre todas las combinaciones de las variables
# numéricas que seleccionamos.

pairs(DATOS[, 9:13])

plot of chunk unnamed-chunk-1


# la matriz de gráficos que se genera está en espejo, es decir por arriba
# de la diagonal y por debajo de ella están las mismas combinaciones.

# Como mencionamos con la función << tapply() >> podemos explorar algunos
# parámetros estimados de una variable numérica. La variable usa tres
# argumentos. 1) La variable numérica a analizar, 2) el criterio, y 3) la
# función que se aplicará

tapply(DUREZA, LUZ, mean)
##    ML    PL 
## 51.87 56.22
tapply(DUREZA, SUELO, mean)
##     P     R 
## 55.47 52.45
tapply(DUREZA, SUELO, var)
##     P     R 
## 129.6 151.0
tapply(DUREZA, SUELO, sd)
##     P     R 
## 11.39 12.29

# También podemos explorar estas relaciones entre diferentes combinaciones
# de dos variables categóricas. Esto quiere decir que el segundo argumento
# debe ser modificado para incluir las combinaciones. Intuitivamente
# podríamos querer utilizar la función concatenar las dos variables
# categóricas que deseamos combinar. Sin embargo, al concatenar dos o mas
# objetos lo que estamos haciendo es crear un objeto de mayor longitud a
# los originales, es la suma de la las longitudes de cada una de los dos
# objetos.

c(SUELO, LUZ)
##   [1] 2 1 1 2 2 1 1 2 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2
##  [36] 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [71] 2 1 1 1 1 1 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2
## [106] 2 2 2 2 2 1 2 1 1 2 1 2 1 1 1 1 1 2 2 2 1 1 2 2 2 2 2 2 2 2 1 1 2 1 1
## [141] 2 1 1 2 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [176] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [211] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2
## [246] 2 2 2 1 1 1 1 1 1 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [281] 2 2 2 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 2
## [316] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1
## [351] 2 1 2 2 1 1 2 2 2 1 2 1 1 1 2 1 1 1 2 1 2 2 2 1 1 2 2 2 1 2 2 1 2 1 2
## [386] 2 1 2 1 1 1 2 1 1 1 2 2 1 1 2 1 2 1 2 2 2 1 2 2 2 2 1 1 2 1 1 1 1 2 2
## [421] 1 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1

# De hecho al concatenar dos factores en R, el resultado es que la
# información de texto que existía se pierde por que R entiende que
# combinar dos factores es mezclar peras con manzanas, por lo tanto
# sobreescribe la información de estos objetos y los presenta con
# categorías idénticas. En este caso '1' y '2'

# Si usamos esta sintaxis para modificar el segundo elemento dentro de la
# función << tapply() >> obtendremos un mensaje de error << Error in
# tapply(DUREZA, c(SUELO, LUZ), var) : arguments must have same length >>
# ya que << DURZA >> contiene 218 datos mientras que la concatenación
# contiene el doble de valores, 436 datos, y por lo tanto no existe
# correspondencia entre los valores en estos dos argumentos.

length(DUREZA)
## [1] 218
length(c(SUELO, LUZ))
## [1] 436

tapply(DUREZA, c(SUELO, LUZ), var)
## Error: arguments must have same length

# Entonces la forma en que debemos modificar el segundo argumento de la
# función << tapplay() >> es creando una lista << list() >>, en lugar de
# una concatenación. En una lista de dos o mas objetos se organizan los
# valores de cada uno de manera semejante a como si los valores de cada
# uno de estos objetos estuviese escritos en una página diferente un
# cuaderno, las cuales se identifican en R por los dobles corchetes que
# existen en el resultado.

list(SUELO, LUZ)
## [[1]]
##   [1] R P P R R P P R P P R R R R R R P R R R R R R R R R R R P R P R R R R
##  [36] R R R R R R R P R R R R R R R R R R R R R R R R R R R R R R R R R R R
##  [71] R P P P P P R R P P R R R R R R R R R R R R R R R R R R P R R P P R R
## [106] R R R R R P R P P R P R P P P P P R R R P P R R R R R R R R P P R P P
## [141] R P P R P P R R P P P P P P P P P P P P P P P P P P P P P P P P P P P
## [176] P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P
## [211] P P P P P P P P
## Levels: P R
## 
## [[2]]
##   [1] ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML PL PL PL
##  [24] PL PL PL PL PL PL PL ML ML ML ML ML ML PL PL ML ML PL PL PL PL PL PL
##  [47] PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL ML ML ML ML
##  [70] ML PL PL PL PL PL PL PL PL PL PL ML ML ML ML ML ML ML ML ML PL PL PL
##  [93] PL PL ML ML PL ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML ML
## [116] ML PL PL PL PL PL PL PL PL PL PL PL PL PL ML PL ML PL ML PL PL ML ML
## [139] PL PL PL ML PL ML ML ML PL ML ML ML PL ML PL PL PL ML ML PL PL PL ML
## [162] PL PL ML PL ML PL PL ML PL ML ML ML PL ML ML ML PL PL ML ML PL ML PL
## [185] ML PL PL PL ML PL PL PL PL ML ML PL ML ML ML ML PL PL ML PL ML ML ML
## [208] ML ML ML ML PL ML ML ML ML ML ML
## Levels: ML PL

# De esta forma al usar << list() >> dentro de la función << tapply() >>
# obtendremos el cálculo para cada una de las combinaciones.

tapply(DUREZA, list(SUELO, LUZ), var)
##      ML    PL
## P 126.0 125.0
## R 111.4 182.7
tapply(DUREZA, list(SUELO, LUZ), mean)
##      ML    PL
## P 53.38 57.94
## R 50.22 54.65
tapply(DUREZA, list(SUELO, LUZ), sd)
##      ML    PL
## P 11.23 11.18
## R 10.55 13.52


# CALCULO Y DEFINICIÓN DE LA MEDIA -----------------------------------
# Ahora pasaremos a definir lo que es la media y lo ejemplificaremos con
# los siguientes siete valores en el objeto << CAL >>. La media se define
# como el valor que maximiza la posibilidad, técnicamente a verosimilitud,
# de observar los datos

CAL <- c(10, 8, 7, 8, 10, 8, 7)

# Podemos calcular el promedio de estos siete valores en el objeto << PROM
# >> y su desviación estándar en el objeto << DE >>

PROM <- mean(CAL)
DE <- sd(CAL)

# Ahora usaremos la función probabilística de la distribución normal para
# calcular la probabilidad de observar cada uno de los valores siete
# valores. Usando el valor de la media y desviación estándar que
# calculamos. Esto lo podemos hacer valor por valor

dnorm(7, PROM, DE)
## [1] 0.1881

# Pero también lo podemos calcular para los siete valores en un solo paso
# usando el objeto << CAL >> que contiene las siete calificaciones

dnorm(CAL, PROM, DE)
## [1] 0.1249 0.3101 0.1881 0.3101 0.1249 0.3101 0.1881

# Ahora para obtener la verosimilitud calculamos las probabilidades en
# logaritmo y las sumamos. Esto o logramos primero añadiendo un cuarto
# argumento a la función << dnomr() >>

sum(dnorm(CAL, PROM, DE, log = T))
## [1] -11.01

# Esto siempre resultará en un valor negativa ya que los logaritmos de las
# probabilidades, al ser estas fracciones decimales será negativas.


# Ahora probaremos que el valor de la media es el que hace máxima la
# verosimilitud de observar los datos. Para esto generamos una secuencia
# de datos, entre 6 y 10 que contenga mil valores, y usaremos cada uno de
# estos mil valores para calcular una verosimilitud.

SEC <- seq(6, 10, length = 1000)

# Este proceso lo automatizaremos con el siguiente procedimiento en donde
# << i >> lo definimos como un objeto que contiene el valor de cero.
i <- 0

# Creamos un objeto << VERO >> que servirá para almacenar cada uno de los
# mil cálculos de las verosimlitudes. Inicialmente el objeto << VERO >> lo
# definimos vacío usando la función << numeric() >>.

VERO <- numeric()

# Si vemos el objeto << VERO >> veremos que está vacío, existe pero no
# contiene ningún valor

VERO
## numeric(0)

# Ahora usamos la función << for() >> para generar un bucle (loop) para
# automatizar el proceso. En esta función el primer argumento es un objeto
# que irá tomando en secuencia los valores que se encuentra en el segundo
# objeto, el que está después de << in >> que forma parte integral de la
# función << for() >>. Las llaves indican todo lo que se va a repetir para
# cada valor que vaya tomando el primer objeto de la función << for() >>,
# en este caso el objeto lo llamamos << PROM2 >>. En la siguiente linea el
# objeto << i >> que habíamos definido como cero va a ir incrementando de
# valor de uno en uno cada vez que << PROM2 >> tome un valor diferente.
# Finalmente el en objeto << VERO >> usando los corchetes y el objeto i
# dentro de ellos le estamos indicando a R que cada uno de los mil
# cálculos de verosimilitud se almacenen en una posición diferente del
# objeto << VERO >>

for (PROM2 in SEC) {
    i <- i + 1
    VERO[i] <- sum(dnorm(CAL, PROM2, DE, log = T))
}

# Ahora si graficamos estas verosimilitudes tenemos que se forma una
# parábola
plot(VERO, type = "l")

plot of chunk unnamed-chunk-1


# Con la función << max() >> podemos saber cual ese valor máximo de
# verosimilitud
max(VERO)
## [1] -11.01

# y colocando una argumento lógico dentro la fucnión << whcih() >> podemos
# extraer la posición en la que se encuentra el valor con la máxima
# verosimilitud.

which(VERO == max(VERO))
## [1] 572

# esta posición es el 572, y si obtenemos el valor en esta posición dentro
# del obejto << SEC >> veremos que es un valor muy similar al obtenido del
# cálculo de la media. No es idéntico ya que solo generamos mil valores en
# el objeto << SEC >>

SEC[572]
## [1] 8.286
mean(CAL)
## [1] 8.286

# En conclusión esto demuestra que el valor del promedio es aquel que
# maximiza la verosimilitud de los datos.