1. INTRODUCCIÓN

En esta práctica se repasan algunos contrastes de hipótesis no paramétricos de una y dos poblaciones

  1. Bondad de ajuste: Ji-cuadrado de Pearson simple, KS y KSL
  2. Aleatoriedad: rachas
  3. Cuantiles: signos
  4. Homogeneidad: Ji-cuadradode Pearson y KS
  5. Comparación de medianas con datos emparejados: signos y Wilcoxon (rangos con signo)
  6. Comparación de medianas con datos independientes: Wilcoxon-Mann-Whitney

Recuerda que para tener un nivel de significación a lo sumo \(\alpha\), se debe definir el procedimiento: RECHAZAR \(H_0\) si \(p\)-valor \(< \alpha\).

2. CONTRASTES DE BONDAD DE AJUSTE

Son contrastes para decidir entre:

2.1. Contraste de bondad de ajuste ji-cuadrado de PEARSON

  • MUESTRA: datos categóricos o numéricos, siempre que se puedan resumir como tabla de frecuencias del tipo:

\[ \begin{array}{|c||c|c|c|} \hline x_i & x_1 & \cdots & x_k \\ \hline n_i & n_1 & \cdots & n_k \\ \hline \end{array} \]

  • OBSERVACIÓN: dicha tabla de frecuencias se puede obtener de variables numéricas, discreta o continua, convirtiendo intervalos de números en categorías de dicha tabla.
  • CONTRASTE: verificar si el proceso se ajusta o no a un modelo concreto, expresado en forma de tabla de probabilidades

\[ \left\{ \begin{array}{ll} H_0: & X \sim \begin{array}{|c||c|c|c|} \hline x_i & x_1 & \cdots & x_k \\ \hline p_i & p_1 & \cdots & p_k \\ \hline \end{array} \\ H_1: & \text{no } H_0 \end{array} \right. \]

  • FUNCIÓN: chisq.test(x, p)
  • ARGUMENTOS:
    • x: vector con frecuencias de las categorías (tabla de frecuencias).
    • p: vector con probabilidades de las categorías (por defecto uniforme).
  • DEVUELVE: una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.

2.2. Contraste de bondad de ajuste de KOLMOGOROV-SMIRNOV

  • MUESTRA: datos numéricos, de variable continua (no se permite coincidencias en la muestra).
  • CONTRASTE: verificar si el proceso se ajusta o no a un presunto modelo concreto, expresado con su función de distribución acumulada \(F_0(x)\),

\[ \left\{ \begin{array}{ll} H_0: & F_X = F_0 \\ H_1: & F_X \neq F_0 \end{array} \right. \]

  • FUNCIÓN: ks.test(x, y,...)
  • ARGUMENTOS:
    • x: vector con datos de la muestra.
    • y: nombre (entrecomillado) de la función \(F_0\) (según esté programada en R: "punif", "pnorm", "pexp",…).
    • ...: parámetros de la función \(F_0\) en R
  • DEVUELVE: una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.

2.3. Contraste de normalidad de LILLIEFORS

  • MUESTRA: datos numéricos, de variable continua.
  • CONTRASTE: verificar si el proceso se ajusta o no a un modelo normal (sin importar los parámetros).

\[ \left\{ \begin{array}{ll} H_0: & X \text{ normal} \\ H_1: & X \text{ no normal} \end{array} \right. \]

  • FUNCIÓN: lillie.test(x) del package nortest. Hay que (instalar y) cargar el paquete desde el menú.
  • ARGUMENTOS:
    • x: vector con datos de la muestra.
  • DEVUELVE: una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.

3. CONTRASTES DE ALEATORIEDAD

Asumimos que tenemos una variable aleatoria \(X\) de la que se ha extraído “secuencialmente” una muestra. Todos los datos se han obtenido de \(X\), pero no sabemos si esos datos son independientes entre sí.

Son contrastes para decidir entre:

3.1. Contraste de rachas

Una racha es algo que se puede definir de varias formas:

  • una serie de datos por encima (o por debajo) de la mediana,
  • una serie de datos en ascenso (o descenso), etc.

Cuando hay verdadera aleatoriedad, no es habitual que haya rachas muy largas, ni tampoco que haya muchas rachas muy cortas. El “número de rachas” es el estadístico “sensible” a que la muestra sea aleatoria.

Los datos numéricos se tranforman en signos (según el criterio elegido), y los signos permiten contar las rachas (cada cadena máxima de signos iguales es una racha).

  • MUESTRA: 1 variable, datos numéricos, que se transforman en signos
  • CONTRASTE: verificar si las rachas que se han formado son creíbles o no bajo la hipótesis de aleatoriedad (independencia)

\[ \left\{ \begin{array}{ll} H_0: & \text{datos independientes entre sí} \\ H_1: & \text{datos con cierta dependencia entre sí} \end{array} \right. \]

  • FUNCIÓN: runs.test(x) del package ‘tseries’.
  • ARGUMENTOS:
    • x: vector con los “signos”.
  • DEVUELVE: una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.
  • ¡ATENCIÓN!: usa aproximación normal incluso cuando no se debe (sólo conveniente para muestras con más de 20 signos de cada tipo)

4. CONTRASTE DE CUANTILES

Si \(X\) expresa una variable aleatoria, su cuantil de orden \(p_0\) se representa por \(X_{p_0}\).

\[ \left\{ \begin{array}{ll} H_0: & X_{p_0} = x_0 \\ H_1: & X_{p_0} (\neq, <, >) x_0 \end{array} \right. \]

5. CONTRASTES DE HOMOGENEIDAD

Son contrastes para decidir si 2 ó mas poblaciones mantienen la misma distribución (variable aleatoria) o no.

5.1. Contraste de homogeneidad Ji-cuadrado de PEARSON

Se aplica sobre las tablas de frecuencias de las muestras, por lo que deben ser cualitativas, o si no, agruparse los datos en intervalos, para poder hacer las tablas de frecuencias.

  • MUESTRA: varias variables cualitativas, cada una en un vector, o resumidas en tablas de frecuencias.
  • CONTRASTE:

\[ \left\{ \begin{array}{ll} H_0: & \text{misma distribución para todas} \\ H_1: & \text{no } H_0 \end{array} \right. \]

  • FUNCIÓN: chisq.test(x, y).
  • ARGUMENTOS:
    • x: puede ser una matriz con las tablas de frecuencias pegadas, o un vector con los datos de la primera variable.
    • y: nada (por defecto), si x lo tiene todo, o los datos de la segunda variable.
  • DEVUELVE: una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.

5.2. Contraste de homogeneidad de KOLMOGOROV-SMIRNOV

Se aplica sobre 2 poblaciones numéricas independientes.

  • MUESTRA: 2 variables, datos numéricos independientes.
  • CONTRASTE: decidir si ambas poblaciones siguen la misma ley de probabilidad

\[ \left\{ \begin{array}{ll} H_0: & F_X = F_Y \text{ (es decir, misma distribución)} \\ H_1: & \text{no } H_0 \end{array} \right. \]

  • FUNCIÓN: ks.test(x, y)
  • ARGUMENTOS:
    • x: vector con datos de una muestra.
    • y: vector con datos de la otra muestra.
  • DEVUELVE: una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.

6. COMPARACIÓN DE MEDIANAS CON DATOS EMPAREJADOS: signos y Wilcoxon (rangos con signo)

6.1. Contraste de comparación de medianas con DATOS EMPAREJADOS (SIGNOS)

  • MUESTRA: 2 variables, datos ordinales emparejados, o recuento de comparaciones (signos) entre los datos.
  • CONTRASTE:

\[ \left\{ \begin{array}{ll} H_0: & \text{Me}_X = \text{Me}_Y \\ H_1: & \text{Me}_X (\neq, <, >) \text{Me}_Y \end{array} \right. \]

  • FUNCIÓN: binom.test(x, n, p, alternative).
  • ARGUMENTOS:
    • x: recuento de comparaciones + (datos que de la primera a la segunda población aumentan).
    • n: número de parejas de datos.
    • p: dejar por defecto, \(0.5\).
    • alternative: dirección de \(H_1\) (two.sided por defecto para \(\neq\), y atención a less para \(>\) o greater para \(<\)).
  • DEVUELVE: una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.

6.2. Contraste de comparación de medianas con DATOS EMPAREJADOS (RANGOS CON SIGNO)

  • MUESTRA: 2 variables, datos numéricos emparejados, o diferencias numéricas calculadas entre los datos.
  • CONTRASTE:

\[ \left\{ \begin{array}{ll} H_0: & \text{Me}_X = \text{Me}_Y \\ H_1: & \text{Me}_X (\neq, <, >) \text{Me}_Y \end{array} \right. \]

  • FUNCIÓN: wilcox.test(x, y, alternative, paired).
  • ARGUMENTOS:
    • x: datos de 1 muestra, o ya las diferencias (si no se pone nada en y).
    • y: datos de la otra muestra (o nada si van las diferencias en x).
    • paired: poner a TRUE (ya que por defecto está a FALSE).
    • alternative: dirección de \(H_1\) (two.sided por defecto para \(\neq\), y atención a less para \(>\) o greater para \(<\)).
  • DEVUELVE: una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.

7. CONTRASTE COMPARACIÓN MEDIANAS DATOS INDEPENDIENTES (RANGOS CON SIGNO)

\[ \left\{ \begin{array}{ll} H_0: & \text{Me}_X = \text{Me}_Y \\ H_1: & \text{Me}_X (\neq, <, >) \text{Me}_Y \end{array} \right. \]

8. EJERCICIOS EVALUABLES DE CONTRASTES

Se deben contestar respondiendo a lo que se pregunta con palabras relativas al enunciado (prohibido mencionar \(H_0\) o \(H_1\) en las respuestas finales).

El siguiente bloque de código carga el espacio de trabajo mt1021-1415-labo-s1-data.RData. En él están definidas ciertas variables para resolver los ejercicios

load("mt1021-1415-labo-s1-data.RData")

8.1. Simula 50 datos de un dado imperfecto definido por la tabla

  X        1    2    3    4    5    6
  f(X)  0.15 0.13 0.20 0.15 0.17 0.20

y luego contrasta si esa muestra es compatible con un dado perfecto, comentando el resultado, refiriendo al nivel de significación que se pueda utilizar. Usa alguna semilla para la simulación.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.2. Averigua si los datos de la variable ‘x72’ son compatibles con el modelo de Poisson de media 2.5, comentando el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.3. Simula 30 datos del modelo uniforme en el intervalo (0,1) y luego contrasta si esa muestra es compatible con el modelo normal de media 0.5 y varianza 0.25, comentando el resultado, refiriendo al nivel de significación que se pueda utilizar. Usa alguna semilla para la simulación.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.4. Contrasta si los datos de la variable ‘x74’ son compatibles con el modelo normal de media 5 y varianza 1, comentando el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.5. En caso de incompatibilidad en el ejercicio anterior, ¿se podría admitir al menos que los datos de la variable ‘x74’ son compatibles con el modelo normal? Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.6. Sospechando sobre la falta de independencia entre las observaciones sucesivas de una variable aleatoria, se compara cada dato con el anterior, dando lugar a la cadena de signos de la variable ‘x76’. Realiza un contraste que arroje luz sobre este asunto. Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.7. La mediana de la distribución de salarios en España se suponía de 650 EUR. Se sospecha que con la crisis ha disminuido. Se muestrea la población resultando los datos de la variable ‘x77’. Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.8. Contrasta si las distribuciones de usuarios de Windows, Linux y Mac son prácticamente la mismas en los grados A, B, C y D de la UJI. Los datos, para cada grado, vienen en la variables ‘x78A’, ‘x78B’, ‘x78C’ y ‘x78D’ respectivamente. Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.9. Contrasta si se puede asumir o no que los datos de dos grupos de población A y B, muestreados y almacenados en las variables ‘x79A’ y ‘x79B’, siguen la misma distribución de probabilidad o no. Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.10. Un grupo de personas prueba dos versiones de una pizza que la empresa fabricante quiere comercializar (A y B). Para determinar si hay alguna de las dos que es fuertemente preferida sobre la otra, pide que cada uno se pronuncie sobre la que le ha gustado más. Los resultados están en la variable ‘x710’. La pizza A es la que se comercializa actualmente, y la B es una variante para sustituir a la A, si es sensiblemente mejor para el público ¿Qué resulta de la prueba experimental? Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.11. Un grupo de personas prueba dos versiones de una pizza que la empresa fabricante quiere comercializar (A y B). Para determinar si hay alguna de las dos que es fuertemente preferida sobre la otra, pide que cada uno valore su calidad de 0 a 10. Los resultados están en la variable ‘x711’. La pizza A es la que se comercializa actualmente, y la B es una variante para sustituir a la A si es sensiblemente mejor para el público ¿Qué resulta de la prueba experimental? Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

8.12. Un grupo de personas se divide en dos subgrupos, cada uno de los cuales está destinado a probar una versión de pizza que la empresa fabricante quiere comercializar (A y B). Para determinar si hay alguna de las dos que es fuertemente preferida sobre la otra, pide que cada uno valore su calidad de 0 a 10. Los resultados están en las variables ‘x712A’ y ‘x712B’. La pizza A es la que se comercializa actualmente, y la B es una variante para sustituir a la A si es sensiblemente mejor para el público ¿Qué resulta de la prueba experimental? Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.

# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R

Escribe aquí tus comentarios (¡y borra esta frase!)

9. PROGRAMACIÓN EN LENGUAJE R

Algunas estructuras del lenguaje R son:

Definición de funciones:

nombreFuncion = function(arg1, arg2, ...) {
  # cuerpo de la función
}
  • nombreFuncion es el nombre que se quiere poner
  • function es palabra reservada (para definir la función)
  • arg1 es el primer argumento, arg2 es el segundo, ... indica que puede haber más argumentos (se pueden igualar a algo para que tomen valor por defecto)
  • Se pueden definir funciones sin argumentos
  • La función puede no devolver nada
  • Si queremos que devuelva “algo”, se hace con return(valor) donde valor es el objeto que se quiere devolver

Bucles for():

for(contador in vector) {
  # cuerpo del bucle
}
  • contador es un nombre arbitrario
  • in es palabra reservada
  • vector es un vector concreto definido antes (o ahí mismo)
  • Se creará la variable contador que, a cada ciclo del bucle, tomará un valor del vector vector. Ejemplo: for(i in 1:3) { warning("Step ", i, "!!!")}
  • Los bucles son lentos en R. Si puedes, evítalos, usando directamente operaciones con vectores (que son rápidas).

Condicional if()

if(expresion) {
  # parte que se evalua si verdadero
} else {
  # parte que se evalua si falso
}
  • expresion` es un valor lógico (normalmente resultado de una comparación)
  • el bloque de else { } es opcional

Funciones interesantes que se pueden necesitar

  • length(): longitud de un vector (= número de componentes) o de una hoja de datos (= número de columnas, ¡ojo!). Ejemplo: length(1:3)
  • dim(): dimensiones de matrix u hoja de datos (filas, columnas)
  • prod(): multiplica las componentes de su vector argumento. Ejemplo: length(1:3)
  • unique(): devuelve un vector con los valores (sin repetir) que contiene el vector argumento. Ejemplo: unique(c(1,2,3,3,3,2,1,2,1))
  • diff(): calcula las diferencias entre cada componente y la anterior del vector argumento. Ejemplo:diff(c(1,2,3,3,3,2,1,2,1))
  • eval(call("nombreFuncion", argumento)): produce la evaluación de la llamada de la función "nombreFuncion" con el argumento argumento. Ejemplo: eval(call("prod", 1:3)). Importante para manipular funciones como argumento de otras funciones
  • is.numeric(): devuelve TRUE si el vector argumento es de tipo numérico. Ejemplo: is.numeric(1:3), is. numeric(c("a", "b", "c"))
  • warning(): imprime en pantalla un aviso (con el texto del argumento). Ejemplo: warning("La aproximación puede ser insuficiente!")
  • stop(): detiene la ejecución de una función e imprime en pantalla un aviso (con el texto del argumento). Ejemplo: stop("No puedo operar con letras!")

10. EJERCICIOS DE PROGRAMACIÓN EN R SOBRE CONTRASTES

10.1. CONTRASTE DE HIPÓTESIS SIMPLES: Define la función que resuelve el contraste de hipótesis simples \[ \left\{ \begin{array}{ll} H_0: & f_X = f_0 \\ H_1: & f_X = f_1 \end{array} \right. \] que minimiza una combinación lineal de las probabilidades de error tipo I y II. Si la combinación es \(a \cdot \alpha(\delta) + b \cdot \beta(\delta)\), y la muestra es \(\vec{x} = (x_1, x_2, \ldots, x_n)\), entonces el procedimiento óptimo rechaza \(H_0\) si y sólo si \(a \cdot f_0(\vec{x}) - b \cdot f_1(\vec{x}) < 0\).

# Escribe aquí tu solución
# función contrasteHipotSimples()
# argumentos: los que dice el enunciado
# calcular el valor a*f0(muestra) - b*f1(muestra)
# crear una lista con: (1) el valor calculado, y 
# (2) la frase "aceptar H0" o "rechazar H0" según el caso
# devolver la lista

10.2. DE DATOS A SIGNOS: Escribe una función num2signs() que tome un vector de datos numéricos (argumento x) y devuelva un vector de “signos” (con 2 números o caracteres).

# Escribe aquí tu solución

10.3. NÚMERO DE RACHAS: Escribe una función nruns() que, para un vector de datos de dos categorías (argumento x, por ejemplo, de números +1 y -1, o cualquier otra pareja de signos), devuelva el número de rachas existentes en el vector. Recuerda que una racha es una cadena máxima de valores iguales, situados entre valores del otro tipo, o extremos de la muestra (ojo, una racha puede ser un solo signo). Si el vector tiene más de dos categorías, que devuelva un mensaje de error indicando que “el vector tiene más de dos signos!”. Comprueba el funcionamiento con pequeños ejemplos.

# Escribe aquí tu solución

10.3. LA DISTRIBUCIÓN DEL NÚMERO DE RACHAS: Define en R la función de probabilidad de la variable aleatoria \(R\) = “número de rachas”, para un proceso de dos signos, en el que se han observado \(n_1\) signos de un tipo y \(n_2\) signos del otro tipo (ver fórmula en teoría). La función tendrá la forma druns(x, n1, n2), donde n1 y n2 son los argumentos de la cantidad de signos de cada tipo y x puede ser cualquier valor posible de \(R\), de modo que druns() devuelve la probabilidad de cualquier número de rachas posible que se indique en x. Comprueba el funcionamiento con pequeños ejemplos.

La función de probabilidad del “número de rachas” es:

# Escribe aquí tu solución

10.4. Implementa una función que realice el contraste de aleatoriedad (por rachas) para muestras pequeñas, según la estructura que se propone (usará las funciones de los ejercicios anteriores):

runs.test = function(x, type='median') {
# Argumentos:
#   x: vector de datos numéricos o signos
# Devuelve: el número de rachas y su p-valor

# bloque 1: comprobar si `x` son signos o números
# bloque 2: construir cadena de signos (si procede)
# bloque 3: calcular número de rachas
# bloque 4: calcular su p-valor. Si hay más de 20 signos de 
#           cada tipo, usar aprox. normal (busca fórmula en teoría)
#           y si no, la distribución exacta (busca fórmula en teoría)
# Al final:
#   return(list(R=, p.value=))
#     donde `R` es el valor del estadístico y
#     `p.value` su p-valor
}