# 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)
# Podemos graficar dos variables numéricas para explorar su relación
plot(DUREZA, AFE)
# 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])
# 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")
# 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.