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

# INSTITUTO DE ECOLOGIA A.C RED DE BIOLOGÍA EVOLUTIVA

# ESTADISTICA COMPUTACIONAL EN R


source("~/desktop/curso R 2012/funciones.r")
# PRUEBAS DE HIPÓTESIS

# Datos de la velocidad de la velocidad luz estimados restando 299000 a
# cada valor. La idea es comparar si en promedio estos valores difieren
# estadísticamente de 1000.

VEL_LUZ <- c(850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 
    650, 760, 810, 1000, 1000, 960, 960)

# Para esto usaremos una prueba de t de una sola muestra en donde el
# parámetro de referencia es 1000. Esto se reduce a la diferencia del
# promedio de los datos y el parámetro de referencia dividido entre el
# error estándar de la diferencia de la media y el parámetro de
# referencia. Dado que el parámetro de referencia es fijo, no hay
# varianza, y por lo tanto el error estándar de la diferencia de la media
# de los datos y el parámetro de referencia es el mismo error estándar de
# los datos. El cociente de la diferencia entre su error estándar, se
# distribuye como t

MEDIAS <- mean(VEL_LUZ)
ERROR <- ee(VEL_LUZ)

T <- (MEDIAS - 1000)/ERROR
T
## [1] -3.879

# y con la con la función probabilística de t << pt() >> calculamos la
# probabilidad de observar este valor o uno mayor, y esto lo haremos a dos
# colas de la distribución. Este ejercicio tiene n-1 grados de libertad ya
# que solo estimamos un parámetro, la media de los datos.

pt(T, 19) * 2
## [1] 0.001011

# Con la función << t.test() >> que toma dos argumentos en el caso de la t
# de una muestra obtenemos el mismo resultado. Los argumentos son 1) el
# vector de datos, en este caos << VEL_LUZ >> y << mu= >> que es el
# parámetro de referencia.

t.test(VEL_LUZ, mu = 1000)
## 
##  One Sample t-test
## 
## data:  VEL_LUZ 
## t = -3.879, df = 19, p-value = 0.001011
## alternative hypothesis: true mean is not equal to 1000 
## 95 percent confidence interval:
##  859.9 958.1 
## sample estimates:
## mean of x 
##       909


# Prueba de t para dos muestras
DATOS <- read.table("~/desktop/curso R 2012/toloache.csv", header = TRUE, sep = ",")
attach(DATOS)
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"

# Haremos dos subconjuntos de los valores de << DUREZA >> como una función
# de la calidad de luz << LUZ >>

DUREZA_ML <- DUREZA[DATOS$LUZ == "ML"]
DUREZA_PL <- DUREZA[DATOS$LUZ == "PL"]

# Calculamos las medias, las varianzas y el tamaño de las muestras

M1 <- mean(DUREZA_ML)
M2 <- mean(DUREZA_PL)

VAR1 <- var(DUREZA_ML)
VAR2 <- var(DUREZA_PL)

N1 <- length(DUREZA_ML)
N2 <- length(DUREZA_PL)

# Con las varianzas y los tamaños de muestra calculamos el error estándar
# de la diferencia de las medias.

EEDIF <- sqrt(VAR1/N1 + VAR2/N2)

# Y la diferencia entre las medias dividido pro el error estándar de la
# diferencia de las medias nos da el valor de t, que tendrá n - 2 grados
# de libertad ya que se estimaron dos parámetros apartir de los datos.

T <- (M1 - M2)/EEDIF
pt(T, N1 + N2 - 2) * 2
## [1] 0.007088

# La función de prueba de de t << t.test() >> para comparar dos muestras
# toma tres argumentos, que son cada uno de las dos muestras y <<
# var.equal= >> definido como verdadero << TRUE >> fuerza a la función de
# t a asumir que hay homocedasticidad de varianzas, lo mismo que asumimos
# en el los cálculos que hicimos arriba

t.test(DUREZA_ML, DUREZA_PL, var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  DUREZA_ML and DUREZA_PL 
## t = -2.732, df = 216, p-value = 0.006822
## alternative hypothesis: true difference in means is not equal to 0 
## 95 percent confidence interval:
##  -7.484 -1.211 
## sample estimates:
## mean of x mean of y 
##     51.87     56.22

# De no especificar que las varianzas son iguales, la función << t.test()
# >> automáticamente lleva a cabo la llamada corrección de Welch que
# pondera (disminuye) los grados de libertad lo que causa que para
# alcanzar un resultado significativo con P = 0.05 el valor de t debe ser
# mayor que sin no usamos la corrección, en otras palabras, la diferencia
# entre las medias debe ser mayo para que rechacemos la hipótesis nula

t.test(DUREZA_ML, DUREZA_PL, var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  DUREZA_ML and DUREZA_PL 
## t = -2.719, df = 207.4, p-value = 0.00711
## alternative hypothesis: true difference in means is not equal to 0 
## 95 percent confidence interval:
##  -7.500 -1.195 
## sample estimates:
## mean of x mean of y 
##     51.87     56.22


# Prueba de t-pareada
DATOS <- read.table("~/desktop/curso R 2012/paired.txt", sep = "\t", header = TRUE)
attach(DATOS)

# La prueba de t pareada, es sencillamente una prueba de t de una muestra
# en donde esa muestra son las diferencias entre las parejas de datos. La
# función << t.test() >> en este caso usa un tercer argumento << paired =
# TRUE >>

t.test(Downstream, Upstream, paired = TRUE)
## 
##  Paired t-test
## 
## data:  Downstream and Upstream 
## t = 3.077, df = 8, p-value = 0.01519
## alternative hypothesis: true difference in means is not equal to 0 
## 95 percent confidence interval:
##  0.02589 0.18077 
## sample estimates:
## mean of the differences 
##                  0.1033

# y ahora probemos haciendo una prueba de una sola muestra con las
# diferencias entre las parejas de datos

DIFERENCIAS <- Downstream - Upstream
t.test(DIFERENCIAS, mu = 0)
## 
##  One Sample t-test
## 
## data:  DIFERENCIAS 
## t = 3.077, df = 8, p-value = 0.01519
## alternative hypothesis: true mean is not equal to 0 
## 95 percent confidence interval:
##  0.02589 0.18077 
## sample estimates:
## mean of x 
##    0.1033

# Noten como estos dos últimos resultados son idénticos


# Prueba de Wilcoxon-------------------- Para comparar dos medias se
# asignas rangos a los datos de las dos muestras de manera conjunta, y se
# suman los valores en rangos de cada muestra, y a la suma mas pequeña se
# les resta la suma de rangos esperada si las dos muestras son
# completamente distinta, en este caso si una muestra tuviese los primeros
# nueve valores jerárquicos. Este valor esperado de la suma de rangos para
# una muestra se obtiene con (n*(n+1))/2 siendo n el tamaño de muestra de
# con la suma mas pequeña.

# A continuación generamos una distribución probabilística para comparar
# dos muestras cada una con nueve datos como en el ejemplo que estamos
# viendo

SUMA <- numeric()
n <- 9
for (i in 1:10000) {
    AZAR <- rnorm(18, 10, 3)
    RANGOS <- rank(AZAR)
    M1 <- RANGOS[1:9]
    M2 <- RANGOS[10:18]
    S1 <- sum(M1) - (n * (n + 1))/2
    S2 <- sum(M2) - (n * (n + 1))/2
    if (S1 < S2) 
        SUMA[i] <- S1 else SUMA[i] <- S2
}

hist(SUMA)

plot of chunk unnamed-chunk-1


# Ahora obtenemos la suma de valores de rangos para cada una de las
# muestras

sum(rank(c(Downstream, Upstream))[1:9]) - (9 * 10)/2
## [1] 53.5
sum(rank(c(Downstream, Upstream))[10:18]) - (9 * 10)/2
## [1] 27.5

# y comparamos que probabilidad tendríamos de observar este valor o uno
# mas pequeño por azar contando todos los casos de la distribución
# empírica que obtuvimos aleatoriamente. El valor que comparamos es el mas
# pequeño de las dos muestras, 27.5

sum(SUMA <= 27.5)/i
## [1] 0.2501

# Ahora comparamos nuestro resultado con lo que obtenemos con la función
# << wilcox.test() >> en donde los argumentos son los objetos que definen
# cada una de las dos muestras.

wilcox.test(Downstream, Upstream)
## Warning: cannot compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Downstream and Upstream 
## W = 53.5, p-value = 0.2694
## alternative hypothesis: true location shift is not equal to 0

# Ahora probemos utilizar la prueba paramétrica de t, pero usando los
# valores en rangos de as muestras

R_DS <- rank(c(Downstream, Upstream))[1:9]
R_US <- rank(c(Downstream, Upstream))[10:18]

t.test(R_DS, R_US)
## 
##  Welch Two Sample t-test
## 
## data:  R_DS and R_US 
## t = 1.16, df = 15.99, p-value = 0.263
## alternative hypothesis: true difference in means is not equal to 0 
## 95 percent confidence interval:
##  -2.390  8.168 
## sample estimates:
## mean of x mean of y 
##    10.944     8.056

# Note la similitud de resultados entre estos procedimientos. Igualmente
# los procedimientos arrojan resultados muy similares si el análisis es
# pareado. Recuerden que esto significa que hay una sola muestra y la suma
# de valores en rangos con signo se espera que sea cero.

wilcox.test(Downstream, Upstream, paired = TRUE)
## 
##  Wilcoxon signed rank test
## 
## data:  Downstream and Upstream 
## V = 44, p-value = 0.007812
## alternative hypothesis: true location shift is not equal to 0
t.test(R_DS, R_US, paired = TRUE)
## 
##  Paired t-test
## 
## data:  R_DS and R_US 
## t = 3.956, df = 8, p-value = 0.004198
## alternative hypothesis: true difference in means is not equal to 0 
## 95 percent confidence interval:
##  1.205 4.573 
## sample estimates:
## mean of the differences 
##                   2.889



# Prueba de varianza---------------------- El cociente de dos varianza
# define la distribución F. Así, dadas dos muestras tomadas al azar de la
# misma población se esperaría que su cociente fuese 1, y mediante la
# distribución F podemos calcular la probabilidad de observar un valor
# igual o mayor al que resulte de dividir la varianza mayor por la
# varianza menor

V1 <- var(Downstream)
V2 <- var(Upstream)

CO <- V2/V1

# Con la distribución probabilística de F, usando la función << pf() >>
# colocamos tres argumentos. 1) el valor del cociente, 2) los grados de
# libertad del numerador, y 3) los grados de libertad del denominador. Y
# calculamos la probabilidad hacía la cola derecha de la distribución ya
# que en esta distribución la cola derecha se extiende hasta infinito
# mientras que la otra cola tiende a cero.

pf(CO, 8, 8, lower = FALSE)
## [1] 0.3265

# La probabilidad obtenida la debemos multiplicar por dos ya que en esta
# prueba no hay un criterio a priori para esperar que la varianza de una
# muestra sea mayor que la de la otra muestra.

# Y con la función << var.test() >> obtenemos este resultado directamente

var.test(Upstream, Downstream)
## 
##  F test to compare two variances
## 
## data:  Upstream and Downstream 
## F = 1.389, num df = 8, denom df = 8, p-value = 0.6529
## alternative hypothesis: true ratio of variances is not equal to 1 
## 95 percent confidence interval:
##  0.3134 6.1588 
## sample estimates:
## ratio of variances 
##              1.389



# Tablas de contingencia----------------------- Para poner a prueba si la
# frecuencia con que ocurren dos eventos son independientes se utilizan
# las tablas de contingencia. Estas tablas resumen los conteos realizados
# en donde cada conteo se puede asignar a la combinación de dos factores y
# cada factor tiene al menos dos niveles. En este ejemplo usaremos tres
# tipos de epífitas creciendo en tres tipos de forofitos.

# Primero generamos la matriz de observaciones

M <- matrix(c(50, 8, 10, 25, 20, 5, 2, 1, 12), 3, 3)

# Y para facilitar la identidad de las filas y columnas le agregamos
# nombres a las filas y columnas

rownames(M) <- c("Helechos", "Orqid.", "Bromelias")
colnames(M) <- c("Palmas", "Árboles", "Postes")

M
##           Palmas Árboles Postes
## Helechos      50      25      2
## Orqid.         8      20      1
## Bromelias     10       5     12

# El principio de las tablas de contingencia es multiplicar las
# probabilidades de observar cada uno de los eventos por separado ya que
# esta es la hipótesis nula, de que los eventos ocurren
# independientemente. Entonces primero debemos obtener estas
# probabilidades que son en esencia la suma de frecuencias de cada fila y
# columna dividido por el total de la suma de frecuencias. Para esto
# usamos las funciones << colSums() >> y << rowSums() >>

colSums(M)
##  Palmas Árboles  Postes 
##      68      50      15
colSums(M)
##  Palmas Árboles  Postes 
##      68      50      15

# y las probabilidades son

PROB_FOROFITOS <- colSums(M)/sum(M)
PROB_EPIFITAS <- rowSums(M)/sum(M)

# Así podemos observar que la probabilidad de que una epífita cualquiera
# este en una palma es de 0.5112782, y la probabilidad de que una epífita
# sea un helecho es de 0.5789474

# De los productos de estas probabilidades marginales obtenemos la
# probabilidad de que dos eventos ocurren independientemente. Por ejemplo
# multiplicamos la probabilidad de que una epífita este en una palma por
# la probabilidad de que una epífita sea un helecho, 0.5112782 x 0.5789474
# de lo que obtenemos 0.2960032 que es la probabilidad de con que
# esperamos observar, solo por azar, el que un helecho este en una palma.
# Así al obtener las probabilidades de las diferentes combinaciones solo
# nos restaría multiplicarlas por la frecuencia total para obtener la
# frecuencia esperada.

PRO_ESP <- rep(PROB_FOROFITOS, each = 3) * rep(PROB_EPIFITAS, 3)

# y Podemos colocar las probabilidades en una matriz

PRO_ESP <- matrix(PRO_ESP, 3, 3)
rownames(PRO_ESP) <- c("Helechos", "Orqid.", "Bromelias")
colnames(PRO_ESP) <- c("Palmas", "Árboles", "Postes")

# Y la frecuencia esperada es multiplicar esta tabla por la frecuencia
# total de epífitas

FREC_ESPE <- PRO_ESP * sum(M)

# Y con la prueba de bondad de ajuste podemos calcular un valor de ji
# cuadrada usando la fórmula (OBSERVADO - ESPERADO)^2/ESPERADO

(M - FREC_ESPE)^2/FREC_ESPE
##           Palmas Árboles Postes
## Helechos   2.871  0.5383  5.145
## Orqid.     3.143  7.5919  1.576
## Bromelias  1.049  2.6133 26.334

# Y el valor de ji-cuadrada es la suma de todas las celdas

sum((M - FREC_ESPE)^2/FREC_ESPE)
## [1] 50.86

# Finalmente con la distribución probabilistca de ji-cuadrada obtenemos la
# probabilidad esperada. Aqui debemos usar 1 menos la probabilidad
# calculada. Al igual que la dirtibución F, en la distribución de
# ji-cuadrada solo la cola derecha tiende a infinito por lo que se calcula
# la probabilidad sobre este lado de la distribución. Note que después de
# calcular cuatro frecuencias esperadas del interior de la tabla el resto
# ya no se estiman a partir de los datos ya que su valores quedan
# predefinidos para que las filas y columnas sumen lo mismo que en la
# tabla original.

pchisq(50.86188, 4, lower = FALSE)
## [1] 2.386e-10

# La función << chis.test() >> calcula esta prueba rápidamente y usa como
# argumento el objeto que contiene la matriz de frecuencias esperadas.

chisq.test(M)
## Warning: Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  M 
## X-squared = 50.86, df = 4, p-value = 2.386e-10

# Si asignamos este análisis a un objeto podemos explorar las frecuencias
# esperadas, y los residuales estandarizados. Estos últimos nos servirán
# para explorar cuales celdas de la tabla contribuyen significativamente
# de lo esperado por azar.

CONTINGENCIA <- chisq.test(M)
## Warning: Chi-squared approximation may be incorrect

CONTINGENCIA$expected
##           Palmas Árboles Postes
## Helechos   39.37   28.95  8.684
## Orqid.     14.83   10.90  3.271
## Bromelias  13.80   10.15  3.045

CONTINGENCIA$residuals
##           Palmas Árboles Postes
## Helechos   1.694 -0.7337 -2.268
## Orqid.    -1.773  2.7553 -1.256
## Bromelias -1.024 -1.6166  5.132

# De la tabla anterior las celdas con valores absolutos mayores a 1.96 son
# aquellas en las que el desvío de lo esperado es realmente significativo.
# Si son positivos los residuales indican que las frecuencias observadas
# son mayores de lo que se espera por azar. Por otra parte si los
# residuales son negativos indican que las frecuencias observadas son
# menores de lo que se espera por azar.

# La función << mosaicplot() >> que usa como argumento el objeto con las
# frecuencias esperadas nos da una representación gráfica de los
# residuales esperados, y usando el argumento << shade=TRUE >> el gráfico
# presenta colores rojos y azul en las celdas sub y sobre estimadas
# respectivamente. De cada color hay dos tonos. El mas claro de ellos
# indican que el desvío de las frecuencias es mayor 2 pero menor a 4
# desviaciones estándares,lo que significa que tienen una probabilidad
# entre 0.05 y 0.00006 y el tono mas oscuro indica aquellas celdas con
# probabilidad menor a 0.00006. Estas probabilidades se desprende de la
# distribución normal.

mosaicplot(t(M), shade = TRUE)

plot of chunk unnamed-chunk-1