Processing math: 98%

1. CONTRASTES DE HIPÓTESIS ESTADÍSTICOS NO PARAMÉTRICOS

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, Kolmogorov-Smirnov y Lilliefors
  2. Aleatoriedad
  3. Cuantiles
  4. Homogeneidad: Ji-cuadrado de Pearson y KS
  5. Comparación de dos procesos (por preferencia o valoración mediana)

Recuerda que para tener un nivel de significación a lo sumo α, se debe definir el procedimiento: RECHAZAR H0 si p-valor <α.

1.1. Contrastes de bondad de ajuste

  • Objetivo: Comprobar si un proceso aleatorio “sigue” o “se ajusta” a un presunto modelo o no.
  • Contraste: {H0:X sigue el presunto modelo MH1:no H0
  • Tres casos distintos:
    • Contraste Ji-cuadrado de Pearson: el presunto modelo se expresa como tabla de probabilidades xix1xkpip1pk y la muestra como tabla de frecuencias xix1xknin1nk
      • Se puede aplicar a variable continua si se corta antes en intervalos y se calcula la probabilidad de cada intervalo.
      • En R: función chisq.test(x,p) donde:
        • x: frecuencias de la muestra. Es decir c(n1,n2,...nk).
        • p: probabilidades del modelo. Es decir c(p1,p2,...pk).
        • Devuelve una lista con valores, entre los que destaca el p.value, base para la decisión del contraste.
        • Devuelve un Warning si no se cumplen las condiciones teóricas de buena aproximación de la distribución ji-cuadrado. Hay que informar de ello si ocurre.
    • Contraste de Kolmogorov-Smirnov: el presunto modelo es de variable (numérica) continua y se conoce su función de distribución F0(x)
      • En R: función ks.test(x,y,...) donde:
        • x: muestra de datos
        • y: nombre entrecomillado de la función F0 (tal cual esté programada en R).
        • ...: parámetros que pueda necesitar la función F0 (por ejemplo, mean y sd si se trata de la normal, o rate si se trata de la exponencial, etc.)
        • Devuelve una lista con valores, entre los que destaca el p.value, base para la decisión del contraste.
        • Devuelve un Warning si la muestra contiene datos repetidos. Hay que informar de ello si ocurre.
    • Contraste de Kolmogorov-Smirnov-Lilliefors: el presunto modelo es la familia normal al completo
      • En R: función lillie.test(x) del paquete nortest que hay que instalar y cargar:
        • x: muestra de datos
        • Devuelve una lista con valores, entre los que destaca el p.value, base para la decisión del contraste.
        • Devuelve un Warning si la muestra contiene datos repetidos. Hay que informar de ello si ocurre.

1.2. Contraste de aleatoriedad

  • Objetivo: Comprobar si un proceso de muestreo “produce” datos independientes entre sí o no.
  • Contraste: {H0:X produce datos independientes entre síH1:no H0
  • En R: función runs.test(x) del paquete tseries que hay que instalar y cargar:
    • x: vector de signos (o con dos únicas categorías o números). Hay que fabricarlo a partir de la muestra, bien comparando cada dato con la mediana de todos ellos, o bien comparando cada dato con el anterior (si sube o baja)
    • Devuelve una lista con valores, entre los que destaca el p.value, base para la decisión del contraste.
    • ¡ATENCIÓN!: usa la aproximación normal incluso cuando no se debe (sólo conveniente para muestras con más de 20 signos de cada tipo). Esa comprobación debes hacerla para informar si ocurre ese caso.

1.3. Contraste de cuantiles

  • Objetivo: Comprobar si un proceso aleatorio tiene un cuantil de orden p que sigue siendo un presunto valor x0 o ha cambiado (subido o bajado).
  • Contraste: {H0:Xp=x0H1:Xpx0 (o bien Xp<x0, o bien Xp>x0)
  • En R: función binom.test(x, n, p, alternative):
    • x: cantidad de datos de la muestra inferiores o iguales a x0.
    • n: cantidad total de datos.
    • p: orden del cuantil (por defecto 0.5, para la mediana).
    • alternative: dirección de H1 (two.sided por defecto para , 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.

1.4. Contrastes de homogeneidad (o misma distribución)

  • Objetivo: Comprobar si dos o más procesos “siguen” o “se ajustan” a la misma distribución o ley de probabilidad. Los procesos se muestrean de forma independiente.
  • Contraste: {H0:X1,X2,,XK siguen el mismo modeloH1:no H0
  • Dos casos distintos:
    • Contraste de homogeneidad Ji-cuadrado de Pearson: las muestras se resumen como tablas de frecuencias con las mismas categorías. Se podrían escribir todas juntas como: Muestra \ Categ.xix1x2xkX1n11n12n1kX2n21n22n2kXKnK1nK2nKk
      • En R: función chisq.test(x,p) donde:
        • x: matriz con las frecuencias de las muestras. Es decir matrix(data=n11,n12,...nKk, nrow=K, byrow=TRUE). Recuerda que la función table() puede ayudarte a obtener las frecuencias de cada muestra.
        • y: dejar NULL si xtiene la matriz con las frecuencias de las muestras.
        • Devuelve una lista con valores, entre los que destaca el p.value, base para la decisión del contraste.
        • Devuelve un Warning si no se cumplen las condiciones teóricas de buena aproximación de la distribución ji-cuadrado. Hay que informar de ello si ocurre.
    • Contraste de homogeneidad de Kolmogorov-Smirnov: sólo para 2 muestras de variable (numérica) continua.
      • En R: función ks.test(x, y) donde:
        • x e y: datos de cada muestra.
        • Devuelve una lista con valores, entre los que destaca el p.value, base para la decisión del contraste.
        • Devuelve un Warning si la muestra contiene datos repetidos. Hay que informar de ello si ocurre.

1.5. Contraste de comparación de dos procesos (por preferencia o valoración mediana)

  • Objetivo: valorar si alguno de dos procesos (X e Y) se puede considerar mejor valorado que el otro, o no
  • Contraste: {H0:X e Y se valoran por IGUALH1:Y se valora "DISTINTO", "PEOR" o "MEJOR" que X
  • Según se consigan las muestras de X e Y se puede trabajar con sus datos en tres casos:
    • Preferencia (mejor/peor): cada individuo prueba los dos procesos y solo indica cuál prefiere
      • En R: función binom.test(x, n, p, alternative):
        • x: recuento de preferencias por Y
        • n: tamaño de muestra
        • p: dejar por defecto (0.5)
        • alternative: dejar por defecto (two.sided) si H1 es “Y DISTINTO de X”, cambiar a less si H1 es “Y PEOR que X”, o cambiar a greater si H1 es “Y MEJOR que X”.
        • Devuelve una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.
    • Valoraciones emparejadas: cada individuo prueba los dos procesos y da una valoración numérica de cada uno
      • En R: función wilcox.test(x, y, alternative, paired):
        • x: valoraciones del proceso X, o las restas de “Y menos X” (si no se pone nada en el argumento y).
        • y: valoraciones del proceso Y (o nada si van las diferencias en x).
        • paired: poner a TRUE (ya que por defecto está a FALSE).
        • alternative: dejar por defecto (two.sided) si H1 es “Y DISTINTO de X”, cambiar a less si H1 es “Y PEOR que X”, o cambiar a greater si H1 es “Y MEJOR que X”.
        • Devuelve una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.
    • Valoraciones independientes: cada individuo prueba un proceso y da su valoración numérica
      • En R: función wilcox.test(x, y, alternative, paired):
        • x: valoraciones del proceso X.
        • y: valoraciones del proceso Y.
        • paired: dejar a FALSE (valor por defecto).
        • alternative: dejar por defecto (two.sided) si H1 es “Y DISTINTO de X”, cambiar a less si H1 es “Y PEOR que X”, o cambiar a greater si H1 es “Y MEJOR que X”.
        • Devuelve una lista con valores, entre los que destaca el p.value, base de la decisión del contraste.

2. EJERCICIOS EVALUABLES DE CONTRASTES

Se deben contestar respondiendo a lo que se pregunta con palabras relativas al enunciado (prohibido mencionar H0 o H1 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")

2.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!)

2.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!)

2.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!)

2.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!)

2.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!)

2.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!)

2.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!)

2.8. Contrasta si las distribuciones de usuarios de Windows, Linux y Mac son prácticamente las mismas en los grados A, B, C y D de la UJI. Los datos, para cada grado, vienen en las 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!)

2.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!)

2.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, en la población general, 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!)

2.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, en la población general, 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!)

2.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, en la población general, 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!)

3. INTRODUCCIÓN A LA 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 procesa si expresion==TRUE
} else {
  # parte que se procesa si expresion==FALSE
}
  • 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: prod(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!")

4. EJERCICIOS EVALUABLES DE PROGRAMACIÓN EN R

4.1. Programa las 4 funciones de probabilidad del modelo “Tipy01” de parámetro θ]0,1[ dado por las funciones:

Recuerda llamarlas como es costumbre en R:

# Escribe aquí tus funciones y pruébalas con algunos valores
# dtipy(x=0.5, theta=0.5)
# ptipy(q=0.9, theta=0.1)
# También puedes dibujarlas
# x = seq(from=-1, to=2, by=0.01)
# fx = dtipy(x=x, theta=0.2)
# plot(x=x, y=fx, type='l')

10.2. CONTRASTE DE HIPÓTESIS SIMPLES: Define la función que resuelve el contraste de hipótesis simples {H0:fX=f0H1:fX=f1 que minimiza una combinación lineal de las probabilidades de error tipo I y II. Si la combinación es aα(δ)+bβ(δ), y la muestra es x=(x1,x2,,xn), entonces el procedimiento óptimo rechaza H0 si y sólo si af0(x)bf1(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.4. 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 n1 signos de un tipo y n2 signos del otro tipo. 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.5. 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
}